Bitte Beachten: Dieser Blog wird hier nicht weiter geführt! Kommentare und neue Blogposts gibt es unter http://feitel.indeedgeek.de. Dort bitte auch neue Kommentare zu diesen Beiträge erstellen.

Montag, 10. November 2008

ID3-Cover von Kopf bis Fuß

ID3 steht für Identify an MP3 wobei die aktuellen Versionen weit über das bloße Identifizieren hinaus gehen. In der Version 2.4 sind 83 Verschiedene Tags definiert die von "Internet radio station owner" bis "Original album/movie/show title" reichen. (Daneben kochen noch einige Player wie ITunes ihr eigenes Süppchen).

Versionen

In Version 1 gab es nur wenige Tags die auf eine fixe Größe begrenzt waren. (Zudem noch ein Haufen anderer Nachteile...) In Version 2 wurde vieles verbessert so ist zum Beispiel die Länge nicht mehr Fix und es gibt haufenweise neue Tag-Felder. Alle Versionen bis 2.3 gelten als veraltet. Und werden nur von wenigen Programmen und Geräten noch geschrieben. Die aktuelle Version ist 2.4 wobei man am häufigsten noch 2.3 antrifft.

Der Größte Unterschied zwischen 2.3 und 2.4 ist die Möglichkeit Tags nun auch als UFT-8 abzuspeichern (vorher nur ISO 8859-1 und UTF-16). Außerdem ist nun die Platzierung der Tags anpassbar. Bisher musste es immer am Anfang der Datei stehen was vor allem bei Streaming Probleme machen kann. Weiterführendes zu den Änderungen: in der offiziellen Doku.

Technische Umsetzung

Die gesamten ID3 Informationen beginnen immer mit einem Header. Dort ist gekennzeichnet, dass es sich um einen ID3 Tag mit der entsprechenden Version handelt außerdem sind dort noch Flags und die Größe angegeben.

Je nach dem wie es in den Flags angegeben wurde folgt danach ein extended Header. Dort lassen sich unter anderem einige Restriktionen machen die auch für das Cover interessant ist. So kann hier das Format (PNG oder JPEG) angegeben werden oder auch die maximale Auflösung wie zum Beispiel (256x256 oder kleiner).

Anschließend folgen die Tags auch Frames genannt. Der Header eines Frames besteht aus einer zum Teil kryptischen, eindeutigen Kennung wie TDEN für "Encoding time", der Länge der Daten und einigen Flags. Flags können zum Beispiel die Kodierung, ein Read-Only-Flag, Compression oder Verschlüsselung sein. Anschließend folgen die Daten selbst. Weiterführendes zu den Frames in der offiziellen Doku.

Zuletzt kann noch ein Buffer oder ein Footer kommen.

Image-Tag

Nun zum eigentlichen Image-Tag: Nicht erst seit ITunes Cover-Flow möchte man gerne die Cover eines Albums mit abspeichern. Ist das Cover einfach in einer Datei enthalten hat man wieder die Probleme wie man die Datei benennt und außerdem muss man aufpassen das sie nicht mal verloren geht. (So macht es glaub ich der Windows Media Player indem er eine Folder.jpg anlegt. (die nebenbei auch von meinem N95 erkannt wird (Siehe unten (fast wie LISP :D)))) Deshalb geht man dazu über die Cover-Informationen im Track selber zu speichern. Dazu gibt es ein extra Frame mit der Kennung APIC. Hier kann man allerdings nicht nur das Cover abspeichern sondern eine Vielzahl weiterer Bilder die den Track betreffen. Hier die Komplette Auflistung aus Version 2.4:

  • Other
  • 32x32 pixels 'file icon' (PNG only)
  • Other file icon
  • Cover (front)
  • Cover (back)
  • Leaflet page
  • Media (e.g. label side of CD)
  • Lead artist/lead performer/soloist
  • Artist/performer
  • Conductor
  • Band/Orchestra
  • Composer
  • Lyricist/text writer
  • Recording Location
  • During recording
  • During performance
  • Movie/video screen capture
  • A bright coloured fish
  • Illustration
  • Band/artist logotype
  • Publisher/Studio logotype

Es können auch mehrere Bilder pro Datei mit unterschiedlichen Typen angegeben werden. Zu Jedem Eintrag kann dann noch eine Beschreibung eingetragen werden (Kodierung hier nicht vergessen einzutragen). Das Bild selbst sollte entweder ein PNG oder ein JPEG-Format haben kann aber auch alles andere sein da man den MIME-Type sowieso angeben muss.

Außerdem besteht noch die Möglichkeit als MIME-Type "-->" anzugeben und dann als Bild nur den Verweis auf eine Bilddatei zu speichern. Beispiel wäre: "../cover.png" oder "http://example.com/cover.jpg". Aber ob das ein Player unterstützt??

Test-Script

Die Kompatibilität ist sowieso der Grund warum ich mich mit der Thematik beschäftigt habe. Mein neues Handy (Nokia N95) wollte nur ein Teil meiner Covers erkennen. Um zu Testen was es kann habe ich mir folgendes Skript gebastelt was MP3-Dateien in allen möglichen Kombinationen erstellt.

Also zum Beispiel das Bild als "Cover (front)" im PNG-Format und ID3v2.4 wäre eine denkbare Kombination.

Das Script benötigt Python und die eyeD3 Library. Zudem wird ein Soundfile benötigt (ich hatte complete.mp3 mit 4 Sekunden Länge) und ein Bild in den entsprechenden Formaten (ich hatte ok.{png,bmp,jpg,gif}). In dem Download-Package ist beides vorhanden.

import eyeD3
from shutil import copy

filename = "complete.mp3"
imagefile = "ok."
versions = [eyeD3.ID3_V2_3, eyeD3.ID3_V2_4]
formats = ["bmp", "gif", "jpg", "png"] 
id = 0 

for type in range(eyeD3.frames.ImageFrame.MIN_TYPE, eyeD3.frames.ImageFrame.MAX_TYPE + 1): 
  for version in versions:
    for format in formats:
      str = { 
            "id"      : id
          , "type"    : eyeD3.frames.ImageFrame.picTypeToString(type)
          , "version" : eyeD3.utils.versionToString(version)
          , "format"  : format
      }   
      newFilename  = "test-%(id)03d-%(type)s-%(version)s-%(format)s.mp3" % str 
      copy(filename, newFilename)
      tag = eyeD3.Tag(newFilename)
      tag.remove(eyeD3.ID3_ANY_VERSION)
      tag.header.setVersion(version)
      tag.addImage(type, imagefile+format, u"")
      tag.update()
      id+=1

Es werden so 167 Dateien erstellt die entsprechend benamt sind. Nun kann man damit sein Player füllen und sehen was er alles unterstützt. In meinem Fall konnte das Nokia N95 nur JPEG im korrekten "Cover (Front)"-Feld wobei ihm die Version (ID3v2.{3,4}) egal war.

Testen, Testen, Testen

Ich musste das ganze natürlich gleich mit ein paar Programmen ausprobieren. Amarok konnte natürlich alles darstellen ebenso ITunes. Der Windows-Explorer hingegen schafft unter Vista leider nur ID3v2 dafür aber auch alle Formate. Winamp schafft mit Plugin grade einmal JPEG-Formate.

Wenn ihr noch etwas testet dann lasst mir doch die Ergebnisse zukommen. Ich werde sie hier auch noch rein stellen. Dazu habe ich kein Archiv mit den benötigten Dateien gepackt welches hier runtergeladen werden kann: download

Der Fisch

Aufmerksamen Lesern wir das Feld "A bright coloured fish" aufgefallen sein. Ich habe echt kein Plan für was das gut sein soll. Ich finds ein sehr lustiges Easteregg :D. Wenn jemand den Fisch in freier Wildbahn findet muss er mir unbedingt Bescheid sagen!

eye3D kommentiert es nur folgendermaßen: BRIGHT_COLORED_FISH = 0x11; # There's always room for porno.