Fehler beim Speichern eines APE Tags und Lyrics3


#1

Hallo Florian!

Leider ist ein ziemlich schwerwiegender Fehler in MP3Tag. Er tritt auf, wenn man APEv2 Tags in eine Datei mit Lyrics3 speichern möchte.
Ich weiß zwar, dass MP3Tag keine Lyrics3 Tags unterstützt, du solltest diese aber trotzdem nicht "zerstören".

Hier ist ein Hinweis:
Lyrics3 Tags (egal ob v1.0 oder v2.0) können NUR dann auftreten, wenn auch ein ID3v1(.1) Tag vorhanden ist.
Du solltest vor dem Schreiben des APE Tags überprüfen, ob die MP3 Datei bereits einen ID3v1 Tag enthält, und falls ja, 137 Bytes zurückspringen (128 wegen ID3v1 und 9 wegen Lyrics3).
Wenn diese 9 Bytes "LYRICSEND" sind, handelt es sich um einen Lyrics3v1 Tag. Das bedeutet, er ist immer 5100 Bytes lang - springe 5100 Bytes zurück und schreibe den APEv2 Tag.
Falls die 9 Bytes "LYRICS200" sind, handelt es sich um einen Lyrics3v2 Tag. Dann musst du wieder 6 Bytes zurückspringen und die Größe extrahieren (liegt als String/Char). Zu dieser Größe addierst du 15 (9 = "LYRICS200" + 6 = Längenbezeichner). Dein Ergebnis ist die komplette Größe des Lyrics3v2 Tags. Jetzt springst du wieder zurück (so viel, wie der gesammte Lyrics3v2 Tag ist) und schreibst den APEv2 Tag.

Grüße,
Sebastian Mares


#2

Nochmal zusammengefasst...

  • Lyrics3 ist nur in Verbindung mit ID3v1 möglich.
  • Lyrics3 ist IMMER vor ID3v1.
  • Vor "TAG" (ID3v1 Header) muss sich entweder "LYRICSEND" (Lyrics3 1.0) oder "LYRICS200" (Lyrics3 2.0) befinden.
  • Lyrics3 1.0 ist IMMER 5100 Bytes lang.
  • Die Länge eines Lyrics3 2.0 Tags steht immer vor "LYRICS200" - 6 Zeichen lang & als String/Char. Zu dieser Länge addierst du 6 (da der Size-Descriptor an sich 6 Bytes lang ist) und 9 (da "LYRICS200" 9 Bytes hat).

    Wenn der Footer also "...000105LYRICS200..." ist, ist der Lyrics3 2.0 Tag 105 + 6 + 9 = 120 Bytes lang.

  • Eine MP3 Datei kann entweder einen Lyrics3 1.0 ODER einen Lyrics3 2.0 Tag enthalten - niemals beide.
  • APEv2/APEv1 Tags kommen immer vor Lyrics3.

Es gibt noch andere Schwierigkeiten mit ID3v2.4 am Ende einer Datei, aber das ist unwichtig. Generell können MP3s so aussehen:

ID3v2.0...ID3v2.1...ID3v2.2...ID3v2.3...ID3v2.4...AUDIO...APEv2...Lyrics3...ID3v
1

oder

ID3v2.0...ID3v2.1...ID3v2.2...ID3v2.3...AUDIO...ID3v2.4...APEv2...Lyrics3...ID3v
1

Regards,
Sebastian Mares


#3

Argl! Ich verfluche die Leute die sich so viele Tag-Formate ausgedacht haben ...

Ich werd mal versuchen, da was drum rum zu stricken - danke für den Hinweis! Allerdings betrifft der Fehler ja denke ich nicht allzu viele Nutzer, da 1. die wenigsten bisher APE-Tags nutzen und 2. diese kaum Lyrics3-Tags nutzen.

~ Florian


#4

:wink: Du bist nicht der Einzige...

Ja, da hast du wohl recht. Es wäre aber aus Kompatibilitätsgründen sehr gut, wenn du diesen Fehler beheben würdest. :slight_smile:

Ich selber bin auf das selbe Problem gestoßen, als ich am VBSpot (http://vbspot.sourceforge.net) gearbeitet habe.

Sebastian Mares

PS: Vielleicht wurde das schon gefragt, aber hast du vielleicht vor, den Quellkode irgendwann freizugeben?


#5

Bin schon dabei :wink: ...

Ja, das wurde ich schon ein paar mal gefragt. Der Grund warum Mp3tag nicht Open Source werden wird, liegt darin, dass ich mit einem Freund eine Klassenbibliothek geschrieben habe auf der Mp3tag aufgebaut ist und die auch kommerziell genutzt werden wird (von meinem Freund). Wir hatten zu Beginn vereinbart, dass wir den Source-Code nur
bei gegenseitigem Einverständnis freigeben.

Viele Grüße,
~ Florian


#6

Der Fehler ist im aktuellen Developer Build behoben.

Noch eine Anmerkung für Dein Projekt: Der Lyrics3v1-Tag kann höchstens 5100 Bytes groß sein. D.h. er kann auch kleiner sein und man muss den Speicher nach LYRICSBEGIN durchsuchen (wer sich das wieder "überlegt" hat ...)

Viele Grüße,
~ Florian


#7

thumbs up

Außerdem, danke für den Hinweis, aber wo hast du das gelesen? getID3 (http://getid3.sourceforge.net) verwendet auch die Konstante 5100 als Länge. ???


#8

Ich hab die Spezifikation von id3.org verwendet. Dort steht: The maximum length of the lyrics is 5100 bytes.

Viele Grüße,
~ Florian


#9

OK, du hast wahrscheinlich recht. :wink: