Dvb script gui/scriptcode
Diese Beschreibung wurde mit folgenden Distributionen getestet: |
OpenSuse 11.0 (32Bit) mit KDE 3.9.x |
Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |
#!/bin/bash #Name: dvb_script_gui_arbeitsscript #Version: 0.3.0 #Erstellungsdatum: 24.2.2009 #Autor: escho (www.linux-club.de) #Benutzung auf eigene Gefahr #Dieses Shell Script automatisiert weitgehend die Vorgänge, die nötig sind, um aus einer DVB-Aufnahme #eine abspielbare Video-DVD zu erzeugen. Es ist nur zusammen mit dem Installationsscript und dem GUI-Script lauffähig. #Neu in dieser Version: #Neue Funktion: Playlist abspielen # ---------------------------------Vorbereitungen------------------------------------- # Übernahme von Kommander was_tun=`echo @Self.item(0)` # Voreinstellungen hauptverzeichnis=~/dvbscript ini_verz=~/.dvbscript aufnahme=~/DVB/Aufnahme druckschablonen=~/DVB/Druckschablonen videoclips=~/DVB/Videoclips speed=8 dvdgroesse=4600000000 # Verzeichnisstruktur erstellen mkdir $hauptverzeichnis 2>/dev/null mkdir $ini_verz 2>/dev/null mkdir $hauptverzeichnis/dvdstruktur 2>/dev/null mkdir $hauptverzeichnis/screenshots 2>/dev/null mkdir $hauptverzeichnis/sicherung 2>/dev/null mkdir $hauptverzeichnis/tmp1 2>/dev/null mkdir $hauptverzeichnis/tmp2 2>/dev/null # Pfade für Kommmander echo $hauptverzeichnis > $ini_verz/hauptverzeichnis echo $hauptverzeichnis/fenster_fortschritt > $ini_verz/fortschrittfenster echo $hauptverzeichnis/fenster_debug > $ini_verz/debugfenster # Anzeigefenster leeren echo "" > $hauptverzeichnis/fenster_fortschritt echo "" > $hauptverzeichnis/fenster_debug # Umleitung für Debug-Fenster exec 2> $hauptverzeichnis/fenster_debug # Hilfsprogramme festlegen hilfsprogramm=( mplex dvdauthor ProjectX.jar normalize ffmpeg growisofs xine ) for var in ${hilfsprogramm[*]} do touch $ini_verz/$var hilfsvar=`cat $ini_verz/$var` if [ ! -e "$hilfsvar/$var" ] then echo "Programmsuche: $var" >> $hauptverzeichnis/fenster_fortschritt gefundene_pfade=`find /bin $HOME /opt /usr ! -path "$HOME/.*" -type f -name $var ! -printf "%h " 2>/dev/null` pfadzahl=`echo "$gefundene_pfade" | wc -w` case "$pfadzahl" in 0) kdialog --error "Das Programm wurde nicht gefunden. Bitte zuerst installieren." exit ;; 1) echo "$var gefunden" >> $hauptverzeichnis/fenster_fortschritt echo $gefundene_pfade > $ini_verz/$var ;; *) auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade` if [ $? = 0 ] then echo "$var gefunden" >> $hauptverzeichnis/fenster_fortschritt echo $auswahl > $ini_verz/$var else kdialog --error "Abbruch durch den Benutzer! Installation wird abgebrochen!" exit fi ;; esac fi done # Hilfsprogramme laden mplex=`cat $ini_verz/mplex`/mplex dvdauthor=`cat $ini_verz/dvdauthor`/dvdauthor pjx=`cat $ini_verz/ProjectX.jar`/ProjectX.jar normalize=`cat $ini_verz/normalize`/normalize ffmpeg=`cat $ini_verz/ffmpeg`/ffmpeg growisofs=`cat $ini_verz/growisofs`/growisofs xine=`cat $ini_verz/xine`/xine # X.ini erzeugen echo "X.ini für ProjectX erzeugen" echo \ "# Application Application.Agreement=1 Application.Language=de Application.ActiveDirectory=$hauptverzeichnis/screenshots # CollectionPanel CollectionPanel.Preview.SliderWidth=0 # WindowPosition WindowPosition.Main.Width=9999 WindowPosition.Main.Y=0 # OptionPanel OptionPanel.NormalLog=0 OptionPanel.closeOnEnd=1" \ > $hauptverzeichnis/X.ini # Playlist find $videoclips/* > $hauptverzeichnis/playlist echo "$xine -P $hauptverzeichnis/playlist -a 1 -l=shuffle" > $hauptverzeichnis/playlist_starten # Löschen echo "Löschen tmp, kann etwas dauern ..." > $hauptverzeichnis/fenster_fortschritt rm -r -- $hauptverzeichnis/tmp1/* 2>/dev/null rm -r -- $hauptverzeichnis/tmp2/* 2>/dev/null rm -r -- $hauptverzeichnis/dvdstruktur/* 2>/dev/null # ----------------------------------Funktionen------------------------------------- # °°°° Abbruch °°°° benutzerabbruch () { echo "Abbruch durch den Benutzer" >> $hauptverzeichnis/fenster_fortschritt programmende } funktionsabbruch () { echo "$1" >> $hauptverzeichnis/fenster_fortschritt programmende } programmende () { echo "Ende" >> $hauptverzeichnis/fenster_fortschritt kdialog --yesno "Programm beendet. Fensterinhalte löschen?" if [ $? = 0 ] then echo "" > $hauptverzeichnis/fenster_fortschritt echo "" > $hauptverzeichnis/fenster_debug fi exit } # °°°°Auswahl Quelldateien°°°° filmauswahl () { echo "Quelldatei auswählen" >> $hauptverzeichnis/fenster_fortschritt case $was_tun in 11) brenn_pfad=$hauptverzeichnis/dvdstruktur ;; 12) brenn_pfad=$hauptverzeichnis/dvdstruktur ;; 21) brenn_pfad=$hauptverzeichnis/tmp1 ;; 22) brenn_pfad=$hauptverzeichnis/tmp1 ;; esac quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename "$aufnahme"` if [ $? != 0 ] then benutzerabbruch fi } verzeichnisauswahl () { echo "Quelldatei auswählen" >> $hauptverzeichnis/fenster_fortschritt case $was_tun in 13) verzeichnistyp="*_dvd" ;; 23) verzeichnistyp="*_ts" ;; esac anzahl_der_sicherungen=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d | wc -l` hilfsverzeichnis=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d` case $anzahl_der_sicherungen in 0) funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;; 1) echo "$hilfsverzeichnis" >> $hauptverzeichnis/fenster_fortschritt verzeichnis=$hilfsverzeichnis ;; *) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` if [ $? != 0 ] then benutzerabbruch fi ;; esac brenn_pfad=$verzeichnis } # °°°°Eingangsverarbeitung°°°° # Schneiden und Demultiplexen pjx_demux_gui () { echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt java -jar $pjx -demux -gui -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei" audio_video_summe=`du -bc $hauptverzeichnis/tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 $hauptverzeichnis/tmp1/*.m2v | cut -f1 | tail -n 1` if [ $audio_video_summe -ge $dvdgroesse ] then kdialog --error "Das Bearbeitungsergebnis wird zu groß für eine DVD" programmende fi } # Schneiden und Wandeln nach TS pjx_ts_gui () { echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt java -jar $pjx -tots -gui -split 4300 -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei" } mpeg1_input () { echo "ffmpeg: Decodierung Audio" >> $hauptverzeichnis/fenster_fortschritt $ffmpeg -i "$quelldatei" $hauptverzeichnis/tmp1/film.mp2 -vcodec copy $hauptverzeichnis/tmp1/film.m1v } # °°°°°Bearbeitung°°°° # mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs) normalisieren () { mv $hauptverzeichnis/tmp1/film.mp2 $hauptverzeichnis/tmp2 rm -- $hauptverzeichnis/tmp1/*.mp2 echo "ffmpeg: Ton decodieren" >> $hauptverzeichnis/fenster_fortschritt $ffmpeg -i $hauptverzeichnis/tmp2/film.mp2 $hauptverzeichnis/tmp2/film.mp2.wav echo "normalize: Ton normalisieren" >> $hauptverzeichnis/fenster_fortschritt $normalize $hauptverzeichnis/tmp2/film.mp2.wav echo "ffmpeg: Ton encodieren" >> $hauptverzeichnis/fenster_fortschritt $ffmpeg -i $hauptverzeichnis/tmp2/film.mp2.wav -acodec mp2 -ab 192k $hauptverzeichnis/tmp1/film.mp2 rm -- $hauptverzeichnis/tmp2/* } ac3_behalten () { if [ ! -e $hauptverzeichnis/tmp1/*.ac3 ] then funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." fi rm -- $hauptverzeichnis/tmp1/*.mp2 } mp2_behalten () { if [ ! -e $hauptverzeichnis/tmp1/*.mp2 ] then funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." fi rm -- $hauptverzeichnis/tmp1/*.ac3 } # °°°°Multiplexen, Codieren°°°° multiplexen () { echo "mplex: Multiplexen, kann etwas dauern ..." >> $hauptverzeichnis/fenster_fortschritt mpeg1_video= mpeg2_video= mp2_audio= ac3_audio= mpeg1_video=`find $hauptverzeichnis/tmp1 | grep "m1v"` mpeg2_video=`find $hauptverzeichnis/tmp1 | grep "m2v"` mp2_audio=`find $hauptverzeichnis/tmp1 | grep "mp2"` ac3_audio=`find $hauptverzeichnis/tmp1 | grep "ac3"` $mplex -v1 -f8 -o $hauptverzeichnis/tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio if [ ! -e $hauptverzeichnis/tmp1/film.mpg ] then funktionsabbruch "Es konnte keine Datei multiplext werden!" fi } # °°°°Authorn°°°° authoring_ohne_menue () { echo "dvdauthor: Erzeugen der DVD-Struktur" >> $hauptverzeichnis/fenster_fortschritt $dvdauthor -o $hauptverzeichnis/dvdstruktur -t $hauptverzeichnis/tmp1/film.mpg #VOBs und "Kapitel"-IFOs $dvdauthor -o $hauptverzeichnis/dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO } # °°°°Brennen°°°° # Video-DVD brennen_video_dvd () { echo "growisofs: Video-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt $growisofs -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad while [ $? != 0 ] do kdialog --warningcontinuecancel "DVD nicht bereit" if [ $? != 0 ] then benutzerabbruch fi $growisofs -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad done echo "Brennen beginnt" >> $hauptverzeichnis/fenster_fortschritt $growisofs -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad funktionsabbruch "Brennen fertig. Programm beendet" } # Daten-DVD brennen_ts () { echo "growisofs: Daten-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt dvdzahl=`find $brenn_pfad -type f | wc -l` echo "Anzahl der notwendigen DVDs: $dvdzahl" >> $hauptverzeichnis/fenster_fortschritt for((i=1; i<=$dvdzahl; i++)) do $growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" while [ $? != 0 ] do kdialog --warningcontinuecancel "Bitte DVD Nr.: $i einlegen" if [ $? != 0 ] then benutzerabbruch fi $growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" done echo "Brennvorgang gestartet" >> $hauptverzeichnis/fenster_fortschritt $growisofs -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts" done funktionsabbruch "Brennen fertig. Programm beendet" } #°°°°Sichern°°°° sichern_dvd_struktur () { echo "Sichern der DVD-Stuktur" >> $hauptverzeichnis/fenster_fortschritt sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" mkdir $hauptverzeichnis/sicherung/$sicherungsordner mv $hauptverzeichnis/dvdstruktur/* $hauptverzeichnis/sicherung/$sicherungsordner funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet" } sichern_ts () { echo "Sichern des TS-File" >> $hauptverzeichnis/fenster_fortschritt sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" mkdir $hauptverzeichnis/sicherung/$sicherungsordner mv $hauptverzeichnis/tmp1/*.ts $hauptverzeichnis/sicherung/$sicherungsordner funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet" } sichern_clip () { echo "Speichern des Videoclips" >> $hauptverzeichnis/fenster_fortschritt clipspeicher=`kdialog --title "$quelldatei" --getsavefilename $videoclips` if [ $? != 0 ] then benutzerabbruch fi if [ -e "$clipspeicher" ] then kdialog --yesno "Dieser Clip ist schon gespeichert. Überschreiben?" if [ $? != 0 ] then sichern_clip fi fi mv $hauptverzeichnis/tmp1/film.mpg "$clipspeicher" funktionsabbruch "Videoclip gespeichert: $clipspeicher" } # --------------------------------Hauptprogramm------------------------------------ # Video-DVD case $was_tun in 11) filmauswahl pjx_demux_gui multiplexen authoring_ohne_menue brennen_video_dvd programmende ;; 12) filmauswahl pjx_demux_gui multiplexen authoring_ohne_menue sichern_dvd_struktur programmende ;; 13) verzeichnisauswahl brennen_video_dvd programmende ;; esac # Daten-DVD case $was_tun in 21) filmauswahl pjx_ts_gui brennen_ts programmende ;; 22) filmauswahl pjx_ts_gui sichern_ts programmende ;; 23) verzeichnisauswahl brennen_ts programmende ;; esac # Videoclips case $was_tun in 31) filmauswahl pjx_demux_gui multiplexen sichern_clip programmende ;; 32) filmauswahl pjx_demux_gui ac3_behalten multiplexen sichern_clip programmende ;; 33) filmauswahl pjx_demux_gui mp2_behalten multiplexen sichern_clip programmende ;; 34) filmauswahl mpeg1_input multiplexen sichern_clip programmende ;; 37) filmauswahl pjx_demux_gui mp2_behalten normalisieren multiplexen sichern_clip programmende ;; 38) filmauswahl mpeg1_input normalisieren multiplexen sichern_clip programmende ;; esac # DVD bedrucken case $was_tun in 81) oodraw -o $druckschablonen/videodvd.odg echo "" > $hauptverzeichnis/fenster_fortschritt ;; 82) oodraw -o $druckschablonen/datendvd.odg echo "" > $hauptverzeichnis/fenster_fortschritt ;; esac
Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |