Kleines Skript zum Rippen von DVDs

KANOTIX. Heute stieß ich nach längerer Zeit auf ein kleines Problem: Ich wollte DVDs rippen, also in ein platzsparendes Format auf die Festplatte bringen. Vor längerer Zeit hatte ich schon einmal einen Einzeiler für die Kommandozeile gefunden, mir aber weder diesen Kommando-Lindwurm notiert noch eine Quelle hinterlegt. Also machte ich mich auf die Suche. Werkzeuge mit grafischen Benutzeroberflächen konnte ich nicht finden, da ich für diese eine Aufgabe keine weiteren Fremdquellen in meinem System haben will. Im Arch Linux-Wiki fand ich ein Skript, dass so zwar nicht funktionierte, mir jedoch eine gute Grundlage zur Anpassung an meine Vorstellung bot.

Die Pakete mencoder und lsdvd werden dafür benötigt, die entsprechenden Abhängigkeiten können mit
$ apt-cache depends Paketname
ermittelt werden.

Hier ist „mein“ kleines Skript:

#!/bin/bash

# Dvd2Avi 0.2 by yyz
# veröffentlicht in https://wiki.archlinux.org/index.php/Dvd2Avi
# Bearbeitet von totschka, 2013/03/03
#
# Das Skript liest die längste Spur einer DVD (den eigentlichen Film)
# und wandelt sie in .avi um. Dabei werden interaktiv drei
# Qualitätsstufen (high - normal - low) zur Auswahl gestellt.
#

# Bereitschaft des Laufwerks testen und bei Fehler Programmende
ls /media/cdrom/VIDEO_TS > /dev/null
if [ $? = 2 ]; then
echo "Keine DVD im Laufwerk oder Laufwerk nicht bereit!"
exit 2
fi

Ich bin mir zwar ziemlich sicher, dass ich weiß, was ich tue, trotzdem möchte an dieser Stelle auf die Fehlerbehandlung nicht verzichten. Es kann ja doch einmal passieren, dass ich vergesse, vorher die DVD auch einzulegen, oder dass die DVD eine Fehler hat und nicht gelesen werden kann. Dann möchte ich eine entsprechende Ausgabe und das Ende der Verarbeitung sehen. Es ist ein recht einfacher Weg, die Existenz einer DVD im Laufwerk abzufragen. Vorschläge für eine elegantere Lösung nehme ich gern entgegen.

Da ich nur den jeweiligen Film ohne Schnickschnack benötige, ermittle ich mit lsdvd die längste Spur auf der DVD. grep und cut sorgen dafür, dass die Variable TRACK mit der passenden Spurnummer gefüllt wird.

# DVD einlesen und Ermitteln der längsten Spur
echo "Lese DVD..."
track=`lsdvd | grep Longest | cut -c16-17`
echo "Längste Spur: $track"

# Dateiname und gewünschte Qualität abfragen
echo -n "Name der Ausgabedatei (ohne Endung):"
read file

echo -n "Qualität (h/n/l; default=n):"
read quality

Die Abfrage der Variablen ist selbsterklärend.

Im Originalskript hat der Autor mit if-Konstruktionen gearbeitet, um die betreffende Eingabe für die gewünschte Encoding-Qualität auszuwerten. Ich bevorzuge hier case, da es ersichtlich lesbarer ist. Die eineinhalb Zeilen nach mencoder sind tatsächlich als eine Zeile zu lesen, der geringeren Darstellungsbreite ist der Zeilenumbruch geschuldet, der im Skript so nicht vorkommt.

# Längste Spur in .avi umwandeln
case $quality in
h) # High Quality Encoding
mencoder dvd://$track -alang de -oac mp3lame -lameopts br=320:cbr -ovc  lavc -lavcopts vcodec=mpeg4:vhq -vf scale -zoom -xy 800 -o $file.avi
exit $?
;;
l) # Low Quality Encoding
mencoder dvd://$track -alang de -oac mp3lame -lameopts br=96:vbr -ovc lavc -lavcopts vcodec=mpeg4:vhq -vf scale -zoom -xy 320 -o $file.avi
exit $?
;;
*) # Normal Quality Encoding (empfohlen), Vertipper landen automatisch  im Normal-Modus
mencoder dvd://$track -alang de -oac mp3lame -lameopts br=160:cbr -ovc lavc -lavcopts vcodec=mpeg4:vhq -vf scale -zoom -xy 640 -o $file.avi
exit $?
;;
esac

Die mangelnde Übersichtlichkeit ist der Tatsache geschuldet, dass ich hier keine Codeboxen einfügen kann. Deshalb gibt es hier das Skript zum Download. Die Endung rührt daher, dass ich hier keine normale Textdatei „dvdrip.sh“ hochladen kann. Deshalb trickse ich und hänge einfach die Endung .odt an. Das ist kein Problem, einfach das Skript wieder umbenennen und ausführbar machen.
# chmod +x Dateiname

Ich habe das Skript mit 5 verschiedenen DVDs benutzt und auch den Fall getestet, wenn keine DVD im Schacht liegt. Für meine Zwecke ist es perfekt. Für Verbesserungs-vorschläge habe ich jedoch immer ein offenes Ohr.

Update:

Ich habe die Namen der Variablen geändert. Mit Großbuchstaben werden reservierte systemweite Variablen benannt. Ich mag zwar auch für meine privaten Variablen die GROSSBUCHSTABEN, weil sie die Lesbarkeit nach meinem Geschmack verbessern, aber um ungewollte Effekte zu vermeiden, sollte man eigene Variablen immer mit Kleinbuchstaben benennen.

Advertisements