KarstenW.
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Hallo, schreibe gerade an einem Script und verwende dafür zum teil zenity. In Ubuntu 10.04LTS konnte ich ein Script direkt starten ohne die Konsole aufzurufen, was scheinbar ab 12.04 nicht richtig funktioniert. Zwar werden die Zenity Befehle ausgeführt aber alle folgenden Konsolenbefehler nicht mehr richtig abgearbeitet. Wenn ich das Script über die Konsole starte, funktioniert es einwandfrei. Was mache ich falsch? So sieht der Code aus: | zenity --text-info --filename="info.txt"
export url=$(cat config.cnf | head -n3 | tail -n1)
export start=$(cat config.cnf | head -n1 | tail -n1)
export stop=$(cat config.cnf | head -n2 | tail -n1)
export qual=$(cat config.cnf | head -n4 | tail -n1)
file=$(youtube-dl -f $qual -g --playlist-start $start --playlist-end $stop $url)
vlc -f $file
|
Über die Konsole gestartet arbeitet es einwandfrei aber wenn ich direkt ausführen wähle nicht. Vielleicht kann mir jemand auf die Sprünge helfen, oder es ist doch ein Bug. Gruß - Karsten -
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
KarstenW. schrieb: schreibe gerade an einem Script und verwende dafür zum teil zenity. In Ubuntu 10.04LTS konnte ich ein Script direkt starten ohne die Konsole aufzurufen, was scheinbar ab 12.04 nicht richtig funktioniert. Zwar werden die Zenity Befehle ausgeführt aber alle folgenden Konsolenbefehler nicht mehr richtig abgearbeitet.
Was genau bedeutet das?
Wenn ich das Script über die Konsole starte, funktioniert es einwandfrei. Was mache ich falsch? So sieht der Code aus: Über die Konsole gestartet arbeitet es einwandfrei aber wenn ich direkt ausführen wähle nicht. Vielleicht kann mir jemand auf die Sprünge helfen, oder es ist doch ein Bug.
Ohne Fehlermeldungen etc. ist das etwas schwierig. Zunächst aber könnte man Dein Skript etwas verbessern, insbesondere das Quoting der Shell-Variablen. Du musst auch nicht exportieren, denn die Variablen werden ja nur im Skript genutzt. Also: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | # debug
exec 2>/tmp/log
pwd >&2
set -x
# main
zenity --text-info --filename="info.txt"
url=$(sed -ne '3 p' config.cnf)
start=$(sed -ne '1 p' config.cnf)
stop=$(sed -ne '2 p' config.cnf)
qual=$(sed -ne '4 p' config.cnf)
file=$(youtube-dl -f "$qual" -g --playlist-start "$start" --playlist-end "$stop" "$url")
vlc -f "$file"
|
Führ das doch bitte mal aus und poste, was in "/tmp/log" steht. Vielleicht siehst Du ja auch selber schon, woran es liegt. Ciao robert
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
/tmp/log ergab folgendes: + zenity --text-info --filename=info.txt
** (zenity:9763): WARNING **: Cannot open file 'info.txt': Datei oder Verzeichnis nicht gefunden
+ sed -ne 3 p config.cnf
sed: kann config.cnf nicht lesen: Datei oder Verzeichnis nicht gefunden
+ url=
+ sed -ne 1 p config.cnf
sed: kann config.cnf nicht lesen: Datei oder Verzeichnis nicht gefunden
+ start=
+ sed -ne 2 p config.cnf
sed: kann config.cnf nicht lesen: Datei oder Verzeichnis nicht gefunden
+ stop=
+ sed -ne 4 p config.cnf
sed: kann config.cnf nicht lesen: Datei oder Verzeichnis nicht gefunden
+ qual=
+ youtube-dl -f -g --playlist-start --playlist-end
Usage: youtube-dl [options] url [url...]
youtube-dl: error: invalid playlist start number specified
+ file=
+ vlc -f
[0x8803d50] dbus interface: listening on dbus as: org.mpris.MediaPlayer2.vlc
[0x87f1908] main libvlc: VLC wird mit dem Standard-Interface ausgeführt. Benutzen Sie 'cvlc', um VLC ohne Interface zu verwenden.
"sni-qt/9773" WARN 15:21:05.125 void StatusNotifierItemFactory::connectToSnw() Invalid interface to SNW_SERVICE
libdvdnav: Using dvdnav version 4.2.0
libdvdread: Encrypted DVD support unavailable.
************************************************
** **
** No css library available. See **
** /usr/share/doc/libdvdread4/README.css **
** for more information. **
** **
************************************************
libdvdread: Couldn't find device name.
libdvdnav:DVDOpenFilePath:findDVDFile /VIDEO_TS/VIDEO_TS.IFO failed
libdvdnav:DVDOpenFilePath:findDVDFile /VIDEO_TS/VIDEO_TS.BUP failed
libdvdread: Can't open file VIDEO_TS.IFO.
libdvdnav: vm: failed to read VIDEO_TS.IFO
[0xb6f02ff0] main demux error: option sub-original-fps does not exist
[0xb7100618] main input error: no suitable demux module for `file/subtitle:///home/karsten/horror.txt'
[0xb6f03600] main stream error: cannot pre fill buffer
[0xb6f02ff8] main demux error: option sub-original-fps does not exist
[0xb7100618] main input error: no suitable demux module for `file/subtitle:///home/karsten/wlan.txt'
[0x8884cc8] main playlist: stopping playback
[0xb6f168c0] es demux error: cannot peek
[0xb6f19e90] es demux error: cannot peek
[0xb6f19e90] idummy demux: command `nop'
[0xb6f19e90] idummy demux: command `nop'
[0xb6f19e90] idummy demux: command `nop'
[0xb6f19e90] idummy demux: command `nop'
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb71059e0] Could not find codec parameters (Audio: mp1, 0 channels, s16)
[mp3 @ 0xb71059e0] Estimating duration from bitrate, this may be inaccurate
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb71059e0] Could not find codec parameters (Audio: mp2, 0 channels, s16)
[mp3 @ 0xb71059e0] Estimating duration from bitrate, this may be inaccurate
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7122800] Header missing
[mp3 @ 0xb7106020] Could not find codec parameters (Audio: mp1, 0 channels, s16)
[mp3 @ 0xb7106020] Estimating duration from bitrate, this may be inaccurate
MKV/Ebml Parser: m_el[mi_level] == NULL
MKV/Ebml Parser: Up cannot escape itself
gzip: stdout: Broken pipe
MKV/Ebml Parser: m_el[mi_level] == NULL
MKV/Ebml Parser: Up cannot escape itself
MKV/Ebml Parser: m_el[mi_level] == NULL
MKV/Ebml Parser: Up cannot escape itself
[0xb6f15370] idummy demux: command `nop'
[0xb6f15370] idummy demux: command `nop'
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f21220] Header missing
[mp3 @ 0xb6f2c7a0] Could not find codec parameters (Audio: mp1, 0 channels, s16)
[mp3 @ 0xb6f2c7a0] Estimating duration from bitrate, this may be inaccurate
[0xb6f26608] main decoder error: no suitable decoder module for fourcc `undf'. VLC probably does not support this sound or video format.
[0x8884cc8] main playlist: stopping playback
[0xb6f15838] xcb_xv vout display error: no available XVideo adaptor
[0xb6f29b88] es demux error: cannot peek
[0xb6f29b88] playlist demux error: invalid root node <office:document-meta>
[0xb6f29b88] playlist demux error: invalid root node <office:document-settings>
[0xb6f29b88] playlist demux error: invalid root node <office:document-content>
[0xb6f29b88] es demux error: cannot peek
[0xb6f29b88] playlist demux error: invalid root node <office:document-styles>
[0xb6f24b48] main stream error: cannot pre fill buffer
[0xb6f29b88] playlist demux error: invalid root node <manifest:manifest>
[0xb6f29b88] es demux error: cannot peek
[0x8884cc8] main playlist: stopping playback
[0xb1d95e78] es demux error: cannot peek
[0xb1d961d8] playlist demux error: invalid root node <office:document-meta>
[0xb1d961d8] playlist demux error: invalid root node <office:document-settings>
[0xb1d95e78] playlist demux error: invalid root node <office:document-content>
[0xb1d95e78] playlist demux error: invalid root node <office:document-styles>
[0xb6f2f8a8] main stream error: cannot pre fill buffer
[0xb1d95e78] playlist demux error: invalid root node <manifest:manifest>
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d92060] Header missing
[mp3 @ 0xb1d93f00] Could not find codec parameters (Audio: mp2, 0 channels, s16)
[mp3 @ 0xb1d93f00] Estimating duration from bitrate, this may be inaccurate
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb6f7b4a0] Header missing
[mp3 @ 0xb67878e0] Could not find codec parameters (Audio: mp1, 0 channels, s16)
[mp3 @ 0xb67878e0] Estimating duration from bitrate, this may be inaccurate
[0xb6f50aa8] main decoder error: no suitable decoder module for fourcc `undf'. VLC probably does not support this sound or video format.
[0x8884cc8] main playlist: stopping playback
[0xb6f4fcf0] xcb_xv vout display error: no available XVideo adaptor
[0xb6f19e90] es demux error: cannot peek
[0xb6f19e90] playlist demux error: invalid root node <office:document-meta>
[0xb6f19e90] playlist demux error: invalid root node <office:document-settings>
[0xb6f19e90] playlist demux error: invalid root node <office:document-content>
[0xb6f19e90] es demux error: cannot peek
[0xb6f19e90] playlist demux error: invalid root node <office:document-styles>
[0xb6f2bd28] main stream error: cannot pre fill buffer
[0xb6f19e90] playlist demux error: invalid root node <manifest:manifest>
[0xb6f2bd28] ts demux error: cannot peek
[0x8884cc8] main playlist: stopping playback Komisch ist wie gesagt das das Script beim Aufruf in der Konsole einwandfrei arbeitet, aber ohne nicht. Vielleicht kannst Du ja was mit der log Datei anfangen.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
So jetzt habe ich mal am Anfang des Scripts mit cd in den Ordner des Scripts wechseln lassen und es geht. Scheinbar wird beim einfachen starten ausserhalb der Konsole der Pfad nicht mit übergeben, so das die config nicht gefunden wird. Schade ist nur das man so auf einen festen Pfad angewiesen ist, ich würde das Script gerne aus einem beliebigen Ordner starten ohne es vorher ändern zu müssen. Hast Du vielleicht ne Idee wie man das umsetzen kann ?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
KarstenW. schrieb: So jetzt habe ich mal am Anfang des Scripts mit cd in den Ordner des Scripts wechseln lassen und es geht. Scheinbar wird beim einfachen starten ausserhalb der Konsole der Pfad nicht mit übergeben, so das die config nicht gefunden wird.
Deswegen hatte ich ja das pwd eingebaut. Aber davon war keine Ausgabe im Log zu sehen. Wie kommt das? Das hätte vor der zenity-Zeile stehen müssen.
Schade ist nur das man so auf einen festen Pfad angewiesen ist, ich würde das Script gerne aus einem beliebigen Ordner starten ohne es vorher ändern zu müssen. Hast Du vielleicht ne Idee wie man das umsetzen kann ?
Oben im Skript einfügen: | cd $(dirname "$0") || exit
|
Ich würde übrigens die Konfiguration vom Skript trennen. Die Konfiguration gehört eigentlich eher zum Benutzer, während das Skript ja prinzipiell allen Benutzern zur Verfügung stehen könnte. Ciao robert
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
In Verzeichnisse zu wechseln, aus denen heraus Programme gestartet werden müssen, ist eine sehr selten zu sehende, schlechte Praxis. Auf single-user Betriebssystemen sprach nichts dagegen, so etwas zu machen, aber diese Systeme gab es nur eine kurze Zeit unter dem schmucklosen Namen des Schreckens: DOS. ☺ Wenn Dein Programm für mehrere User immer die gleichen Konfigurationsdateien benötigt, dann ist /etc/deinProgramrc ein guter Ort für solche Daten, oder /etc/deinProgram/ falls es viele Dateien braucht. Ergänzend oder alternativ, wenn per User unterschiedliche Konfigurationen genutzt werden sollen (die vielleicht optional die Konfiguration in /etc überschreiben) ist ~/.deinProgramrc oder auch ~/.deinProgram.conf der geeignete Ort. So kann jeder User seine eigene Datei haben, ohne dass sie sich gegenseitig ins Gehege kommen, und ohne dass der einzelne User Hand anlegen muss.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Hallo, das Programm soll ja nicht für jeden User eine eigene Konfiguration haben und auch nicht auf einen festen Ordner festgelegt sein. Beispielsweise sollte es auch funktionieren wenn man es z.B. von einem USB Stick startet. Der Zweck ist einfach eine Playliste von Youtube in einem externen Player abzuspielen. In der Konfiguration werden Parameter wie z.B. Start und Endpunkt der Playliste sowie die Qualität der Videos und die URL der Playliste gespeichert. Das Script holt sich die Parameter aus der Configdatei und verarbeitet diese. Auf dieser Art und Weise ist es z.B. möglich über das Script auf verschiedene Playlisten zuzugreifen, dafür ist noch eine weitere Funktion geplant. Also das Script soll zukünftig bei uns am TV wo wir einen PC angeschlossen haben arbeiten. So kann ich dann z.B. Filme von Netzkino oder Serien von den zahlreichen Anbietern die Playlisten zur Verfügung stellen auf mein TV Gerät streamen. Das Auswählen der jeweiligen Playliste bzw. Configdatei wird dann über eine Dateiauswahl oder eine Abfrage erfolgen. Vielleicht ist der Name Config ein bisschen unglücklich gewählt. Als weiteren Parameter könnte man auch noch den zu verwendenen Player eintragen. Vielleicht sollte ich am Anfang eine Dateiauswahl einbauen so das man das Configfile bzw. die Datei welche die Parameter enthält auswählen muss, dann sollte es auch funktionieren. Vielleicht hat aber noch jemand eine brauchbare Idee. Gruß - Karsten -
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Mein Script sieht jetzt so aus: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | #!/bin/bash
#Startmeldung
zenity --info --width=300 --ok-label=Start --title="Tux-Tube-TV 1.0" --text="Writen by K.Weidenfeld
Bitte wählen Sie nach dem Start die Abspieldatei aus."
#Datei Auswahldialog
ort=$(zenity --file-selection)
#Hauptfunktion
if [ $? = 0 ]; then
url=$(sed -ne '6 p' $ort)
start=$(sed -ne '2 p' $ort)
stop=$(sed -ne '4 p' $ort)
qual=$(sed -ne '8 p' $ort)
file=$(youtube-dl -f $qual -g --playlist-start $start --playlist-end $stop $url)
vlc -f $file
else
exit 1
fi
|
Die Datei aus der die Parameter gelesen werden ist so aufgebaut: #Start (Video) in der Playliste
1
#Ende (Video) in der Playliste
10
#URL der Playliste
http://www.youtube.com/playlist?list=PL5B3A0D99C36180CD&feature=plpp
#Videoqualität
18 Wer das ausprobieren möchte muss natürlich die aktuelle Versio von youtube-dl haben. Diese bekommt man unter:
http://rg3.github.com/youtube-dl/ Gruß - Karsten -
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
KarstenW. schrieb: Mein Script sieht jetzt so aus:
Bitte repariere das Quoting. Nochmal mache ich das nicht. ☺
Die Datei aus der die Parameter gelesen werden ist so aufgebaut: #Start (Video) in der Playliste
1
#Ende (Video) in der Playliste
10
#URL der Playliste
http://www.youtube.com/playlist?list=PL5B3A0D99C36180CD&feature=plpp
#Videoqualität
18
Warum machst Du daraus nicht einfach ein Shell-Skript, das Du dann einliest? Also | url="http://foo"
start="gestern"
stop="morgen"
qual="Q"
|
Und dann im Hauptskript | ort=$(zenity --file-selection)
# Einlesen der Konfig
. "$ort"
if [ -z "$url" -o -z "$start" ... ]; then
echo 'ERROR: not all parameters set.' >&2
exit 1
fi
|
Ciao robert
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
@rklm Das mit den Parametern als Script funktioniert soweit danke für den Hinweis, aber die if Schleife welche prüft ob die Parameter vorhanden sind verstehe ich nicht so ganz. Vielleicht kannst Du mir das kurz erläutern. Werde mich zukünftig bemühen die Quotes zu setzen ☺ irgendwie hat sich das bei mir eingetrichter das man die nur braucht wenn Leerzeichen bei der Eingabe enthalten sind. Gruß - Karsten -
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13216
|
KarstenW. schrieb: Das mit den Parametern als Script funktioniert soweit danke für den Hinweis, aber die if Schleife welche prüft ob die Parameter vorhanden sind verstehe ich nicht so ganz. Vielleicht kannst Du mir das kurz erläutern.
Vielleicht liegt es daran, dass es keine Schleife ist. ☺ Es wird einfach geschaut, ob eine der Variablen leer ist. Dann gibt's einen Fehler und das Skript terminiert mit Exit-Status != 0. Schau mal in die Manpage der bash oder dash . Da wirst Du die Erläuterung zu [ bzw. test finden.
Werde mich zukünftig bemühen die Quotes zu setzen ☺ irgendwie hat sich das bei mir eingetrichter das man die nur braucht wenn Leerzeichen bei der Eingabe enthalten sind.
Man braucht die immer, wenn Leerzeichen (oder andere Sonderzeichen) enthalten sein können. In diesem Fall braucht man die in der Abfrage auf Gültigkeit der Variablenwerte weil eine leere Variable zu einem ungültigen Ausdruck führen kann: | $ x=1
$ test -z $x && echo leer
$ x=
$ test -z $x && echo leer
leer
$ x='1 -a'
$ test -z $x && echo leer
bash: test: 1: binary operator expected
$ test -z "$x" && echo leer
|
Falls Dateinamen in Variablen sind, sollte man immer damit rechnen, dass sie Leerzeichen enthalten - selbst, wenn das auf Unix-Systemen selten ist. Wenn es dann aber mal passiert, können Skripte seltsame Dinge tun. Ciao robert
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Das Script arbeitet jetzt fehlerfrei, danke für die Hilfe. Die Parameter werden jetzt aus einem Shell Script gelesen und wenn Variablen fehlen wird eine Fehlermeldung ausgegeben. Zusätzlich habe ich noch eine Möglichkeit eingebaut Informationen über einen Film oder Kanal aus dem Internet laden und anzeigen zu lassen. Dafür dient der Parameter infourl der aber nicht zwingend notwendig ist. Wer es ausprobieren möchte ein Hinweis, damit das Script fehlerfrei arbeitet muss die youtube-dl in der aktuellen Version vorhanden sein und zenity in der Version 3.4.0 Hier das fertige Script: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/bash
ort=$(zenity --file-selection)
. "$ort"
if [ -z "$url" -o -z "$start" -o -z "$stop" -o -z "$qual" ]; then
zenity --error --width=300 --height=100 --text="Es fehlen notwendige Parameter oder die Abspieldatei, das Programm wird beendet." >&2
exit 1
fi
zenity --text-info --title="YOUTUBE-On-Demand V.1.0" --width=1068 --height=600 --ok-label=Start --html --url="$infourl"
if [ $? = 0 ]; then
file=$(youtube-dl -f "$qual" -g --playlist-start "$start" --playlist-end "$stop" "$url")
"$player" --fullscreen "$file"
else
exit 1
fi
|
und hier eine Datei aus der die Parameter geholt werden: | url="http://www.youtube.com/playlist?list=PL5B3A0D99C36180CD&feature=plcp"
start="1"
stop="1"
qual="18"
player="totem"
infourl="http://www.moviemaze.de/filme/3030/the-answer-man.html"
|
Über ein Feedback oder konstruktive Vorschläge wie man das Script weiter ausbauen und verbessern könnte, würd ich mich freuen. Gruß -Karsten-
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
Du kannst mit Defaultwerten arbeiten, falls keine Parameter gegeben sind (bei der Url vielleicht nicht):
| if [ -z "$url" ]; then
echo 'ERROR: not all parameters set.' >&2
exit 1
fi
echo url $url von ${erstes:=1} bis ${letztes:=1} qual ${qual:=8}
|
start="1"
stop="1"
qual="18"
Ganzzahlen zu kapseln ist Quatsch.
|
KarstenW.
(Themenstarter)
Anmeldungsdatum: 27. Juni 2011
Beiträge: 208
|
Der einzigste Wert der für einen Defaultwert geignet wäre, das wäre der Qualiwert. Start und Stop Werte sind von der URL abhängig und für die URL wäre ein Defaultwert auch nicht sinnvoll. Grundsätzlich aber eine gute Idee die ich vielleicht irgendwie sinnvoll umsetzen kann. Danke für Dein Post. Gruß - Karsten -
|