Dvb wiki script/Script: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
(Version 0.7.0)
(export VIDEO_FORMAT=PAL)
 
(9 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
 
{{Dvbscript navigationsbox}}
 
{{Dvbscript navigationsbox}}
 
'''Bitte die [[Dvb wiki script/Installation|Installationsanleitung]] beachten!'''<br>
 
'''Bitte die [[Dvb wiki script/Installation|Installationsanleitung]] beachten!'''<br>
 
<pre>
 
<pre>
 
 
#!/bin/bash
 
#!/bin/bash
  
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
#Name: dvb_wiki_script
 
+
#Version: 0.9.0
#Name: DVB_Wiki_Buch_Script
+
#Erstellungsdatum: 9.1.2011
#Version: 0.7.0
 
#Erstellungsdatum: 29.8.2008
 
 
#Autor: escho (www.linux-club.de)
 
#Autor: escho (www.linux-club.de)
 
#Benutzung auf eigene Gefahr
 
#Benutzung auf eigene Gefahr
  
 
#Dieses Shell Script automatisiert weitgehend die Vorgänge, die nötig sind, um aus einer DVB-Aufnahme
 
#Dieses Shell Script automatisiert weitgehend die Vorgänge, die nötig sind, um aus einer DVB-Aufnahme
#eine abspielbare Video-DVD zu erzeugen
+
#eine abspielbare Video-DVD zu erzeugen. Es ist nur zusammen mit dem Installationsscript und dem GUI-Script lauffähig.
  
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Funktionen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#
+
#Neu in dieser Version: siehe Diskussion
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Für's Austesten°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
  
stop ()
+
# ---------------------------------Vorbereitungen-------------------------------------
{
 
kdialog --msgbox "Programm unterbrochen"
 
}
 
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Initialisierung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
# Voreinstellungen
  
#-----Basisverzeichnis festlegen beim ersten Scriptaufruf-----
+
hauptverzeichnis=$HOME/dvb_wiki_script
 +
ini_verz=$HOME/.dvb_wiki_script
  
basisverzeichnis_festlegen ()
+
aufnahme=$HOME/DVB/Aufnahme
{
+
druckschablonen=$HOME/DVB/Druckschablonen
echo "*** Festlegen des Basisverzeichnisses ***"
+
videoclips=$HOME/DVB/Videoclips
  
if [ ! -e ~/.dvb_wiki_script_arbeitsverzeichnis.txt ]
+
speed=8
then
+
dvdgroesse=4600000000
hilfsverzeichnis=`kdialog --caption "Name des Arbeitsverzeichnisses" --inputbox ~/ dvb_wiki_script`
 
if [ $? = 0 ]
 
then
 
basisverzeichnis=~/`echo $hilfsverzeichnis | tr -d " "`
 
if [ -e ${basisverzeichnis} ]
 
then
 
kdialog --passivepopup "Verzeichnis existiert schon! Bitte neu wählen" 3
 
basisverzeichnis_festlegen
 
else
 
kdialog --passivepopup "Die Verzeichnisstruktur wird in folgendem Arbeitsverzeichnis erstellt: ${basisverzeichnis}" 3
 
echo ${basisverzeichnis} > ~/.dvb_wiki_script_arbeitsverzeichnis.txt
 
fi
 
 
else
 
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
 
exit
 
fi
 
fi
 
  
echo "*** erledigt" ; echo
+
export VIDEO_FORMAT=PAL
}
 
  
#-----Basisverzeichnis und Arbeitsverzeichnisse anlegen-----
+
# Verzeichnisstruktur erstellen
  
arbeitsverzeichnisse_erstellen ()
+
mkdir $hauptverzeichnis 2>/dev/null
{
+
mkdir $ini_verz 2>/dev/null
basisverzeichnis=`cat ~/.dvb_wiki_script_arbeitsverzeichnis.txt`
 
if [ ! -e ${basisverzeichnis} ] ; then mkdir ${basisverzeichnis} ; fi
 
  
if [ ! -e ${basisverzeichnis}/dvd_aufnahme ] ; then mkdir ${basisverzeichnis}/dvd_aufnahme ; fi
+
mkdir $hauptverzeichnis/dvdstruktur 2>/dev/null
if [ ! -e ${basisverzeichnis}/dvd_tmp ] ; then mkdir ${basisverzeichnis}/dvd_tmp ; fi
+
mkdir $hauptverzeichnis/sicherung 2>/dev/null
if [ ! -e ${basisverzeichnis}/dvd_tmp1 ] ; then mkdir ${basisverzeichnis}/dvd_tmp1 ; fi
+
mkdir $hauptverzeichnis/tmp1 2>/dev/null
if [ ! -e ${basisverzeichnis}/dvd_struktur ] ; then mkdir ${basisverzeichnis}/dvd_struktur ; fi
+
mkdir $hauptverzeichnis/tmp2 2>/dev/null
if [ ! -e ${basisverzeichnis}/dvd_sicherung ] ; then mkdir ${basisverzeichnis}/dvd_sicherung ; fi
 
if [ ! -e ${basisverzeichnis}/dvd_default ] ; then mkdir ${basisverzeichnis}/dvd_default ; fi
 
if [ ! -e ${basisverzeichnis}/dvd_screenshot ] ; then mkdir ${basisverzeichnis}/dvd_screenshot ; fi
 
}
 
  
programmerkennung ()
+
# Hilfsprogramme festlegen
{
 
echo "*** Programmerkennung ***"
 
  
name[0]=mplex
+
hilfsprogramm=( mplex dvdauthor ProjectX.jar normalize ffmpeg growisofs xine requant_lxdvdrip )
name[1]=tcrequant
 
name[2]=dvdauthor
 
name[3]=ProjectX.jar
 
name[4]=normalize
 
name[5]=ffmpeg
 
name[6]=growisofs
 
name[7]=kdialog
 
name[8]=kaffeine
 
  
for ((i=0 ; i<9 ; i++))
+
for var in ${hilfsprogramm[*]}
 
do
 
do
touch $basisverzeichnis/dvd_default/pfad[$i].txt
+
touch $ini_verz/$var
pfad[i]=`cat $basisverzeichnis/dvd_default/pfad[$i].txt`
+
hilfsvar=`cat $ini_verz/$var`
if [ ! -e ${pfad[i]}/${name[i]} ]
+
if [ ! -e "$hilfsvar/$var" ]
 
then
 
then
echo "${name[i]}:      Datei wird gesucht"
+
echo "Programmsuche: $var"
gefundene_pfade=`find /bin /home /opt /usr -type f -name ${name[i]} -printf "%h " 2>/dev/null`
+
gefundene_pfade=`find /bin $HOME /opt /usr ! -path "$HOME/.*" -type f -name $var ! -printf "%h " 2>/dev/null`
pfadanzahl=`echo "$gefundene_pfade" | wc -w`
+
pfadzahl=`echo "$gefundene_pfade" | wc -w`
 +
case "$pfadzahl" in
  
case "$pfadanzahl" in
+
0) kdialog --error "Das Programm wurde nicht gefunden. Bitte zuerst installieren."
0) kdialog --passivepopup "Das Programm wurde nicht gefunden. Bitte installieren." 3
 
 
exit ;;
 
