Dvb script gui/scriptcode: Unterschied zwischen den Versionen
Escho (Diskussion | Beiträge) (Fehler in Funktion normalisieren () beseitigt) |
Escho (Diskussion | Beiträge) (Version 0.1.0) |
||
Zeile 8: | Zeile 8: | ||
<pre> | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
− | |||
− | |||
− | |||
#Name: dvb_script_gui_arbeitsscript | #Name: dvb_script_gui_arbeitsscript | ||
− | #Version: 0.0 | + | #Version: 0.1.0 |
− | #Erstellungsdatum: | + | #Erstellungsdatum: 2.1.2009 |
#Autor: escho (www.linux-club.de) | #Autor: escho (www.linux-club.de) | ||
#Benutzung auf eigene Gefahr | #Benutzung auf eigene Gefahr | ||
Zeile 22: | Zeile 19: | ||
#Neu in dieser Version: | #Neu in dieser Version: | ||
− | # | + | #Anpassung an die neue GUI, Codevereinfachung, neue Verzeichnisstruktur, Integration in ein Script-Widget der GUI |
− | # | + | # ---------------------------------Vorbereitungen------------------------------------- |
− | # | + | # Übernahme von Kommander |
− | + | was_tun=`echo @Self.item(0)` | |
− | + | ||
− | if [ ! - | + | # Voreinstellungen |
+ | |||
+ | aufnahme=~/Aufnahme | ||
+ | druckschablonen=~/Druckschablonen | ||
+ | videoclips=~/Videoclips | ||
+ | |||
+ | speed=8 | ||
+ | dvdgroesse=4600000000 | ||
+ | |||
+ | # Hauptverzeichnis festlegen | ||
+ | |||
+ | mkdir ~/.dvb_script_kommander | ||
+ | |||
+ | if [ ! -e ~/.dvb_script_kommander/hauptverzeichnis ] | ||
then | then | ||
− | kdialog --error " | + | auswahl=`kdialog --caption "Name des Hauptverzeichnisses eingeben" --inputbox ~/ dvb_script_kommander` |
− | exit | + | if [ $? = 0 ] |
+ | then | ||
+ | hauptverzeichnis=~/`echo $auswahl | tr -d " *~."` | ||
+ | if [ -e ${hauptverzeichnis} ] | ||
+ | then | ||
+ | kdialog --error "$hauptverzeichnis existiert schon!" | ||
+ | exit | ||
+ | fi | ||
+ | echo ${hauptverzeichnis} > ~/.dvb_script_kommander/hauptverzeichnis | ||
+ | else | ||
+ | kdialog --error "Abbruch durch den Benutzer!" | ||
+ | exit | ||
+ | fi | ||
+ | mkdir ${hauptverzeichnis} | ||
fi | fi | ||
− | |||
− | + | hauptverzeichnis=`cat ~/.dvb_script_kommander/hauptverzeichnis` | |
− | + | ||
− | + | # Verzeichnisstruktur erstellen | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 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 | |
− | # | + | # Anzeigefenster leeren und einstellen |
− | + | echo "" > $hauptverzeichnis/fenster_fortschritt | |
− | + | echo "" > $hauptverzeichnis/fenster_debug | |
− | + | exec 2> $hauptverzeichnis/fenster_debug | |
− | |||
− | |||
− | |||
− | + | # Hilfsprogramme festlegen | |
− | |||
− | |||
− | |||
− | + | hilfsprogramm=( mplex tcrequant dvdauthor ProjectX.jar normalize ffmpeg growisofs ) | |
− | |||
− | |||
− | |||
− | + | for var in ${hilfsprogramm[*]} | |
+ | do | ||
+ | touch ~/.dvb_script_kommander/$var | ||
+ | hilfsvar=`cat ~/.dvb_script_kommander/$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 $gefundene_pfade > ~/.dvb_script_kommander/$var ;; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | *) auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade` | |
− | + | if [ $? = 0 ] | |
− | + | then | |
− | + | echo ${auswahl} > ~/.dvb_script_kommander/$var | |
− | kdialog -- | + | else |
− | + | kdialog --error "Abbruch durch den Benutzer! Installation wird abgebrochen!" | |
− | + | exit | |
− | + | fi ;; | |
+ | esac | ||
+ | fi | ||
+ | done | ||
+ | # Hilfsprogramme laden | ||
− | + | mplex=`cat ~/.dvb_script_kommander/mplex`/mplex | |
− | + | tcrequant=`cat ~/.dvb_script_kommander/tcrequant`/tcrequant | |
− | + | dvdauthor=`cat ~/.dvb_script_kommander/dvdauthor`/dvdauthor | |
+ | pjx=`cat ~/.dvb_script_kommander/ProjectX.jar`/ProjectX.jar | ||
+ | normalize=`cat ~/.dvb_script_kommander/normalize`/normalize | ||
+ | ffmpeg=`cat ~/.dvb_script_kommander/ffmpeg`/ffmpeg | ||
+ | growisofs=`cat ~/.dvb_script_kommander/growisofs`/growisofs | ||
− | + | # X.ini erzeugen | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | echo "X.ini für ProjectX erzeugen" | |
− | + | echo \ | |
− | + | "# Application | |
− | + | Application.Agreement=1 | |
− | + | Application.Language=de | |
− | + | Application.ActiveDirectory=$hauptverzeichnis/screenshots | |
− | |||
− | |||
− | + | # WindowPosition | |
− | + | WindowPosition.Main.Width=9999 | |
− | + | WindowPosition.Main.Y=0 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | # OptionPanel | |
+ | OptionPanel.NormalLog=0 | ||
+ | OptionPanel.closeOnEnd=1" \ | ||
+ | > $hauptverzeichnis/X.ini | ||
− | + | # Playlist für mplayer | |
− | |||
− | |||
− | + | find $videoclips/* > ~/.mplayer/playlist | |
− | |||
− | + | # 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 "" >> $hauptverzeichnis/fenster_fortschritt | |
− | + | echo "Abbruch durch den Benutzer" >> $hauptverzeichnis/fenster_fortschritt | |
+ | programmende | ||
} | } | ||
− | + | funktionsabbruch () | |
{ | { | ||
− | + | echo "" >> $hauptverzeichnis/fenster_fortschritt | |
− | + | echo "$1" >> $hauptverzeichnis/fenster_fortschritt | |
+ | programmende | ||
} | } | ||
− | + | programmende () | |
{ | { | ||
− | + | echo "" >> $hauptverzeichnis/fenster_fortschritt | |
+ | echo "Ende" >> $hauptverzeichnis/fenster_fortschritt | ||
+ | kdialog --passivepopup "Programmende" 1000 | ||
+ | echo "" > $hauptverzeichnis/fenster_fortschritt | ||
+ | echo "" > $hauptverzeichnis/fenster_debug | ||
+ | exit | ||
} | } | ||
+ | |||
+ | # °°°°Auswahl Quelldateien°°°° | ||
filmauswahl () | filmauswahl () | ||
{ | { | ||
− | + | echo "Quelldatei auswählen" >> $hauptverzeichnis/fenster_fortschritt | |
− | quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename "${ | + | |
+ | 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 ] | if [ $? != 0 ] | ||
then | then | ||
Zeile 187: | Zeile 195: | ||
} | } | ||
− | + | verzeichnisauswahl () | |
{ | { | ||
− | verzeichnistyp="*_dvd" | + | 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` | |
− | verzeichnistyp | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
case $anzahl_der_sicherungen in | case $anzahl_der_sicherungen in | ||
0) funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;; | 0) funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;; | ||
− | 1) | + | 1) echo "$hilfsverzeichnis" >> $hauptverzeichnis/fenster_fortschritt |
verzeichnis=$hilfsverzeichnis ;; | verzeichnis=$hilfsverzeichnis ;; | ||
*) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` | *) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis` | ||
Zeile 214: | Zeile 217: | ||
fi ;; | fi ;; | ||
esac | esac | ||
+ | |||
brenn_pfad=$verzeichnis | brenn_pfad=$verzeichnis | ||
} | } | ||
− | |||
− | # | + | # °°°°Eingangsverarbeitung°°°° |
+ | |||
+ | # Schneiden und Demultiplexen | ||
pjx_demux_gui () | pjx_demux_gui () | ||
{ | { | ||
− | + | echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt | |
− | java -jar ${pjx} -demux -gui -ini $ | + | 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 () | pjx_ts_gui () | ||
{ | { | ||
− | + | echo "ProjectX: Schneiden und demultiplexen" >> $hauptverzeichnis/fenster_fortschritt | |
− | java -jar ${pjx} -tots -gui -split 4300 -ini $ | + | java -jar ${pjx} -tots -gui -split 4300 -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei" |
} | } | ||
mpeg1_input () | mpeg1_input () | ||
{ | { | ||
− | + | echo "ffmpeg: Decodierung Audio" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${ffmpeg} -i "${quelldatei}" $ | + | ${ffmpeg} -i "${quelldatei}" $hauptverzeichnis/tmp1/film.mp2 -vcodec copy $hauptverzeichnis/tmp1/film.m1v |
} | } | ||
− | # | + | # °°°°°Bearbeitung°°°° |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | # | + | # mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs) |
normalisieren () | normalisieren () | ||
{ | { | ||
− | mv $ | + | mv $hauptverzeichnis/tmp1/film.mp2 $hauptverzeichnis/tmp2 |
− | rm -- ${hauptverzeichnis} | + | rm -- ${hauptverzeichnis}/tmp1/*.mp2 |
− | + | echo "ffmpeg: Ton decodieren" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${ffmpeg} -i $ | + | ${ffmpeg} -i $hauptverzeichnis/tmp2/film.mp2 $hauptverzeichnis/tmp2/film.mp2.wav |
− | + | echo "normalize: Ton normalisieren" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${normalize} $ | + | ${normalize} $hauptverzeichnis/tmp2/film.mp2.wav |
− | + | echo "ffmpeg: Ton encodieren" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${ffmpeg} -i $ | + | ${ffmpeg} -i $hauptverzeichnis/tmp2/film.mp2.wav -acodec mp2 -ab 192k $hauptverzeichnis/tmp1/film.mp2 |
− | rm -- ${hauptverzeichnis} | + | rm -- ${hauptverzeichnis}/tmp2/* |
} | } | ||
ac3_behalten () | ac3_behalten () | ||
{ | { | ||
− | if [ ! -e ${hauptverzeichnis} | + | if [ ! -e ${hauptverzeichnis}/tmp1/*.ac3 ] |
then | then | ||
funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." | funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." | ||
fi | fi | ||
− | rm -- ${hauptverzeichnis} | + | rm -- ${hauptverzeichnis}/tmp1/*.mp2 |
} | } | ||
mp2_behalten () | mp2_behalten () | ||
{ | { | ||
− | if [ ! -e ${hauptverzeichnis} | + | if [ ! -e ${hauptverzeichnis}/tmp1/*.mp2 ] |
then | then | ||
funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." | funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." | ||
fi | fi | ||
− | rm -- ${hauptverzeichnis} | + | rm -- ${hauptverzeichnis}/tmp1/*.ac3 |
} | } | ||
− | # | + | # °°°°Multiplexen, Codieren°°°° |
multiplexen () | multiplexen () | ||
{ | { | ||
− | + | echo "mplex: Multiplexen, kann etwas dauern ..." >> $hauptverzeichnis/fenster_fortschritt | |
mpeg1_video= | mpeg1_video= | ||
mpeg2_video= | mpeg2_video= | ||
Zeile 303: | Zeile 299: | ||
ac3_audio= | ac3_audio= | ||
− | mpeg1_video=`find $ | + | mpeg1_video=`find $hauptverzeichnis/tmp1 | grep "m1v"` |
− | mpeg2_video=`find $ | + | mpeg2_video=`find $hauptverzeichnis/tmp1 | grep "m2v"` |
− | mp2_audio=`find $ | + | mp2_audio=`find $hauptverzeichnis/tmp1 | grep "mp2"` |
− | ac3_audio=`find $ | + | ac3_audio=`find $hauptverzeichnis/tmp1 | grep "ac3"` |
− | ${mplex} -v1 -f8 -o $ | + | ${mplex} -v1 -f8 -o $hauptverzeichnis/tmp1/film.mpg ${mpeg1_video} ${mpeg2_video} ${ac3_audio} ${mp2_audio} |
− | if [ ! -e $ | + | if [ ! -e $hauptverzeichnis/tmp1/film.mpg ] |
then | then | ||
funktionsabbruch "Es konnte keine Datei multiplext werden!" | funktionsabbruch "Es konnte keine Datei multiplext werden!" | ||
Zeile 316: | Zeile 312: | ||
} | } | ||
− | # | + | # °°°°Author'n°°°° |
authoring_ohne_menue () | authoring_ohne_menue () | ||
{ | { | ||
− | + | echo "dvdauthor: Erzeugen der DVD-Struktur" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${dvdauthor} -o $ | + | ${dvdauthor} -o $hauptverzeichnis/dvdstruktur -t $hauptverzeichnis/tmp1/film.mpg #VOBs und "Kapitel"-IFOs |
− | ${dvdauthor} -o $ | + | ${dvdauthor} -o $hauptverzeichnis/dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO |
} | } | ||
− | # | + | # °°°°Brennen°°°° |
− | + | # Video-DVD | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | # | ||
− | |||
− | |||
brennen_video_dvd () | brennen_video_dvd () | ||
{ | { | ||
− | + | echo "growisofs: Video-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt | |
video_dvd_bereit | video_dvd_bereit | ||
− | + | echo "Brennen beginnt" >> $hauptverzeichnis/fenster_fortschritt | |
− | ${growisofs} -speed=${ | + | ${growisofs} -speed=${speed} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} |
funktionsabbruch "Brennen fertig. Programm beendet" | funktionsabbruch "Brennen fertig. Programm beendet" | ||
} | } | ||
Zeile 348: | Zeile 335: | ||
video_dvd_bereit () | video_dvd_bereit () | ||
{ | { | ||
− | ${growisofs} -dry-run -speed=${ | + | ${growisofs} -dry-run -speed=${speed} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} |
if [ $? = 0 ] | if [ $? = 0 ] | ||
then | then | ||
Zeile 363: | Zeile 350: | ||
} | } | ||
− | # | + | # Daten-DVD |
brennen_ts () | brennen_ts () | ||
{ | { | ||
− | + | echo "growisofs: Daten-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt | |
dvdzahl=`find ${brenn_pfad} -type f | wc -l` | dvdzahl=`find ${brenn_pfad} -type f | wc -l` | ||
− | + | echo "" >> $hauptverzeichnis/fenster_fortschritt | |
− | + | echo "Anzahl der notwendigen DVDs: ${dvdzahl}" >> $hauptverzeichnis/fenster_fortschritt | |
for((i=1; i<=${dvdzahl}; i++)) | for((i=1; i<=${dvdzahl}; i++)) | ||
Zeile 386: | Zeile 373: | ||
fenster1_mehr "" | fenster1_mehr "" | ||
fenster1_mehr "Brennvorgang gestartet" | fenster1_mehr "Brennvorgang gestartet" | ||
− | ${growisofs} -speed=${ | + | ${growisofs} -speed=${speed} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts" |
else | else | ||
benutzerabbruch | benutzerabbruch | ||
Zeile 394: | Zeile 381: | ||
daten_dvd_bereit () | daten_dvd_bereit () | ||
{ | { | ||
− | ${growisofs} -dry-run -speed=${ | + | ${growisofs} -dry-run -speed=${speed} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts" |
if [ $? = 0 ] | if [ $? = 0 ] | ||
then | then | ||
Zeile 409: | Zeile 396: | ||
} | } | ||
− | # | + | #°°°°Sichern°°°° |
sichern_dvd_struktur () | sichern_dvd_struktur () | ||
{ | { | ||
− | + | echo "Sichern der DVD-Stuktur" >> $hauptverzeichnis/fenster_fortschritt | |
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" | sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd" | ||
− | mkdir $ | + | mkdir $hauptverzeichnis/sicherung/${sicherungsordner} |
− | mv $ | + | mv $hauptverzeichnis/dvdstruktur/* $hauptverzeichnis/sicherung/${sicherungsordner} |
− | funktionsabbruch "Datei gesichert nach $ | + | funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/${sicherungsordner}. Programm beendet" |
} | } | ||
sichern_ts () | sichern_ts () | ||
{ | { | ||
− | + | echo "Sichern des TS-File" >> $hauptverzeichnis/fenster_fortschritt | |
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" | sicherungsordner="$(date +%Y%m%d%H%M%S)_ts" | ||
− | mkdir $ | + | mkdir $hauptverzeichnis/sicherung/${sicherungsordner} |
− | mv $ | + | mv $hauptverzeichnis/tmp1/*.ts $hauptverzeichnis/sicherung/${sicherungsordner} |
− | funktionsabbruch "Datei gesichert nach $ | + | funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/${sicherungsordner}. Programm beendet" |
} | } | ||
sichern_clip () | sichern_clip () | ||
{ | { | ||
− | + | echo "Speichern des Videoclips" >> $hauptverzeichnis/fenster_fortschritt | |
− | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${ | + | clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${videoclips}` |
if [ $? != 0 ] | if [ $? != 0 ] | ||
then | then | ||
Zeile 441: | Zeile 428: | ||
then | then | ||
kdialog --yesno "Dieser Clip ist schon gespeichert. Überschreiben?" | kdialog --yesno "Dieser Clip ist schon gespeichert. Überschreiben?" | ||
− | if [ $? = 0 ] | + | if [ $? != 0 ] |
then | then | ||
− | + | sichern_clip | |
fi | fi | ||
− | |||
fi | fi | ||
− | |||
− | |||
− | + | mv $hauptverzeichnis/tmp1/film.mpg "${clipspeicher}" | |
− | |||
− | mv $ | ||
− | |||
funktionsabbruch "Videoclip gespeichert: ${clipspeicher}" | funktionsabbruch "Videoclip gespeichert: ${clipspeicher}" | ||
} | } | ||
− | |||
− | #----- | + | # --------------------------------Hauptprogramm------------------------------------ |
− | |||
− | |||
− | + | # Video-DVD | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | #- | ||
case $was_tun in | case $was_tun in | ||
− | 11) | + | 11) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
− | |||
multiplexen | multiplexen | ||
authoring_ohne_menue | authoring_ohne_menue | ||
− | |||
brennen_video_dvd | brennen_video_dvd | ||
programmende ;; | programmende ;; | ||
− | 12) | + | 12) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
− | |||
multiplexen | multiplexen | ||
authoring_ohne_menue | authoring_ohne_menue | ||
Zeile 490: | Zeile 458: | ||
programmende ;; | programmende ;; | ||
− | 13) | + | 13) verzeichnisauswahl |
− | |||
brennen_video_dvd | brennen_video_dvd | ||
programmende ;; | programmende ;; | ||
esac | esac | ||
− | #- | + | # Daten-DVD |
case $was_tun in | case $was_tun in | ||
− | 21) | + | 21) filmauswahl |
pjx_ts_gui | pjx_ts_gui | ||
brennen_ts | brennen_ts | ||
programmende ;; | programmende ;; | ||
− | 22) | + | 22) filmauswahl |
pjx_ts_gui | pjx_ts_gui | ||
sichern_ts | sichern_ts | ||
programmende ;; | programmende ;; | ||
− | 23) | + | 23) verzeichnisauswahl |
brennen_ts | brennen_ts | ||
programmende ;; | programmende ;; | ||
esac | esac | ||
− | # | + | # Videoclips |
case $was_tun in | case $was_tun in | ||
− | 31) | + | 31) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
multiplexen | multiplexen | ||
Zeile 525: | Zeile 492: | ||
programmende ;; | programmende ;; | ||
− | 32) | + | 32) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
ac3_behalten | ac3_behalten | ||
Zeile 532: | Zeile 499: | ||
programmende ;; | programmende ;; | ||
− | 33) | + | 33) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
Zeile 545: | Zeile 512: | ||
programmende ;; | programmende ;; | ||
− | 37) | + | 37) filmauswahl |
pjx_demux_gui | pjx_demux_gui | ||
mp2_behalten | mp2_behalten | ||
Zeile 559: | Zeile 526: | ||
sichern_clip | sichern_clip | ||
programmende ;; | programmende ;; | ||
− | |||
esac | esac | ||
− | # | + | # DVD bedrucken |
case $was_tun in | case $was_tun in | ||
− | 81) oodraw -o $ | + | 81) oodraw -o $druckschablonen/videodvd.odg ;; |
− | 82) oodraw -o $ | + | 82) oodraw -o $druckschablonen/datendvd.odg ;; |
esac | esac | ||
+ | |||
+ | |||
</pre> | </pre> |
Version vom 3. Januar 2009, 19:15 Uhr
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.1.0 #Erstellungsdatum: 2.1.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: #Anpassung an die neue GUI, Codevereinfachung, neue Verzeichnisstruktur, Integration in ein Script-Widget der GUI # ---------------------------------Vorbereitungen------------------------------------- # Übernahme von Kommander was_tun=`echo @Self.item(0)` # Voreinstellungen aufnahme=~/Aufnahme druckschablonen=~/Druckschablonen videoclips=~/Videoclips speed=8 dvdgroesse=4600000000 # Hauptverzeichnis festlegen mkdir ~/.dvb_script_kommander if [ ! -e ~/.dvb_script_kommander/hauptverzeichnis ] then auswahl=`kdialog --caption "Name des Hauptverzeichnisses eingeben" --inputbox ~/ dvb_script_kommander` if [ $? = 0 ] then hauptverzeichnis=~/`echo $auswahl | tr -d " *~."` if [ -e ${hauptverzeichnis} ] then kdialog --error "$hauptverzeichnis existiert schon!" exit fi echo ${hauptverzeichnis} > ~/.dvb_script_kommander/hauptverzeichnis else kdialog --error "Abbruch durch den Benutzer!" exit fi mkdir ${hauptverzeichnis} fi hauptverzeichnis=`cat ~/.dvb_script_kommander/hauptverzeichnis` # Verzeichnisstruktur erstellen 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 # Anzeigefenster leeren und einstellen echo "" > $hauptverzeichnis/fenster_fortschritt echo "" > $hauptverzeichnis/fenster_debug exec 2> $hauptverzeichnis/fenster_debug # Hilfsprogramme festlegen hilfsprogramm=( mplex tcrequant dvdauthor ProjectX.jar normalize ffmpeg growisofs ) for var in ${hilfsprogramm[*]} do touch ~/.dvb_script_kommander/$var hilfsvar=`cat ~/.dvb_script_kommander/$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 $gefundene_pfade > ~/.dvb_script_kommander/$var ;; *) auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade` if [ $? = 0 ] then echo ${auswahl} > ~/.dvb_script_kommander/$var else kdialog --error "Abbruch durch den Benutzer! Installation wird abgebrochen!" exit fi ;; esac fi done # Hilfsprogramme laden mplex=`cat ~/.dvb_script_kommander/mplex`/mplex tcrequant=`cat ~/.dvb_script_kommander/tcrequant`/tcrequant dvdauthor=`cat ~/.dvb_script_kommander/dvdauthor`/dvdauthor pjx=`cat ~/.dvb_script_kommander/ProjectX.jar`/ProjectX.jar normalize=`cat ~/.dvb_script_kommander/normalize`/normalize ffmpeg=`cat ~/.dvb_script_kommander/ffmpeg`/ffmpeg growisofs=`cat ~/.dvb_script_kommander/growisofs`/growisofs # X.ini erzeugen echo "X.ini für ProjectX erzeugen" echo \ "# Application Application.Agreement=1 Application.Language=de Application.ActiveDirectory=$hauptverzeichnis/screenshots # WindowPosition WindowPosition.Main.Width=9999 WindowPosition.Main.Y=0 # OptionPanel OptionPanel.NormalLog=0 OptionPanel.closeOnEnd=1" \ > $hauptverzeichnis/X.ini # Playlist für mplayer find $videoclips/* > ~/.mplayer/playlist # 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 "" >> $hauptverzeichnis/fenster_fortschritt echo "Abbruch durch den Benutzer" >> $hauptverzeichnis/fenster_fortschritt programmende } funktionsabbruch () { echo "" >> $hauptverzeichnis/fenster_fortschritt echo "$1" >> $hauptverzeichnis/fenster_fortschritt programmende } programmende () { echo "" >> $hauptverzeichnis/fenster_fortschritt echo "Ende" >> $hauptverzeichnis/fenster_fortschritt kdialog --passivepopup "Programmende" 1000 echo "" > $hauptverzeichnis/fenster_fortschritt echo "" > $hauptverzeichnis/fenster_debug 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 } # °°°°Author'n°°°° 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 video_dvd_bereit echo "Brennen beginnt" >> $hauptverzeichnis/fenster_fortschritt ${growisofs} -speed=${speed} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} funktionsabbruch "Brennen fertig. Programm beendet" } video_dvd_bereit () { ${growisofs} -dry-run -speed=${speed} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} if [ $? = 0 ] then return else kdialog --warningcontinuecancel "DVD nicht bereit" if [ $? = 0 ] then video_dvd_bereit else benutzerabbruch fi fi } # Daten-DVD brennen_ts () { echo "growisofs: Daten-DVD brennen" >> $hauptverzeichnis/fenster_fortschritt dvdzahl=`find ${brenn_pfad} -type f | wc -l` echo "" >> $hauptverzeichnis/fenster_fortschritt echo "Anzahl der notwendigen DVDs: ${dvdzahl}" >> $hauptverzeichnis/fenster_fortschritt for((i=1; i<=${dvdzahl}; i++)) do loop_brennen_ts done funktionsabbruch "Brennen fertig. Programm beendet" } loop_brennen_ts () { daten_dvd_bereit kdialog --msgbox "Bitte DVD Nr.: $i einlegen" if [ $? = 0 ] then fenster1_mehr "" fenster1_mehr "Brennvorgang gestartet" ${growisofs} -speed=${speed} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts" else benutzerabbruch fi } daten_dvd_bereit () { ${growisofs} -dry-run -speed=${speed} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))[remux].ts" if [ $? = 0 ] then return else kdialog --warningcontinuecancel "DVD nicht bereit" if [ $? = 0 ] then loop_brennen_ts else benutzerabbruch fi fi } #°°°°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 ;; 82) oodraw -o $druckschablonen/datendvd.odg ;; esac
Vom DVB zur DVD, die GUI: Anleitungen - Installation - GUI-Kommanderscript - Arbeitsscript - Dokumentation |