Skript zum CDs rippen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
paedubucher
Beiträge: 939
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Skript zum CDs rippen

Beitrag von paedubucher » 12.05.2010 22:23:55

Hallo allerseits

Ich möchte mich mal ein bisschen mit Shell-Skripting beschäftigen und habe mir dazu eine sinnvolle Aufgabe gestellt. Ich möchte CDs damit rippen können. Also einfach CD einlegen, Skript starten und ein Verzeichnis mit MP3-Dateien erhalten (mein Ei-Pott unterstützt kein OGG). Dazu arbeite ich mit cdparanoia und lame. (Wie ich die Daten aus der CDDB bekomme, weiss ich noch nicht genau. Vielleicht schreibe ich mir dafür ein kleines C-Tool).
Da ich eigentlich immer die gleichen Parameter habe (Kodierungsoptionen für lame, Dateiname der MP3-Dateien usw.) mache ich das Skript gänzlich ohne irgendwelche Parameter, einfach ./cdrip.sh und los gehts.

Das ganze sollte so aufgebaut sein:

Code: Alles auswählen

Lese Titelinformationen von CD aus (cdparanoia -Q)
Hole CDDB-Informationen zu CD
Iteriere über alle Titel
    lese Titel n aus (n.wav]
    codiere Titel n als MP3 (n.mp3)
    Schreibe CDDB-Informationen zu Titel n (M3U-Informationen)
    Benenne Titel gemäss M3U-Informationen ([n] - [Songtitel].mp3)
Fahre fort mit nächstem Titel
Das mit CDDB lasse ich im Moment noch weg. Ich möchte zunächst einfach die CD auslesen. Dazu rufe ich zunächst cdparanoia -Q aus. Das gibt mir folgendes zurück:

Code: Alles auswählen

cdparanoia III release 10.2 (September 11, 2008)

Table of contents (audio tracks only):
track        length               begin        copy pre ch
===========================================================
  1.    25557 [05:40.57]        0 [00:00.00]    no   no  2
  2.    27673 [06:08.73]    25557 [05:40.57]    no   no  2
  3.    15827 [03:31.02]    53230 [11:49.55]    no   no  2
  4.    20548 [04:33.73]    69057 [15:20.57]    no   no  2
  5.    44515 [09:53.40]    89605 [19:54.55]    no   no  2
  6.    22910 [05:05.35]   134120 [29:48.20]    no   no  2
  7.    20025 [04:27.00]   157030 [34:53.55]    no   no  2
  8.    21067 [04:40.67]   177055 [39:20.55]    no   no  2
TOTAL  198122 [44:01.47]    (audio only)
Nun zähle ich mit grep die Anzahl Zeilen:

Code: Alles auswählen

cdparanoia -Q  | grep -c [0-9]\.[:space:][0-9]
So sollte ich eigentlich 9 erhalten (jeder Track + TOTAL am Ende), mit Betonung auf "sollte". Aber "cdparanoia -Q" scheint den Output nicht konsequent nach stdio zu schreiben. Wenn ich "cdparanoia -Q > foo.txt" ausführe, ist foo.txt danach leer. Der Output kommt dennoch in der Konsole...

Wie komme ich an den Output heran? Und kennt jemand eine bessere Lösung für die Ermittlung der Trackanzahl?

Danke & Gruss
paedubucher
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Skript zum CDs rippen

Beitrag von Meillo » 13.05.2010 10:53:36

paedubucher hat geschrieben:Hallo allerseits

Ich möchte mich mal ein bisschen mit Shell-Skripting beschäftigen
Schön. :-)

Code: Alles auswählen

cdparanoia III release 10.2 (September 11, 2008)

Table of contents (audio tracks only):
track        length               begin        copy pre ch
===========================================================
  1.    25557 [05:40.57]        0 [00:00.00]    no   no  2
  2.    27673 [06:08.73]    25557 [05:40.57]    no   no  2
  3.    15827 [03:31.02]    53230 [11:49.55]    no   no  2
  4.    20548 [04:33.73]    69057 [15:20.57]    no   no  2
  5.    44515 [09:53.40]    89605 [19:54.55]    no   no  2
  6.    22910 [05:05.35]   134120 [29:48.20]    no   no  2
  7.    20025 [04:27.00]   157030 [34:53.55]    no   no  2
  8.    21067 [04:40.67]   177055 [39:20.55]    no   no  2
TOTAL  198122 [44:01.47]    (audio only)
Nun zähle ich mit grep die Anzahl Zeilen:

Code: Alles auswählen

cdparanoia -Q  | grep -c [0-9]\.[:space:][0-9]
Das sieht mir eher nach mehreren Spaces dazwischen aus. Und dann verwendest du das [:space:] falsch, da du es in eine Zeichenklasse packen musst, also: [[:space:]]. Das ist ein gängiger Fehler (und vermutlich ein Problem im Design dieser POSIX-Zeichenklassen).
So sollte ich eigentlich 9 erhalten (jeder Track + TOTAL am Ende), mit Betonung auf "sollte". Aber "cdparanoia -Q" scheint den Output nicht konsequent nach stdio zu schreiben. Wenn ich "cdparanoia -Q > foo.txt" ausführe, ist foo.txt danach leer. Der Output kommt dennoch in der Konsole...

Wie komme ich an den Output heran?
Wenn er nicht nach stdout geht, dann wird er vermutlich nach stderr gehen. ;-)

Teste: cdparanoia -Q 2>foo

Und kennt jemand eine bessere Lösung für die Ermittlung der Trackanzahl?
Brauchst du die überhaupt? Kann man nicht einfach alle Tracks auslesen lassen? Dann kannst du nämlich zählen wieviele Dateien zu bekommen hast. ;-)


Falls es dir um die Funktion geht, dann verwende besser Debianjack, das kann das alles automatisch.
Use ed once in a while!

paedubucher
Beiträge: 939
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Skript zum CDs rippen

Beitrag von paedubucher » 13.05.2010 11:08:58

Also eigentlich geht es mir schon um die Funktionalität. Ich habe bisher noch keine einfach Lösung gefunden (ausser vielleicht ripperX). Von daher bin ich jetzt mit jack super bedient. Danke für den Tipp! Es gibt ja noch genügend anderes, was automatisiert werden kann.

Danke & Gruss
paedubucher
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten