Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: premet 04 Února 2010, 15:22:12
-
Zdravím,
Píšu si takovej menší skript na automatický pouštění seriálů na večer a pak následný vypnutí počítače, at to nemusím pořád si klikat a nastavovat, zkrátka sem línej :).
Zasekl jsem se nad tím, jak ve VLC přehrát více souborů, když pustím např. vlc foo1.avi foo2.avi foo3.avi
tak sice v playlistu jsou všechny, ale přehrává se ten první a ty 2 se přeskočí (jsou před ním, je to v obráceném pořadí), čili chci dosáhnout toho, aby se postupně přehrávali foo1.avi, foo2.avi, foo3.avi :).
Pak pro případné zájemce můžu skript umístit i sem pro poznámky, chyby a podobně :).
-
Divný, teď mi to funguje ;D
-
Tak to sem dám, není to ješte dle mojich představ a má to nedostatky, ale mě to zatím asi bude stačit, ale pokud by mi to někdo pomohl vylepšit tak budu rád.
Jak to funguje :
Vyberete složku se seriálem, ze které se potom udělá playlist, buď seřazeně nebo pomíchaně. Poté se spustí VLC přes fullscreen a přehraje vám 3 kousky vašeho seriálu. Následně vymaže z playlistu počet dílů, které si tam nastavíte u proměnné SLEEP, já tam mám 1, protože u prvního hned usnu, pak následuje vypnutí počítače. Při následovném spuštění se pokračuje z vašeho playlistu, dokud nezkouknete celej seriál. Toť vše :)
Nápady a rady uvítám 8)
#!/bin/bash
## Skript na postupné přehrávání celého seriálu a vypnutí počítače po přehrání určitého počtu dílů
## Vytvoření "playlistu"
make_playlist()
{
if [ $2 -eq 0 ]; then
find "$1" -type f | egrep -i ".avi$|.mpg$|.mpeg$|.mkv$|.wmv$|.mp4$" | shuf > playshut.txt
else
find "$1" -type f | egrep -i ".avi$|.mpg$|.mpeg$|.mkv$|.wmv$|.mp4$" | sort -u > playshut.txt
fi
if [ ! -s playshut.txt ]; then
zenity --error --text "Nevybrali jste adresář obsahující video"
choose
fi
sed -i 's/\(.*\)/"\1"/g' playshut.txt
}
## Výběr adresáře a pořadí
choose()
{
if [ ! -e "playshut.txt" ] || [ ! -s "playshut.txt" ]; then
while [ true ]; do
zenity --info --text "Nemáte vybrán seriál nebo již seriál skončil! \nVyberte nový seriál"
PLAYDIR="$(zenity --file-selection --directory)"
if [ -d "$PLAYDIR" ]; then
break
fi
if [ "$PLAYDIR" = "" ]; then
exit 1
fi
done
SHUFFLE=$(zenity --question --text "Chcete nahodné pořadí?"; echo $?)
make_playlist "$PLAYDIR" $SHUFFLE
fi
}
## Spusť výběr
choose
## Upozornění na docházející díly
#case `wc -l playshut.txt | awk '{print $1}'` in
# 0 )
# zenity --warning --text "Zbývá vám poslední 1 díl seriálu!"
# ;;
# 1 )
# zenity --warning --text "Zbývají vám poslední 2 díly seriálu!"
# ;;
# 2 )
# zenity --warning --text "Zbývají vám poslední 3 díly seriálu!"
# ;;
#esac
## Spuštění VLC
TOTAL_COUNT=$((`wc -l playshut.txt | awk '{print $1}'`+1))
COUNT=3
if [ $TOTAL_COUNT -lt $COUNT ]; then
COUNT=$TOTAL_COUNT
fi
PLAY=`sed "1,${COUNT}!d" playshut.txt | tr '\n' ' '`
bash -c "vlc $PLAY --play-and-exit --aspect-ratio 16:9 -f"
## Smazání určitého počtu dílů, podle toho za jak dlouho vytuhnete
SLEEP=3
while [ $SLEEP -ne 0 ]; do
sed -i "${SLEEP}d" playshut.txt
SLEEP=$(($SLEEP-1))
done
## Vypnutí počítače
shutdown -h now
EDIT: V proměnné $COUNT se dá nyní změnit počet přehrávaných dílů :)
-
Předpokládám že to musíš spouštět celé pod rootem, kvůli shutdown...
-
Já jsem si povolil možnost spouštění /sbin/shutdown i pro uživatele :)
Jinak je taky možnost si upravit pro to sudo, aby jsi nemusel zadávat heslo.
-
No vidiš, tuto možnost jsem opomenul :)
Kdyby tedy to mělo ale být použitelné i obecně, využil bych raději D-Bus pro vypínání.
-
Nemám teď na to čas, ale pár drobných poznámek:
egrep -i bude jistější
zenity --warning, že zbývá x dílů s nutností klikat mi přijde otravné, když stejně nemá člověk na výběr - použil bych notify-send, určitě lze doinstalovat i na Fedoře
-
Nemám teď na to čas, ale pár drobných poznámek:
egrep -i bude jistější
zenity --warning, že zbývá x dílů s nutností klikat mi přijde otravné, když stejně nemá člověk na výběr - použil bych notify-send, určitě lze doinstalovat i na Fedoře
Case sensitive mě nenapadlo, dobrá připomínka.
Ty zbývající díly asi dám pryč, ale rád bych vyřešil nějak tu možnost vybrat si, kolik dílů si pustit a pokud by bylo v playlistu míň dílů tak přehrát jen ty co zbývají, na to mrknu zítra :).
-
No a když jsem se konečně dostal k pořádnému počítači, můžu ti poslat odkaz na skript, krerý obsahuje mé řešení stejného problému:
http://forum.ubuntu.cz/index.php/topic,39429.msg315285.html#msg315285 (http://forum.ubuntu.cz/index.php/topic,39429.msg315285.html#msg315285)
Pro lepší orientraci - už při výpisu souborů přes find, přidám ve funkci filter() každému řádku uvozovky a přidám escape znak před případné "`", lidi jsou prasata. (mimochodem, můžeš si všimnout, že jsem zbytečně použil regulární výrazy, místo toho, co jsem radil v tady, holt člověk se furt učí :) Než posílám seznam souborů aplikaci, odstraním pomocí tr konce řádků a nacpu to do jednoho řetězce.
-
K večeru na to mrknu, když tak to sem pak zase dám. Ješte nějak vykoumu to, když si ten seriál pouštíš během dne, aby se ti ty zkouknutý díly vymazaly z playlistu :)
-
GdH:
Snažím se už asi hodinu a půl vykoumat, jak předat určitej počet dílů VLCčku, ale nechápu to.
Příklad: V playlistu mám tohle
/media/Data/Seriály/dr. House/dr. house/01 Pilotni dil.avi
/media/Data/Seriály/dr. House/dr. house/02 - Otazka rodicovstvi.avi
/media/Data/Seriály/dr. House/dr. house/03 - Occamova britva.avi
Když jednotlivý řádky dám do uvozovek, nebo před mezery dám \, VLC mi to z toho skriptu nechce vzít, přitom, když stejnej příkaz zadám do terminálu tak to jde.
Tenhle příkaz se spouštím v tom skriptu
vlc `sed '1!d' playshut.txt` --play-and-exit --aspect-ratio 16:9 -f
a vyexpandovanej vypadá takhle
vlc "/media/Data/Seriály/dr. House/dr. house/01 Pilotni dil.avi" --play-and-exit --aspect-ratio 16:9 -f
ve skriptu mi to hodí tohle, jak kdyby to nevzalo ty uvozovky
VLC media player 1.0.4 Goldeneye
[0x1bd7098] main libvlc: Spouštím vlc s výchozím rozhraním. Použijte 'cvlc' pro spuštění bez rozhraní.
libdvdnav: Using dvdnav version 4.1.4
libdvdread: Encrypted DVD support unavailable.
libdvdread: Can't stat "/media/Data/Seriály/dr.
Adresář nebo soubor neexistuje
libdvdread: Could not open "/media/Data/Seriály/dr.
libdvdnav: vm: failed to open/read the DVD
[0x7f83c000a508] access_file access error: cannot open file "/media/Data/Seriály/dr. (Adresář nebo soubor neexistuje)
[0x7f83dc000c98] main input error: open of `"/media/Data/Seriály/dr.' failed: no suitable access module
libdvdnav: Using dvdnav version 4.1.4
libdvdread: Encrypted DVD support unavailable.
libdvdread: Can't stat House/dr.
Adresář nebo soubor neexistuje
libdvdread: Could not open House/dr.
libdvdnav: vm: failed to open/read the DVD
[0x7f83c00127a8] access_file access error: cannot open file House/dr. (Adresář nebo soubor neexistuje)
[0x7f83dc006658] main input error: open of `House/dr.' failed: no suitable access module
libdvdnav: Using dvdnav version 4.1.4
libdvdread: Encrypted DVD support unavailable.
libdvdread: Can't stat house/01
Adresář nebo soubor neexistuje
libdvdread: Could not open house/01
libdvdnav: vm: failed to open/read the DVD
[0x7f83c000c028] access_file access error: cannot open file house/01 (Adresář nebo soubor neexistuje)
[0x7f83dc007298] main input error: open of `house/01' failed: no suitable access module
libdvdnav: Using dvdnav version 4.1.4
libdvdread: Encrypted DVD support unavailable.
libdvdread: Can't stat Pilotni
Adresář nebo soubor neexistuje
libdvdread: Could not open Pilotni
libdvdnav: vm: failed to open/read the DVD
[0x7f83c0001448] access_file access error: cannot open file Pilotni (Adresář nebo soubor neexistuje)
[0x7f83dc006ea8] main input error: open of `Pilotni' failed: no suitable access module
libdvdnav: Using dvdnav version 4.1.4
libdvdread: Encrypted DVD support unavailable.
libdvdread: Can't stat dil.avi"
Adresář nebo soubor neexistuje
libdvdread: Could not open dil.avi"
libdvdnav: vm: failed to open/read the DVD
[0x7f83c000d7a8] access_file access error: cannot open file dil.avi" (Adresář nebo soubor neexistuje)
[0x7f83dc0079a8] main input error: open of `dil.avi"' failed: no suitable access module
[0x1cf3b28] main playlist: end of playlist, exiting
Když ten stejnej vyexpandovanej příkaz dám přímo do terminálu tak to funguje, asi mi něco uniká nebo nejsem tak moc Bashe znalej :).
-
Takhle bych to pak používal v tom skriptu
## Spuštění VLC
COUNT=3
PLAY=`sed "1,${COUNT}!d" playshut.txt`
vlc $PLAY --play-and-exit --aspect-ratio 16:9 -f
z čehož vyjde
vlc "/media/Data/Seriály/dr. House/dr. house/01 Pilotni dil.avi"
"/media/Data/Seriály/dr. House/dr. house/02 - Otazka rodicovstvi.avi"
"/media/Data/Seriály/dr. House/dr. house/03 - Occamova britva.avi" --play-and-exit --aspect-ratio 16:9 -f
jenže to nefunguje :-\
-
Jo, já si s tím taky lámal hlavu a nechápal to. Ale obešel jsem to, v tom mém odkazovaném skriptu máš řešení ;)
-
Stejně by mě zajímalo, proč to takhle nejde, jinak už to funguje díky :).
EDIT: Aktuální skript je v dříve uvedeném příspěvku :)
-
nefunguje to, protože to neakceptuje newlines ;)
-
nefunguje to, protože to neakceptuje newlines ;)
Tím myslíš přesně co ?
-
A jo ten malej dareba má pravdu ;D
EDIT: Opět změněno 8)