exit ;;
1) echo "${name[i]}:      Datei gefunden" ; echo
+
 
echo $gefundene_pfade > $basisverzeichnis/dvd_default/pfad[$i].txt ;;
+
1) echo "$var gefunden"
*) auswahl_gefundene_pfade=`kdialog --caption "${name[i]}" --combobox "Bitte Pfad auswählen" $gefundene_pfade --default $gefundene_pfade`
+
echo $gefundene_pfade > $ini_verz/$var ;;
 +
 
 +
*) auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade`
 
if [ $? = 0 ]
 
if [ $? = 0 ]
 
then
 
then
echo ${auswahl_gefundene_pfade} > $basisverzeichnis/dvd_default/pfad[$i].txt
+
echo "$var gefunden"
 +
echo $auswahl > $ini_verz/$var
 
else
 
else
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
kdialog --error "Abbruch durch den Benutzer! Installation wird abgebrochen!"
 
exit
 
exit
fi
+
fi ;;
echo "${name[i]}:      Datei gefunden" ; echo ;;
 
 
esac
 
esac
 
fi
 
fi
 
done
 
done
  
echo "*** erledigt" ; echo
+
# Hilfsprogramme laden
}
 
 
 
#-----Variablenzuweisungen zur besseren Lesbarkeit des Scriptes-----
 
  
variablenzuweisungen ()
+
mplex=`cat $ini_verz/mplex`/mplex
{
+
dvdauthor=`cat $ini_verz/dvdauthor`/dvdauthor
mplex=${pfad[0]}/${name[0]}
+
pjx=`cat $ini_verz/ProjectX.jar`/ProjectX.jar
tcrequant=${pfad[1]}/${name[1]}
+
normalize=`cat $ini_verz/normalize`/normalize
dvdauthor=${pfad[2]}/${name[2]}
+
ffmpeg=`cat $ini_verz/ffmpeg`/ffmpeg
pjx=${pfad[3]}/${name[3]}
+
growisofs=`cat $ini_verz/growisofs`/growisofs
normalize=${pfad[4]}/${name[4]}
+
xine=`cat $ini_verz/xine`/xine
ffmpeg=${pfad[5]}/${name[5]}
+
requant=`cat $ini_verz/requant_lxdvdrip`/requant_lxdvdrip
growisofs=${pfad[6]}/${name[6]}
 
kdialog=${pfad[7]}/${name[7]}
 
kaffeine=${pfad[8]}/${name[8]}
 
  
aufnahme_pfad=${basisverzeichnis}/dvd_aufnahme
+
# X.ini erzeugen
tmp_pfad=${basisverzeichnis}/dvd_tmp
 
dvdstruktur_pfad=${basisverzeichnis}/dvd_struktur
 
sicherungs_pfad=${basisverzeichnis}/dvd_sicherung
 
screenshot_pfad=$basisverzeichnis/dvd_screenshot
 
default_pfad=${basisverzeichnis}/dvd_default
 
clip_pfad=~/Videoclips_mp2_ac3
 
}
 
  
#-----Vorbereiten der X.ini's für ProjectX----
+
echo "X.ini für ProjectX erzeugen"
 
 
konfiguration ()
 
{
 
#---X.ini für Filmbearbeitung---
 
 
echo \
 
echo \
 
"# Application
 
"# Application
 
Application.Agreement=1
 
Application.Agreement=1
 
Application.Language=de
 
Application.Language=de
 +
Application.ActiveDirectory=$aufnahme
 +
 +
# CollectionPanel
 +
CollectionPanel.Preview.SliderWidth=0
  
 
# WindowPosition
 
# WindowPosition
WindowPosition.Main.Height=670
+
WindowPosition.Main.Width=9999
WindowPosition.Main.Width=866
 
WindowPosition.Main.X=500
 
 
WindowPosition.Main.Y=0
 
WindowPosition.Main.Y=0
  
 
# OptionPanel
 
# OptionPanel
 
OptionPanel.NormalLog=0
 
OptionPanel.NormalLog=0
OptionPanel.closeOnEnd=1" > ${default_pfad}/X.ini.film
+
OptionPanel.closeOnEnd=1" \
 +
> $hauptverzeichnis/X.ini
  
#---Voreinstellungen---
+
# Playlist für mplayer
brenngeschwindigkeit=8 #maximale Brenngeschwindigkeit
 
maxgroesse=4600000000 #für DVD5
 
}
 
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Verwaltung / Löschen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
find $videoclips/* > $hauptverzeichnis/playlist
  
loeschen_temporaere_arbeitsordner ()
+
# Löschen
{
 
echo "*** Löschen der temporären Arbeitsordner (kann etwas dauern)***"
 
  
rm ${basisverzeichnis}/dvd_tmp/* 2>/dev/null
+
echo "Löschen tmp, kann etwas dauern ..."
rm ${basisverzeichnis}/dvd_tmp1/* 2>/dev/null
+
rm -r -- $hauptverzeichnis/tmp1/* 2>/dev/null
rm -r ${basisverzeichnis}/dvd_struktur/* 2>/dev/null
+
rm -r -- $hauptverzeichnis/tmp2/* 2>/dev/null
rmdir ${basisverzeichnis}/dvd_struktur/* 2>/dev/null
+
rm -r -- $hauptverzeichnis/dvdstruktur/* 2>/dev/null
  
echo "*** erledigt" ; echo
+
# ----------------------------------Funktionen-------------------------------------
}
 
  
loeschen_dvd_sicherung ()
+
# °°°° Abbruch °°°°
{
 
loeschordner="dvd_sicherung"
 
anzeige_was_wird_geloescht
 
wirklich
 
  
rm -r ${basisverzeichnis}/dvd_sicherung/*
+
benutzerabbruch ()
}
 
 
 
loeschen_dvd_screenshot ()
 
 
{
 
{
loeschordner="dvd_screenshot"
+
echo "Abbruch durch den Benutzer"
anzeige_was_wird_geloescht
+
programmende
wirklich
 
 
 
rm $basisverzeichnis/dvd_screenshot/*
 
 
}
 
}
  
basisverzeichnis_aendern ()
+
funktionsabbruch ()
 
{
 
{
kdialog --msgbox "Es wird folgende Datei gelöscht:
+
echo "$1"
 
+
programmende
~/.dvb_wiki_script_arbeitsverzeichnis.txt
 
 
 
Beim nächsten Scriptstart wird sie neu angelegt.
 
Dann muß ein neues Arbeitsverzeichnis gewählt werden
 
"
 
wirklich
 
 
 
rm ~/.dvb_wiki_script_arbeitsverzeichnis.txt
 
 
}
 
}
  
deinstallation ()
+
programmende ()
 
{
 
{
kdialog --msgbox "Es werden folgende Dateien gelöscht:
+
echo "Ende"
 
+
kdialog --msgbox "Programmende"
~/.dvb_wiki_script_arbeitsverzeichnis.txt
+
exit
${basisverzeichnis}
 
 
 
DEINSTALLATION DES SCRIPTS
 
Alle Scriptordner werden gelöscht.
 
Das Aufnahmeverzeichnis wird gelöscht.
 
"
 
wirklich
 
rm ~/.dvb_wiki_script_arbeitsverzeichnis.txt
 
rm -r ${basisverzeichnis}/*
 
rmdir ${basisverzeichnis}
 
 
}
 
}
  
anzeige_was_wird_geloescht ()
+
# °°° Aufgabenmenues °°°
{
 
cd ~/dvb_wiki_script_basisordner/$loeschordner
 
ordnerinhalt=`ls -d1 * `
 
 
 
kdialog --msgbox "$loeschordner enthält folgende Dateien:
 
 
 
$ordnerinhalt"
 
}
 
 
 
 
wirklich ()
 
{
 
kdialog --yesno "??? WIRKLICH LÖSCHEN ???"
 
if [ $? != 0 ]
 
then
 
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
 
exit
 
fi
 
}
 
 
 
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Aufgabenmenues°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
  
 
hauptmenue ()
 
hauptmenue ()
Zeile 259: Zeile 150:
 
2 "TS-Stream" off \
 
2 "TS-Stream" off \
 
3 "Videoclips" off \
 
3 "Videoclips" off \
9 "Verwaltung" off`
+
7 "Abspielen" off \
 +
