Dvb wiki script/Script

Aus Linupedia.org
Version vom 19. August 2008, 19:11 Uhr von Escho (Diskussion | Beiträge) (überarbeitet für Script-Version 0.6.0)
Wechseln zu: Navigation, Suche


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


Bitte die Installationsanleitung beachten!


#!/bin/bash

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++BESCHREIBUNG ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#Name: DVB_Wiki_Buch_Script
#Version: 0.6.0
#Erstellungsdatum: 18.8.2008
#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

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Funktionen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Für's Austesten°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

stop ()
{
kdialog --msgbox "Programm unterbrochen"
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Initialisierung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

#-----Basisverzeichnis festlegen beim ersten Scriptaufruf-----

basisverzeichnis_festlegen ()
{
echo "*** Festlegen des Basisverzeichnisses ***"

if [ ! -e ~/.dvb_wiki_script_arbeitsverzeichnis.txt ]
then
	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
}

#-----Basisverzeichnis und Arbeitsverzeichnisse anlegen-----

arbeitsverzeichnisse_erstellen ()
{
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
if [ ! -e ${basisverzeichnis}/dvd_tmp ] ; then mkdir ${basisverzeichnis}/dvd_tmp ; fi
if [ ! -e ${basisverzeichnis}/dvd_tmp1 ] ; then mkdir ${basisverzeichnis}/dvd_tmp1 ; fi
if [ ! -e ${basisverzeichnis}/dvd_struktur ] ; then mkdir ${basisverzeichnis}/dvd_struktur ; fi
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 ()
{
echo "*** Programmerkennung ***"

name[0]=mplex
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++))
do
	touch $basisverzeichnis/dvd_default/pfad[$i].txt
	pfad[i]=`cat $basisverzeichnis/dvd_default/pfad[$i].txt`
	if [ ! -e ${pfad[i]}/${name[i]} ]
	then
		echo "${name[i]}:      Datei wird gesucht"
		gefundene_pfade=`find /bin /home /opt /usr -type f -name ${name[i]} -printf "%h " 2>/dev/null`
		pfadanzahl=`echo "$gefundene_pfade" | wc -w`

		case "$pfadanzahl" in
			0)	kdialog --passivepopup "Das Programm wurde nicht gefunden. Bitte installieren." 3
				exit ;;
			1)	echo "${name[i]}:      Datei gefunden" ; echo
				echo $gefundene_pfade > $basisverzeichnis/dvd_default/pfad[$i].txt ;;
			*)	auswahl_gefundene_pfade=`kdialog --caption "${name[i]}" --combobox "Bitte Pfad auswählen" $gefundene_pfade --default $gefundene_pfade`
				if [ $? = 0 ]
				then
					echo ${auswahl_gefundene_pfade} > $basisverzeichnis/dvd_default/pfad[$i].txt
				else
					kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
					exit
				fi
				echo "${name[i]}:      Datei gefunden" ; echo ;;
		esac
	fi
done

echo "*** erledigt" ; echo
}

#-----Variablenzuweisungen zur besseren Lesbarkeit des Scriptes-----

variablenzuweisungen ()
{
mplex=${pfad[0]}/${name[0]}
tcrequant=${pfad[1]}/${name[1]}
dvdauthor=${pfad[2]}/${name[2]}
pjx=${pfad[3]}/${name[3]}
normalize=${pfad[4]}/${name[4]}
ffmpeg=${pfad[5]}/${name[5]}
growisofs=${pfad[6]}/${name[6]}
kdialog=${pfad[7]}/${name[7]}
kaffeine=${pfad[8]}/${name[8]}

aufnahme_pfad=${basisverzeichnis}/dvd_aufnahme
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
}

#-----Vorbereiten der X.ini's für ProjectX----

konfiguration ()
{
#---X.ini für Filmbearbeitung---
echo \
"# Application
Application.Agreement=1
Application.Language=de

# WindowPosition
WindowPosition.Main.Height=670
WindowPosition.Main.Width=866
WindowPosition.Main.X=500
WindowPosition.Main.Y=0

# OptionPanel
OptionPanel.NormalLog=0
OptionPanel.closeOnEnd=1" > ${default_pfad}/X.ini.film

#---Voreinstellungen---
brenngeschwindigkeit=8 #maximale Brenngeschwindigkeit
maxgroesse=4600000000 #für DVD5
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Löschfunktionen°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

loeschen_temporaere_arbeitsordner ()
{
echo "*** Löschen der temporären Arbeitsordner (kann etwas dauern)***"

rm ${basisverzeichnis}/dvd_tmp/* 2>/dev/null
rm ${basisverzeichnis}/dvd_tmp1/* 2>/dev/null
rm -r ${basisverzeichnis}/dvd_struktur/* 2>/dev/null
rmdir ${basisverzeichnis}/dvd_struktur/* 2>/dev/null

echo "*** erledigt" ; echo
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°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`
if [ $? != 0 ]
then
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
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
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
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
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
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
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
fi
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Auswahl der Eingangsdateien°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

filmauswahl_dvd ()
{
brenn_pfad=${dvdstruktur_pfad}
filmauswahl
}

filmauswahl_ts ()
{
brenn_pfad=${tmp_pfad}
filmauswahl
}

filmauswahl_clip ()
{
filmauswahl
}

filmauswahl ()
{
quelldatei=`kdialog --caption "Filmauswahl" --geometry 600x500-0+0 --getopenfilename ${aufnahme_pfad}`
if [ $? != 0 ]
then
	kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
	exit
fi
}

verzeichnisauswahl_dvd ()
{
verzeichnistyp="*_dvd"
verzeichnisauswahl
}

verzeichnisauswahl_ts ()
{
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
	0)	kdialog --passivepopup "Es gibt nichts passendes zum Brennen. Das Script wird nun beendet." 3
		exit ;;
	1)	kdialog --passivepopup "Folgende Sicherung wird gebrannt: $hilfsverzeichnis" 3
		verzeichnis=$hilfsverzeichnis ;;
	*)	verzeichnis=`kdialog --combobox "Welche Datei soll gebrannt werden?" $hilfsverzeichnis`
		if [ $? != 0 ]
		then
			kdialog --passivepopup "Abbruch durch den Benutzer. Das Script wird nun beendet." 3
			exit
		fi ;;
esac

brenn_pfad=$verzeichnis
}
#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Eingangsverarbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

#-----Schneiden und Demultiplexen-----
pjx_demux_gui ()
{
echo "*** DVB mit PJX ***"
java -jar ${pjx} -demux -gui  -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
echo "*** erledigt" ; echo
}

#-----Schneiden und Wandeln nach TS-----
pjx_ts_gui ()
{
echo "*** TS mit PJX ***"
java -jar ${pjx} -tots -gui -split 4300 -ini ${default_pfad}/X.ini.film -out ${tmp_pfad} -name film "$quelldatei" 1>/dev/null
echo "*** erledigt" ; echo
}

mpeg1_input ()
{
echo "*** mpeg1 demultiplexen ( Video copy, Ton --> wav) ***"
${ffmpeg} -i "${quelldatei}" ${tmp_pfad}/film.mp2 -vcodec copy ${tmp_pfad}/film.m1v
echo "*** erledigt" ; echo
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Bearbeitung°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

requantisieren ()
{
videogroesse=`du -bc ${tmp_pfad}/*.m2v | cut -f1 | tail -n 1` #Berechnung des Requantisierungsfaktors
audio_summe=`du -bc ${tmp_pfad}/*.ac3 ${tmp_pfad}/*.mp2 | cut -f1 | tail -n 1`
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
	echo "*** Requantisieren ***"
	kdialog --passivepopup "Es wird mit folgendem Faktor requantifiziert: ${requantisierungsfaktor}" 3
	${tcrequant} -d2 -i ${tmp_pfad}/film.m2v -o ${tmp_pfad}/film.requant -f ${requantisierungsfaktor}
	mv ${tmp_pfad}/film.requant ${tmp_pfad}/film.m2v
	echo "*** erledigt" ; echo
fi
}

#........mp2-Ton auf einheitliche Lautstärke bringen (-12dBfs)..........
normalisieren ()
{
mv ${basisverzeichnis}/dvd_tmp/film.mp2 ${basisverzeichnis}/dvd_tmp1
rm ${basisverzeichnis}/dvd_tmp/*.mp2

echo "*** Ton decodieren ***"
${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2 ${basisverzeichnis}/dvd_tmp1/film.mp2.wav

echo "*** Ton normalisieren ***"
${normalize} -v ${basisverzeichnis}/dvd_tmp1/film.mp2.wav 2>&1

echo "*** Ton encodieren  ***"
${ffmpeg} -i ${basisverzeichnis}/dvd_tmp1/film.mp2.wav -acodec mp2 -ab 192k ${tmp_pfad}/film.mp2 2>&1

rm ${basisverzeichnis}/dvd_tmp1/*

echo "*** erledigt" ; echo
}

ac3_behalten ()
{
if [ ! -e ${basisverzeichnis}/dvd_tmp/*.ac3 ]
then
	kdialog --passivepopup "Der Clip enthält keinen AC3-Ton. Das Script wird nun beendet." 3
	exit
fi

rm ${basisverzeichnis}/dvd_tmp/*.mp2
}

mp2_behalten ()
{
if [ ! -e ${basisverzeichnis}/dvd_tmp/*.mp2 ]
then
	kdialog --passivepopup "Der Clip enthält keinen mp2-Ton. Das Script wird nun beendet." 3
	exit
fi

rm ${basisverzeichnis}/dvd_tmp/*.ac3
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Multiplexen, Codieren°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

multiplexen ()
{
echo "*** Multiplexen ***"
echo "***Bearbeitung läuft - kann etwas dauern"
mpeg1_video=
mpeg2_video=
mp2_audio=
ac3_audio=

mpeg1_video=`find ${tmp_pfad} | grep "m1v"`
mpeg2_video=`find ${tmp_pfad} | grep "m2v"`
mp2_audio=`find ${tmp_pfad} | grep "mp2"`
ac3_audio=`find ${tmp_pfad} | grep "ac3"`

${mplex} -v1 -f8 -o ${tmp_pfad}/film.mpg ${mpeg1_video} ${mpeg2_video} ${mp2_audio} ${ac3_audio} 2>/dev/null

if [ ! -e ${tmp_pfad}/film.mpg ]
then
	echo "*** Fehler *** Error ***Fehler ***"
	kdialog --error "Es konnte keine Datei multiplext werden!"
	exit
fi

echo "*** erledigt" ; echo
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Author'n°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

authoring_ohne_menue ()
{
echo "*** Authoring der DVD ***"
${dvdauthor} -o ${dvdstruktur_pfad} -t ${tmp_pfad}/film.mpg 2>&1 #VOBs und "Kapitel"-IFOs
${dvdauthor} -o ${dvdstruktur_pfad} -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 ()
{
echo "*** Video-DVD brennen ***"
kdialog --msgbox "Bitte leere DVD einlegen"
${growisofs} -speed=${brenngeschwindigkeit} -dvd-compat -Z /dev/dvd -dvd-video ${brenn_pfad} 2>&1
kdialog --msgbox "Bitte DVD entnehmen"
echo "*** erledigt" ; echo
}

brennen_ts ()
{
echo "*** Daten-DVD brennen ***"
dvdzahl=`find ${brenn_pfad} -type f | wc -l`
kdialog --msgbox "Anzahl der notwendigen DVDs: ${dvdzahl}"

for((i=1; i<=${dvdzahl}; i++))
do
	kdialog --msgbox "Bitte DVD Nr.: $i einlegen"
	${growisofs} -speed=${brenngeschwindigkeit} -Z /dev/dvd  -allow-limited-size -R -J ${brenn_pfad}/"film($((i-1)))"* 2>&1
	kdialog --msgbox "Bitte DVD entnehmen"
done

kdialog --msgbox "fertig"
echo "*** erledigt" ; echo
}

#°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Sichern°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

sichern_dvd_struktur ()
{
echo "*** DVD-Struktur sichern ***"
sicherungsordner="$(date +%Y%m%d%H%M%S)_dvd"
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${dvdstruktur_pfad}/* ${sicherungs_pfad}/${sicherungsordner}
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
echo "*** erledigt" ; echo
}

sichern_ts ()
{
echo "*** TS sichern ***"
sicherungsordner="$(date +%Y%m%d%H%M%S)_ts"
mkdir ${sicherungs_pfad}/${sicherungsordner}
mv ${tmp_pfad}/*.ts ${sicherungs_pfad}/${sicherungsordner}
kdialog --msgbox "Datei gesichert nach "${sicherungs_pfad}/${sicherungsordner}
echo "*** erledigt" ; echo
}

sichern_clip ()
{
clipspeicher=`kdialog --title "$quelldatei" --getsavefilename ${clip_pfad}`
mv ${tmp_pfad}/film.mpg "${clipspeicher}"
}

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Hauptprogramm++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#-----Initialisierung-----

basisverzeichnis_festlegen
arbeitsverzeichnisse_erstellen
programmerkennung
variablenzuweisungen
konfiguration
loeschen_temporaere_arbeitsordner

#-----Hauptmenue-----

hauptmenue
case $auswahl_hauptmenue in
	1)	untermenue_video_dvd ;;
	2)	untermenue_ts ;;
	3)	untermenue_videoclip ;;
	
esac

#-----untermenue_video_dvd-----

case $was_tun in

	11)	filmauswahl_dvd #Fernsehaufnahme schneiden und als Video-DVD brennen
		pjx_demux_gui
		requantisieren
		multiplexen
		authoring_ohne_menue
		abspielen
		brennen_video_dvd ;;

	12)	filmauswahl_dvd #Fernsehaufnahme schneiden und DVD-Struktur in Datei sichern
		pjx_demux_gui
		requantisieren
		multiplexen
		authoring_ohne_menue
		abspielen
		sichern_dvd_struktur ;;

	13)	verzeichnisauswahl_dvd #DVD-Struktur brennen
		abspielen
		brennen_video_dvd ;;
esac

#-----untermenue_ts-----

case $was_tun in

	21)	filmauswahl_ts #Fernsehaufnahme schneiden, TS als Daten-DVD brennen
		pjx_ts_gui
		brennen_ts ;;

	22)	filmauswahl_ts #Fernsehaufnahme schneiden, TS und sichern
		pjx_ts_gui
		sichern_ts ;;

	23)	verzeichnisauswahl_ts #gesichertes TS-file als Daten-DVD brennen
		brennen_ts ;;
esac

#-----untermenue_videoclip-----

case $was_tun in

	31)	filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert + AC3)
		pjx_demux_gui
		normalisieren
		multiplexen
		sichern_clip ;;

	32)	filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: AC3)
		pjx_demux_gui
		ac3_behalten
		multiplexen
		sichern_clip ;;

	33)	filmauswahl_clip #DVB-Clip: Schneiden und speichern (Ton: MP2 normalisiert)
		pjx_demux_gui
		mp2_behalten
		multiplexen
		sichern_clip ;;

	34)	filmauswahl #Mpeg1-Clip: Schneiden und speichern (Ton: MP2 normalisiert)
		mpeg1_input
		normalisieren
		multiplexen
		sichern_clip ;;
esac

exit



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