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.
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:
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.
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.
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 ...)
Ach wenn’s viele Jahre zu spät kommt (es könnte ja jemand danach suchen …): Die meisten Tagger wollen nichts "Artfremdes" zerstören, werden also i.d.R. das Lyrics3 oder Lyrics3v2 Tag unverändert zurückschreiben. Wenn man nun aber ID3v1 bzw. ID3v1.1 Tags entfernt … ja genau: bleibt das Lyrics3-Tag übrig, obwohl lt. Spezifikation ein ID3v1-Tag folgen muss!
Ich habe in meiner Sammlung gerade wieder rd. 1.500 solcher – eigentlich defekten – Dateien entdeckt.
Ergo: Der Check muss das berücksichtigen. (Siehe auch rmlyrics3).