8 "DVD bedrucken" off`
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
Zeile 277: Zeile 168:
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
Zeile 290: Zeile 180:
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
Zeile 304: Zeile 193:
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
 
+
untermenue_abspielen ()
untermenue_verwaltung ()
 
 
{
 
{
was_tun=`kdialog --caption "Verwaltung" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
+
was_tun=`kdialog --caption "Abspielen" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
91 "Inhalte löschen...... Temporäre Arbeitsordner" on \
+
71 "Videoclip.............Playlist abspielen im Zufallsmodus" on`
92 "Inhalte löschen...... gesicherte Aufnahmen (dvd_sicherung)" off \
 
93 "Inhalte löschen...... Screenshots (dvd_screenshot)" off \
 
94 "Basisverzeichnis..... ändern" off \
 
95 "Deinstallation" off`
 
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Auswahl der Eingangsdateien°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
  
filmauswahl_dvd ()
+
untermenue_direktdruck ()
 
{
 
{
brenn_pfad=${dvdstruktur_pfad}
+
was_tun=`kdialog --caption "Direktdruck" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
filmauswahl
+
81 "DVD bedrucken......Text und Bild (Video-DVD)" on \
 +
82 "DVD bedrucken......nur Text (Daten-DVD)" off`
 +
if [ $? != 0 ]
 +
then
 +
benutzerabbruch
 +
fi
 
}
 
}
  
filmauswahl_ts ()
+
# °°°°Auswahl Quelldateien°°°°
 +
 
 +
filmauswahl ()
 
{
 
{
brenn_pfad=${tmp_pfad}
+
echo "Quelldatei auswählen"
filmauswahl
 
}
 
  
filmauswahl_clip ()
+
case $was_tun in
{
+
11) brenn_pfad=$hauptverzeichnis/dvdstruktur ;;
filmauswahl
+
12) brenn_pfad=$hauptverzeichnis/dvdstruktur ;;
}
+
21) brenn_pfad=$hauptverzeichnis/tmp1 ;;
 +
22) brenn_pfad=$hauptverzeichnis/tmp1 ;;
 +
esac
  
filmauswahl ()
+
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename "$aufnahme"`
{
 
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ${aufnahme_pfad}`
 
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi
 
fi
 
}
 
}
  
verzeichnisauswahl_dvd ()
+
verzeichnisauswahl ()
 
{
 
{
verzeichnistyp="*_dvd"
+
echo "Quelldatei auswählen"
verzeichnisauswahl
+
 
}
+
case $was_tun in
 +
13) verzeichnistyp="*_dvd" ;;
 +
23) verzeichnistyp="*_ts" ;;
 +
esac
  
verzeichnisauswahl_ts ()
+
anzahl_der_sicherungen=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d | wc -l`
{
+
hilfsverzeichnis=`find $hauptverzeichnis/sicherung/$verzeichnistyp -maxdepth 0 -type d`
verzeichnistyp="*_ts"
 
verzeichnisauswahl
 
}
 
  
verzeichnisauswahl ()
 
{
 
anzahl_der_sicherungen=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d | wc -l`
 
hilfsverzeichnis=`find $sicherungs_pfad/$verzeichnistyp -maxdepth 0 -type d`
 
 
case $anzahl_der_sicherungen in
 
case $anzahl_der_sicherungen in
0) kdialog --passivepopup "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." 3
+
0) funktionsabbruch "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." ;;
exit ;;
+
1) echo "$hilfsverzeichnis"
1) kdialog --passivepopup "Folgende Sicherung wird gebrannt: $hilfsverzeichnis" 3
 
 
verzeichnis=$hilfsverzeichnis ;;
 
verzeichnis=$hilfsverzeichnis ;;
 
*) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis`
 
*) verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis`
 
if [ $? != 0 ]
 
if [ $? != 0 ]
 
then
 
then
kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
+
benutzerabbruch
exit
 
 
fi ;;
 
fi ;;
 
esac
 
esac
Zeile 384: Zeile 263:
 
brenn_pfad=$verzeichnis
 
brenn_pfad=$verzeichnis
 
}
 
}
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Eingangsverarbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
  
#-----Schneiden und Demultiplexen-----
+
# °°°°Eingangsverarbeitung°°°°
 +
 
 +
# Schneiden und Demultiplexen
 
pjx_demux_gui ()
 
pjx_demux_gui ()
 
{
 
{
echo "*** DVB mit PJX ***"
+
echo "ProjectX: Schneiden und demultiplexen"
java -jar ${pjx} -demux -gui -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
+
java -jar $pjx -demux -gui -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
echo "*** erledigt" ; echo
 
 
}
 
}
  
#-----Schneiden und Wandeln nach TS-----
+
# Schneiden und Wandeln nach TS
 
pjx_ts_gui ()
 
pjx_ts_gui ()
 
{
 
{
echo "*** TS mit PJX ***"
+
echo "ProjectX: Schneiden und demultiplexen"
java -jar ${pjx} -tots -gui -split 4300 -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
+
java -jar $pjx -tots -gui -split 4300 -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
echo "*** erledigt" ; echo
 
 
}
 
}
  
 
mpeg1_input ()
 
mpeg1_input ()
 
{
 
{
echo "*** mpeg1 demultiplexen ( Video copy, Ton --> wav) ***"
+
echo "ffmpeg: Decodierung Audio"
${ffmpeg} -i "${quelldatei}" ${tmp_pfad}/film.mp2 -vcodec copy ${tmp_pfad}/film.m1v
+
$ffmpeg -i "$quelldatei" $hauptverzeichnis/tmp1/film.mp2 -vcodec copy $hauptverzeichnis/tmp1/film.m1v
echo "*** erledigt" ; echo
 
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Bearbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
# °°°°°Bearbeitung°°°°
  
 
requantisieren ()
 
requantisieren ()
 
{
 
{
videogroesse=`du -bc ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1` #Berechnung des Requantisierungsfaktors
+
audio_video_summe=`du -bc $hauptverzeichnis/tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 $hauptverzeichnis/tmp1/*.m2v | cut -f1 | tail -n 1`
audio_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 | cut -f1 | tail -n 1`
+
if [ $audio_video_summe -ge $dvdgroesse ]
audio_video_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1`
 
requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((maxgroesse-audio_summe))*1.04" | bc`
 
 
 
if [ $audio_video_summe -ge $maxgroesse ] #Wenn der Film zu gross für eine einzige DVD ist, Requantisierung anstossen
 
 
then
 
then
echo "*** Requantisieren ***"
+
kdialog --yesno "Der Film ist zu groß für eine DVD. Requantisieren?"
kdialog --passivepopup "Es wird mit folgendem Faktor requantifiziert: ${requantisierungsfaktor}" 3
+
if [ $? = 0 ]
${tcrequant} -d2 -i ${tmp_pfad}/film.m2v -o ${tmp_pfad}/film.requant -f ${requantisierungsfaktor}
+
then
mv ${tmp_pfad}/film.requant ${tmp_pfad}/film.m2v
+
echo "Requantisieren..."
echo "*** erledigt" ; echo
+
videogroesse=`du -bc $hauptverzeichnis/tmp1/*.m2v | cut -f1 | tail -n 1`
 +
echo "Teil 1"
 +
audio_summe=`du -bc $hauptverzeichnis/tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 | cut -f1 | tail -n 1`
 +
echo "Teil 2"
 +
requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((dvdgroesse-audio_summe))*1.04" | bc`
 +
echo "Teil 3"
 +
cat $hauptverzeichnis/tmp1/film.m2v | requant_lxdvdrip $requantisierungsfaktor $videogroesse > $hauptverzeichnis/tmp1/film.requant
 +
echo "Rückkopieren..."
 +
mv $hauptverzeichnis/tmp1/film.requant $hauptverzeichnis/tmp1/film.m2v
 +
else
 +
programmende
 +
fi
 
fi
 
fi
 
}
 
}
  
#........mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)..........
+
# mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)
 
normalisieren ()
 
normalisieren ()
 
{
 
{
mv ${basisverzeichnis}/dvd_tmp/film.mp2 ${basisverzeichnis}/dvd_tmp1 2>/dev/null
+
mv $hauptverzeichnis/tmp1/film.mp2 $hauptverzeichnis/tmp2
rm ${basisverzeichnis}/dvd_tmp/*.mp2 2>/dev/null
+
rm -- $hauptverzeichnis/tmp1/*.mp2
  
echo "*** Ton decodieren ***"
+
echo "ffmpeg: Ton decodieren"
${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2 ${basisverzeichnis}/dvd_tmp1/film.mp2.wav 2>/dev/null
+
$ffmpeg -i $hauptverzeichnis/tmp2/film.mp2 $hauptverzeichnis/tmp2/film.mp2.wav
  
echo "*** Ton normalisieren ***"
+
echo "normalize: Ton normalisieren"
${normalize} ${basisverzeichnis}/dvd_tmp1/film.mp2.wav
+
$normalize $hauptverzeichnis/tmp2/film.mp2.wav
  
echo "*** Ton encodieren ***"
+
echo "ffmpeg: Ton encodieren"
${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>/dev/null
+
$ffmpeg -i $hauptverzeichnis/tmp2/film.mp2.wav -acodec mp2 -ab 192k $hauptverzeichnis/tmp1/film.mp2
  
rm ${basisverzeichnis}/dvd_tmp1/*
+
rm -- $hauptverzeichnis/tmp2/*
 
 
echo "*** erledigt" ; echo
 
 
}
 
}
  
 
ac3_behalten ()
 
ac3_behalten ()
 
{
 
{
if [ ! -e ${basisverzeichnis}/dvd_tmp/*.ac3 ]
+
if [ ! -e $hauptverzeichnis/tmp1/*.ac3 ]
 
then
 
then
kdialog --passivepopup "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." 3
+
funktionsabbruch "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet."
exit
 
 
fi
 
fi
  
rm ${basisverzeichnis}/dvd_tmp/*.mp2
+
rm -- $hauptverzeichnis/tmp1/*.mp2
 
}
 
}
  
 
mp2_behalten ()
 
mp2_behalten ()
 
{
 
{
if [ ! -e ${basisverzeichnis}/dvd_tmp/*.mp2 ]
+
if [ ! -e $hauptverzeichnis/tmp1/*.mp2 ]
 
then
 
then
kdialog --passivepopup "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." 3
+
funktionsabbruch "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet."
exit
 
 
fi
 
fi
  
rm ${basisverzeichnis}/dvd_tmp/*.ac3
+
rm -- $hauptverzeichnis/tmp1/*.ac3
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Multiplexen, Codieren°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
# °°°°Multiplexen, Codieren°°°°
  
 
multiplexen ()
 
multiplexen ()
 
{
 
{
echo "*** Multiplexen ***"
+
echo "mplex: Multiplexen, kann etwas dauern ..."
echo "***Bearbeitung läuft - kann etwas dauern"
 
 
mpeg1_video=
 
mpeg1_video=
 
mpeg2_video=
 
mpeg2_video=
Zeile 481: Zeile 360:
 
ac3_audio=
 
ac3_audio=
  
mpeg1_video=`find ${tmp_pfad} | grep "m1v"`
+
mpeg1_video=`find $hauptverzeichnis/tmp1 | grep "m1v"`
mpeg2_video=`find ${tmp_pfad} | grep "m2v"`
+
mpeg2_video=`find $hauptverzeichnis/tmp1 | grep "m2v"`
mp2_audio=`find ${tmp_pfad} | grep "mp2"`
+
mp2_audio=`find $hauptverzeichnis/tmp1 | grep "mp2"`
ac3_audio=`find ${tmp_pfad} | grep "ac3"`
+
ac3_audio=`find $hauptverzeichnis/tmp1 | grep "ac3"`
  
${mplex} -v1 -f8 -o ${tmp_pfad}/film.mpg ${mpeg1_video} ${mpeg2_video} ${mp2_audio} ${ac3_audio} 2>/dev/null
+
$mplex -v1 -f8 -o $hauptverzeichnis/tmp1/film.mpg $mpeg1_video $mpeg2_video $ac3_audio $mp2_audio
  
if [ ! -e ${tmp_pfad}/film.mpg ]
+
if [ ! -e $hauptverzeichnis/tmp1/film.mpg ]
 
then
 
then
echo "*** Fehler *** Error ***Fehler ***"
+
funktionsabbruch "Es konnte keine Datei multiplext werden!"
kdialog --error "Es konnte keine Datei multiplext werden!"
 
exit
 
 
fi
 
fi
 
echo "*** erledigt" ; echo
 
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Author'n°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
# °°°°Authorn°°°°
  
 
authoring_ohne_menue ()
 
authoring_ohne_menue ()
 
{
 
{
echo "*** Authoring der DVD ***"
+
echo "dvdauthor: Erzeugen der DVD-Struktur"
${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad}/film.mpg #VOBs und "Kapitel"-IFOs
+
$dvdauthor -o $hauptverzeichnis/dvdstruktur -t $hauptverzeichnis/tmp1/film.mpg #VOBs und "Kapitel"-IFOs
${dvdauthor} -o ${dvdstruktur_pfad} -T #VIDEO_TS.BUP und VIDEO_TS.IFO
+
$dvdauthor -o $hauptverzeichnis/dvdstruktur -T #VIDEO_TS.BUP und VIDEO_TS.IFO
echo "*** erledigt" ; echo
 
}
 
 
 
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Ergebniskontrolle°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
 
 
abspielen ()
 
{
 
echo "*** Abspielen ***"
 
echo
 
echo "*****************************************"
 
echo "***    Screenshot mit Strg + s      ***"
 
echo "***    Weiter    mit Strg + q      ***"
 
echo "*****************************************"
 
echo
 
$kaffeine -nofork --geometry 600x500-0+0 ${brenn_pfad}
 
echo "*** erledigt" ; echo
 
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Brennen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
# °°°°Brennen°°°°
  
 +
# Video-DVD
 
brennen_video_dvd ()
 
brennen_video_dvd ()
 
{
 
{
echo "*** Video-DVD brennen ***"
+
echo "growisofs: Video-DVD brennen"
kdialog --msgbox "Bitte leere DVD einlegen"
+
$growisofs  -dry-run -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad}
+
while [ $? != 0 ]
kdialog --msgbox "Bitte DVD entnehmen"
+
do
echo "*** erledigt" ; echo
+
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"
 +
$growisofs -speed=$speed -dvd-compat -Z /dev/dvd -dvd-video $brenn_pfad
 +
funktionsabbruch "Brennen fertig. Programm beendet"
 
}
 
}
  
 +
# Daten-DVD
 
brennen_ts ()
 
brennen_ts ()
 
{
 
{
echo "*** Daten-DVD brennen ***"
+
echo "growisofs: Daten-DVD brennen"
dvdzahl=`find ${brenn_pfad} -type f | wc -l`
+
dvdzahl=`find $brenn_pfad -type f | wc -l`
kdialog --msgbox "Anzahl der notwendigen DVDs: ${dvdzahl}"
+
echo "Anzahl der notwendigen DVDs: $dvdzahl"
  
for((i=1; i<=${dvdzahl}; i++))
+
for((i=1; i<=$dvdzahl; i++))
 
do
 
do
kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
+
$growisofs -dry-run -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"*
+
while [ $? != 0 ]
kdialog --msgbox "Bitte DVD entnehmen"
+
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"
 +
$growisofs -speed=$speed -Z /dev/dvd -allow-limited-size -R -J $brenn_pfad/"film($((i-1)))[remux].ts"
 
done
 
done
 
+
funktionsabbruch "Brennen fertig. Programm beendet"
kdialog --msgbox "fertig"
 
echo "*** erledigt" ; echo
 
 
}
 
}
  
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Sichern°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
+
#°°°°Sichern°°°°
  
 
sichern_dvd_struktur ()
 
sichern_dvd_struktur ()
 
{
 
{
echo "*** DVD-Struktur sichern ***"
+
echo "Sichern der DVD-Stuktur"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
mkdir ${sicherungs_pfad}/${sicherungsordner}
+
mkdir $hauptverzeichnis/sicherung/$sicherungsordner
mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner}
+
mv $hauptverzeichnis/dvdstruktur/* $hauptverzeichnis/sicherung/$sicherungsordner
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
+
funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet"
echo "*** erledigt" ; echo
 
 
}
 
}
  
 
sichern_ts ()
 
sichern_ts ()
 
{
 
{
echo "*** TS sichern ***"
+
echo "Sichern des TS-File"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
 
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
mkdir ${sicherungs_pfad}/${sicherungsordner}
+
mkdir $hauptverzeichnis/sicherung/$sicherungsordner
mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner}
+
mv $hauptverzeichnis/tmp1/*.ts $hauptverzeichnis/sicherung/$sicherungsordner
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
+
funktionsabbruch "Datei gesichert nach $hauptverzeichnis/sicherung/$sicherungsordner. Programm beendet"
echo "*** erledigt" ; echo
 
 
}
 
}
  
 
sichern_clip ()
 
sichern_clip ()
 
{
 
{
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
+
echo "Speichern des Videoclips"
mv ${tmp_pfad}/film.mpg "${clipspeicher}"
+
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++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
#°°°°Abspielen°°°°
  
#-----Initialisierung-----
+
playlist_abspielen_shuffle ()
 +
{
 +
nohup $xine -P $hauptverzeichnis/playlist -a 1 -l=shuffle &
 +
}
  
basisverzeichnis_festlegen
+
# --------------------------------Hauptprogramm------------------------------------
arbeitsverzeichnisse_erstellen
 
programmerkennung
 
variablenzuweisungen
 
konfiguration
 
loeschen_temporaere_arbeitsordner
 
  
#-----Hauptmenue-----
+
#-----Menueauswahl-----
  
 
hauptmenue
 
hauptmenue
Zeile 597: Zeile 486:
 
2) untermenue_ts ;;
 
2) untermenue_ts ;;
 
3) untermenue_videoclip ;;
 
3) untermenue_videoclip ;;
9) untermenue_verwaltung ;;
+
7) untermenue_abspielen ;;
 +
8) untermenue_direktdruck ;;
 
esac
 
esac
  
#-----untermenue_video_dvd-----
+
# Video-DVD
  
 
case $was_tun in
 
case $was_tun in
  
11) filmauswahl_dvd #Fernsehaufnahme schneiden und als Video-DVD brennen
+
11) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 
requantisieren
 
requantisieren
 
multiplexen
 
multiplexen
 
authoring_ohne_menue
 
authoring_ohne_menue
abspielen
+
brennen_video_dvd
brennen_video_dvd ;;
+
programmende ;;
  
12) filmauswahl_dvd #Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern
+
12) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 
requantisieren
 
requantisieren
 
multiplexen
 
multiplexen
 
authoring_ohne_menue
 
authoring_ohne_menue
abspielen
+
sichern_dvd_struktur
sichern_dvd_struktur ;;
+
programmende ;;
  
13) verzeichnisauswahl_dvd #DVD-Struktur brennen
+
13) verzeichnisauswahl
abspielen
+
brennen_video_dvd
brennen_video_dvd ;;
+
programmende ;;
 
esac
 
esac
  
#-----untermenue_ts-----
+
# Daten-DVD
  
 
case $was_tun in
 
case $was_tun in
  
21) filmauswahl_ts #Fernsehaufnahme schneiden, TS als Daten-DVD brennen
+
21) filmauswahl
 
pjx_ts_gui
 
pjx_ts_gui
brennen_ts ;;
+
brennen_ts
 +
programmende ;;
  
22) filmauswahl_ts #Fernsehaufnahme schneiden, TS und sichern
+
22) filmauswahl
 
pjx_ts_gui
 
pjx_ts_gui
sichern_ts ;;
+
sichern_ts
 +
programmende ;;
  
23) verzeichnisauswahl_ts #gesichertes TS-file als Daten-DVD brennen
+
23) verzeichnisauswahl
brennen_ts ;;
+
brennen_ts
 +
programmende ;;
 
esac
 
esac
  
#-----untermenue_videoclip-----
+
# Videoclips
  
 
case $was_tun in
 
case $was_tun in
  
31) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert + AC3)
+
31) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
normalisieren
 
 
multiplexen
 
multiplexen
sichern_clip ;;
+
sichern_clip
 +
programmende ;;
  
32) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: AC3)
+
32) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 
ac3_behalten
 
ac3_behalten
 
multiplexen
 
multiplexen
sichern_clip ;;
+
sichern_clip
 +
programmende ;;
 +
 
 +
33) filmauswahl
 +
pjx_demux_gui
 +
mp2_behalten
 +
multiplexen
 +
sichern_clip
 +
programmende ;;
 +
 
 +
34) filmauswahl
 +
mpeg1_input
 +
multiplexen
 +
sichern_clip
 +
programmende ;;
  
33) filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert)
+
37) filmauswahl
 
pjx_demux_gui
 
pjx_demux_gui
 
mp2_behalten
 
mp2_behalten
 +
normalisieren
 
multiplexen
 
multiplexen
sichern_clip ;;
+
sichern_clip
 +
programmende ;;
  
34) filmauswahl #Mpeg1-Clip: Schneiden und speichern (Ton: MP2 normalisiert)
+
38) filmauswahl
 
mpeg1_input
 
mpeg1_input
 
normalisieren
 
normalisieren
 
multiplexen
 
multiplexen
sichern_clip ;;
+
sichern_clip
 +
programmende ;;
 
esac
 
esac
  
#-----untermenue_verwaltung-----
+
# Abspielen
  
 
case $was_tun in
 
case $was_tun in
  
91) loeschen_temporaere_arbeitsordner
+
71) playlist_abspielen_shuffle ;;
wirklich ;;
 
92) loeschen_dvd_sicherung ;;
 
93) loeschen_dvd_screenshot ;;
 
94) basisverzeichnis_aendern ;;
 
95) deinstallation ;;
 
 
esac
 
esac
  
kdialog --passivepopup "Bearbeitung beendet." 3
+
# DVD bedrucken
exit
 
 
 
  
 +
case $was_tun in
  
 +
81) oodraw -o $druckschablonen/videodvd.odg ;;
 +
82) oodraw -o $druckschablonen/datendvd.odg ;;
 +
esac
 
</pre>
 
</pre>
  
 
{{Dvbscript navigationsbox}}
 
{{Dvbscript navigationsbox}}
[[Category:Multimedia]]
+
[[Category:DVB-Weiterverarbeitung]]

Aktuelle Version vom 9. Januar 2011, 14:24 Uhr

Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung


Bitte die Installationsanleitung beachten!

#!/bin/bash

#Name: dvb_wiki_script
#Version: 0.9.0
#Erstellungsdatum: 9.1.2011
#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: siehe Diskussion


# ---------------------------------Vorbereitungen-------------------------------------

# Voreinstellungen

hauptverzeichnis=$HOME/dvb_wiki_script
ini_verz=$HOME/.dvb_wiki_script

aufnahme=$HOME/DVB/Aufnahme
druckschablonen=$HOME/DVB/Druckschablonen
videoclips=$HOME/DVB/Videoclips

speed=8
dvdgroesse=4600000000

export VIDEO_FORMAT=PAL

# Verzeichnisstruktur erstellen

mkdir $hauptverzeichnis 2>/dev/null
mkdir $ini_verz 2>/dev/null

mkdir $hauptverzeichnis/dvdstruktur 2>/dev/null
mkdir $hauptverzeichnis/sicherung 2>/dev/null
mkdir $hauptverzeichnis/tmp1 2>/dev/null
mkdir $hauptverzeichnis/tmp2 2>/dev/null

# Hilfsprogramme festlegen

hilfsprogramm=( mplex dvdauthor ProjectX.jar normalize ffmpeg growisofs xine requant_lxdvdrip )

for var in ${hilfsprogramm[*]}
do
	touch $ini_verz/$var
	hilfsvar=`cat $ini_verz/$var`
	if [ ! -e "$hilfsvar/$var" ]
	then
		echo "Programmsuche: $var"
		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"
				echo $gefundene_pfade > $ini_verz/$var ;;

			*)	auswahl=`kdialog --caption "$var" --combobox "Bitte Pfad auswählen" $gefundene_pfade`
				if [ $? = 0 ]
				then
					echo "$var gefunden"
					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
requant=`cat $ini_verz/requant_lxdvdrip`/requant_lxdvdrip

# X.ini erzeugen

echo "X.ini für ProjectX erzeugen"
echo \
"# Application
Application.Agreement=1
Application.Language=de
Application.ActiveDirectory=$aufnahme

# 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 für mplayer

find $videoclips/* > $hauptverzeichnis/playlist

# Löschen

echo "Löschen tmp, kann etwas dauern ..."
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"
programmende
}

funktionsabbruch ()
{
echo "$1"
programmende
}

programmende ()
{
echo "Ende"
kdialog --msgbox "Programmende"
exit
}

# °°° Aufgabenmenues °°°

hauptmenue ()
{
auswahl_hauptmenue=`kdialog --caption "Hauptmenue" --geometry 200x250+500+400 --radiolist "Bitte einen Aufgabenbereich wählen" \
	1	"VIDEO-DVD" on \
	2	"TS-Stream" off \
	3	"Videoclips" off \
	7	"Abspielen" off \
	8	"DVD bedrucken" off`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}

untermenue_video_dvd ()
{
brenn_pfad=${dvdstruktur_pfad}

was_tun=`kdialog --caption "Video_DVD" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
	11	"VIDEO-DVD........Fernsehaufnahme schneiden --> als Video-DVD brennen" on \
	12	"VIDEO-DVD........Fernsehaufnahme schneiden --> DVD-Struktur in Datei sichern" off \
	13	"VIDEO-DVD........Sicherung brennen" off`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}

untermenue_ts ()
{
was_tun=`kdialog --caption "Daten-DVD" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
	21	"TS-Stream..........Fernsehaufnahme schneiden --> TS als Daten-DVD brennen" on \
	22	"TS-Stream..........Fernsehaufnahme schneiden --> TS sichern" off \
	23	"TS-Stream..........Sicherung als Daten-DVD brennen" off`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}

untermenue_videoclip ()
{
was_tun=`kdialog --caption "Videoclips" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
	31	"Videoclip.............Schneiden und speichern (Ton: MP2 normalisiert + AC3)" on \
	32	"Videoclip............ Schneiden und speichern (Ton: AC3)" off \
	33	"Videoclip............ Schneiden und speichern (Ton: MP2 normalisiert)" off \
	34	"Mpeg1-Clip............Schneiden und speichern (Ton: MP2 normalisiert)" off`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}
untermenue_abspielen ()
{
was_tun=`kdialog --caption "Abspielen" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
	71	"Videoclip.............Playlist abspielen im Zufallsmodus" on`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}


untermenue_direktdruck ()
{
was_tun=`kdialog --caption "Direktdruck" --geometry 600x250+400+400 --radiolist "Was also soll genau getan werden?" \
	81	"DVD bedrucken......Text und Bild (Video-DVD)" on \
	82	"DVD bedrucken......nur Text (Daten-DVD)" off`
if [ $? != 0 ]
then
	benutzerabbruch
fi
}

# °°°°Auswahl Quelldateien°°°°

filmauswahl ()
{
echo "Quelldatei auswählen"

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"

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"
		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"
java -jar $pjx -demux -gui -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
}

# Schneiden und Wandeln nach TS
pjx_ts_gui ()
{
echo "ProjectX: Schneiden und demultiplexen"
java -jar $pjx -tots -gui -split 4300 -ini $hauptverzeichnis/X.ini -out $hauptverzeichnis/tmp1 -name film "$quelldatei"
}

mpeg1_input ()
{
echo "ffmpeg: Decodierung Audio"
$ffmpeg -i "$quelldatei" $hauptverzeichnis/tmp1/film.mp2 -vcodec copy $hauptverzeichnis/tmp1/film.m1v
}

# °°°°°Bearbeitung°°°°

requantisieren ()
{
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 --yesno "Der Film ist zu groß für eine DVD. Requantisieren?"
	if [ $? = 0 ]
	then
		echo "Requantisieren..."
		videogroesse=`du -bc $hauptverzeichnis/tmp1/*.m2v | cut -f1 | tail -n 1`
		echo "Teil 1"
		audio_summe=`du -bc $hauptverzeichnis/tmp1/*.ac3 $hauptverzeichnis/tmp1/*.mp2 | cut -f1 | tail -n 1`
		echo "Teil 2"
		requantisierungsfaktor=`echo "scale=8 ; ${videogroesse}/$((dvdgroesse-audio_summe))*1.04" | bc`
		echo "Teil 3"
		cat $hauptverzeichnis/tmp1/film.m2v | requant_lxdvdrip $requantisierungsfaktor $videogroesse > $hauptverzeichnis/tmp1/film.requant
		echo "Rückkopieren..."
		mv $hauptverzeichnis/tmp1/film.requant $hauptverzeichnis/tmp1/film.m2v
	else
		programmende
	fi
fi
}

# mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)
normalisieren ()
{
mv $hauptverzeichnis/tmp1/film.mp2 $hauptverzeichnis/tmp2
rm -- $hauptverzeichnis/tmp1/*.mp2

echo "ffmpeg: Ton decodieren"
$ffmpeg -i $hauptverzeichnis/tmp2/film.mp2 $hauptverzeichnis/tmp2/film.mp2.wav

echo "normalize: Ton normalisieren"
$normalize $hauptverzeichnis/tmp2/film.mp2.wav

echo "ffmpeg: Ton encodieren"
$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 ..."
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"
$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"
$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"
$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"
dvdzahl=`find $brenn_pfad -type f | wc -l`
echo "Anzahl der notwendigen DVDs: $dvdzahl"

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"
	$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"
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"
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"
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"
}

#°°°°Abspielen°°°°

playlist_abspielen_shuffle ()
{
nohup $xine -P $hauptverzeichnis/playlist -a 1 -l=shuffle &
}

# --------------------------------Hauptprogramm------------------------------------

#-----Menueauswahl-----

hauptmenue
case $auswahl_hauptmenue in
	1)	untermenue_video_dvd ;;
	2)	untermenue_ts ;;
	3)	untermenue_videoclip ;;
	7)	untermenue_abspielen ;;
	8)	untermenue_direktdruck ;;
esac

# Video-DVD

case $was_tun in

	11)	filmauswahl
		pjx_demux_gui
		requantisieren
		multiplexen
		authoring_ohne_menue
		brennen_video_dvd
		programmende ;;

	12)	filmauswahl
		pjx_demux_gui
		requantisieren
		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

# Abspielen

case $was_tun in

	71)	playlist_abspielen_shuffle ;;
esac

# DVD bedrucken

case $was_tun in

	81)	oodraw -o $druckschablonen/videodvd.odg ;;
	82)	oodraw -o $druckschablonen/datendvd.odg ;;
esac


Vom DVB zur DVD, ein Wikibuch: Übersicht - Der Weg - Die Helferprogramme - Das Script - Installation - Bedienungsanleitung - Programmieranleitung