ID3 Tags auslesen speziell POPM (Song Rating) -- erledigt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Puffi
User
Beiträge: 3
Registriert: Dienstag 30. Dezember 2008, 15:44
Kontaktdaten:

Hallo,

ich komme aus der Windowswelt mit VBScript / VBA / ASP / VB6 und führe gerade einen komplett Umstieg auf Linux durch.

Da ich nur wenige Standardprogramme verwende habe ich mir bis jetzt immer etwas selber geschrieben und unter Linux will ich das auch weiterhin daher bin ich bei Python gelandet.

Ich habe ein konkretes Projekt und scheitere leider an den zur Verfügung stehenden Modulen.

Ich will alle meine MP3's die ich auf einem Mediaserver (Hifidelio) liegen habe nun selber verwalten, hierzu ist es notwendig alle relevanten Tag's auszulesen.

In vielen MP3's ist das Frame POPM hinterlegt und dieses Frame will sich mit keinem der getesteten Modulen auslesen lassen (wahrscheinlich sitzt der Fehler mal wieder vor dem Monitor)

Gefunden und getestet habe ich folgende Module:
Mutagen -- sollte POPM unterstützen, findet aber das Frame nicht
Tagger (pytagger) -- findet das Frame gibt es aber unvollständig zurück
ID3Reader -- keine Unterstützung
eyed3 -- keine Unterstützung
mmpython -- keine Unterstützung

Mein Favorit ist also Tagger da dieses Modul zumindestens mal das Frame findet.
Das Frame ist folgendermaßen aufgebaut:
hifidelio-info@hermstedt.de|100|0

Tagger gibt mir aber immer nur die E-Mail Adresse aus und nicht das Rating.

Die MP3's können unter Windows mit Audiogenie und MP3Tag richtig ausgelesen werden, daher liegt es schon mal nicht an den MP3's.

Vielleicht hat ja einer von euch eine Idee was ich falsch mache.

Code: Alles auswählen

import tagger
datei = tagger.ID3v2('BVAT.mp3')
for id3frame in datei.frames:
    if id3frame.fid == 'POPM':
        print id3frame.output()
        print id3frame.o_bin()
        print id3frame.rawdata
        print id3frame.strings
Ausgabe:

Code: Alles auswählen

POPM     hifidelio-info@hermstedt.de ú
hifidelio-info@hermstedt.de ú
hifidelio-info@hermstedt.de ú
[]
Zuletzt geändert von Puffi am Dienstag 30. Dezember 2008, 20:47, insgesamt 1-mal geändert.
BlackJack

Wenn's erst einmal nur um das Auslesen geht, dann sollte Tagger funtionieren, Du must halt nur die Informationen selber da rausholen. Dokumentation zum Format des Rahmens gibt's hier in Abschnitt 4.17: http://www.id3.org/id3v2.4.0-frames

Da die Angaben Binär kodiert sind, solltest Du `repr()` zur Ausgabe verwenden, damit man auch sieht welche Bytes in den "Zeichenketten" enthalten sind. Das "Leerzeichen" nach der E-Mail-Adresse ist zum Beispiel ein Nullbyte und welchen Bytewert, oder welche Bytewerte das 'ú' darstellt, kann man auch nur raten.
Puffi
User
Beiträge: 3
Registriert: Dienstag 30. Dezember 2008, 15:44
Kontaktdaten:

Ich habe jetzt mal im Internet gesucht aber entweder verwende ich die falschen Begriffe oder ich verstehe die Ergebnisse nicht.

Ich finde keine Info wie ich das Frame Binär auslesen kann.

Hier noch die Ausgabe mit repr() und der Typ:

Code: Alles auswählen

<type 'instancemethod'>
'hifidelio-info@hermstedt.de\x00\xfa'
Die Framedefinition hilft mir leider auch nicht weiter, hier bin ich mir aber sicher das ich diese nicht verstehe.

Gibt es noch Denkanstöße?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Du hast damit doch schon alles: 'hifidelio-info@hermstedt.de' ist die E-Mail-Adresse, gefolgt von einem Nullbyte ('\x00') und danach das Rating ('\xfa'), das man mit `ord()` in eine Zahl umwandeln kann (was in dem Fall dann 250 entspricht).

Code: Alles auswählen

In [109]: email, rating_and_counter = 'hifidelio-info@hermstedt.de\x00\xfa'.split('\x00', 1)

In [110]: rating = ord(rating_and_counter[0])

In [111]: print email, rating
hifidelio-info@hermstedt.de 250
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Puffi
User
Beiträge: 3
Registriert: Dienstag 30. Dezember 2008, 15:44
Kontaktdaten:

Hallo Trundle,

das war weit mehr als ein Denkanstoß, das war die Lösung!
Vielen Dank!

Mir war ord() nicht bekannt, werde mir jetzt anschauen was genau dahintersteckt.

Ich hatte definitiv nach dem falschen gesucht gehabt.
Antworten