Id3 Tags

Code-Stücke können hier veröffentlicht werden.
Antworten
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Eine (weitere) Klasse zum ID3 tags extrahieren. :D
"There are many like it, but this one is mine" ;)
Kann leider (noch) nicht alle MP3 Dateien korrekt parsen (Bei einigen Farin Urlaub songs zb spuckt die klasse lediglich einen haufen "U"s aus.).

Hier gehts zum Code. Als Code-beispiel dient die main() funktion.
BlackJack

@stuhlbein: `isvalidmp3()` testet nicht, ob es sich um eine MP3-Datei handelt, sondern ob die Datei mit einem (neuen) ID3-Header beginnt oder nicht. MP3-Dateien, die das alte Format verwenden, wo das Tag am Ende angehängt wird, sind auch valide MP3-Dateien.

Ausserdem ist die Ausnahme in der Funktion fehl am Platz. Bei einer Funktion, die testet, ob eine Bedingung erfüllt ist, ist das Nichterfüllen ein ganz normaler Fall und keine Ausnahmesituation.

Die Methode funktioniert ausserdem nicht korrekt. Bei Dateien, die nur aus 'I', 'D', '3', 'ID', oder 'D3' bestehen, wird `True` zurückgegeben.

Dann erkennst Du nur Dateien, bei denen sowohl alte, als auch neue ID3-Tags enthalten sind, also keine, die nur die alten Tags haben, welche Du aber ausschliesslich ausliest!? Allerdings ohne zu testen, ob es wirklich ein Tag im alten Format *gibt*. Ich würde sagen, da kommen Deine Probleme mit den Songs von Herrn Urlaub her -- die Dateien haben kein Tag im alten Format und Du liest entsprechend "Datenmüll" am Ende der Datei.

Von der API her hätte ich `ID3` so entworfen, dass die `__init__()` so ein Objekt aus den einzelnen Daten (Titel, Artist, …) erstellen kann, und eine statische oder eine Klassenmethode, die ein `ID3`-Objekt aus einer Datei mit Tag erstellt. Das ist flexibler, vor allem wenn man das um die Gegenrichtung erweitert und solche Tags aus in Dateien schreiben möchte. Dann möchte man ja `ID3`-Exemplare erstellen, die noch nicht in einer Datei stehen.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

BlackJack hat geschrieben:@stuhlbein: `isvalidmp3()` testet nicht, ob es sich um eine MP3-Datei handelt, sondern ob die Datei mit einem (neuen) ID3-Header beginnt oder nicht. MP3-Dateien, die das alte Format verwenden, wo das Tag am Ende angehängt wird, sind auch valide MP3-Dateien.

Ausserdem ist die Ausnahme in der Funktion fehl am Platz. Bei einer Funktion, die testet, ob eine Bedingung erfüllt ist, ist das Nichterfüllen ein ganz normaler Fall und keine Ausnahmesituation.

Die Methode funktioniert ausserdem nicht korrekt. Bei Dateien, die nur aus 'I', 'D', '3', 'ID', oder 'D3' bestehen, wird `True` zurückgegeben.

Dann erkennst Du nur Dateien, bei denen sowohl alte, als auch neue ID3-Tags enthalten sind, also keine, die nur die alten Tags haben, welche Du aber ausschliesslich ausliest!? Allerdings ohne zu testen, ob es wirklich ein Tag im alten Format *gibt*. Ich würde sagen, da kommen Deine Probleme mit den Songs von Herrn Urlaub her -- die Dateien haben kein Tag im alten Format und Du liest entsprechend "Datenmüll" am Ende der Datei.
richtig, dieses problem hab ich bereits erkannt. Leider weiss ich auch nicht wirklich wie ich sonst testen soll, ob es sich um eine valide MP3-datei handelt ;)
Ich lese mich momentan bereits in einigen MP3/ID3 bibliotheken/modulen verschiedener sprachen ein, um da die eine oder andere Idee zu bekommen.
Von der API her hätte ich `ID3` so entworfen, dass die `__init__()` so ein Objekt aus den einzelnen Daten (Titel, Artist, …) erstellen kann, und eine statische oder eine Klassenmethode, die ein `ID3`-Objekt aus einer Datei mit Tag erstellt. Das ist flexibler, vor allem wenn man das um die Gegenrichtung erweitert und solche Tags aus in Dateien schreiben möchte. Dann möchte man ja `ID3`-Exemplare erstellen, die noch nicht in einer Datei stehen.
ich bin mir nicht ganz sicher wie du das meinst, auch wenn es vernünftig klingt. Hast du ein beispiel?
BlackJack

@stuhlbein: Du brauchst ja gar nicht testen, ob die Datei eine MP3-Datei ist, sondern nur, ob am Ende der Datei ein Tag existiert. Was am Anfang steht ist völlig egal. Das 'ID3' am Anfang wäre interessant, wenn Du ID3v2-Tags auslesen möchtest; mit den ID3v1-Tags am Ende hat das nichts zu tun.

Grösstenteils ungetestetes Beispiel, bei dem man ein `ID3`-Exemplar aus den einzelnen Angaben, aus einer Zeichenkette mit den Binärdaten, einer geöffneten Datei, oder aus einer Datei über Angabe des Dateinamens erzeugen kann: http://paste.pocoo.org/show/141070/
Antworten