Python/mutagen: Audiodateien mit Bildern versehen

Veröffentlicht am

Wer mit einem Python-Skript Metadaten von Audiodateien auslesen oder schreiben möchte, bekommt mit dem Modul mutagen ein gutes Tool an die Hand.

Ich habe das Modul in der letzten Zeit dazu genutzt, um Alben-Covers in Audiodateien zu schreiben. Speziell dafür möchte ich hier nun kurz die Vorgehensweise beschreiben…

Natürlich gibt es genügend Tools, mit denen die Metadaten von Musikdateien bearbeitet werden können. In bestimmten Fällen kann es aber auch ganz hilfreich sein, ein eigenes Bearbeitungs-Skript bauen zu können. Einen solchen, konkreten Anwendungsfall werde ich demnächst noch im Detail zeigen.

Installation

Der Einfachheit halber kann man für die Installation des Python-Moduls das Tool easy_install benutzen…

easy_install

Das Installations-Tool muss ggfs. allerdings selbst erst einmal installiert werden. Ob ihr easy_install bei euch bereits verfügbar habt, könnt ihr im Terminal folgendermaßen prüfen:

easy_install --version

Dieser Aufruf sollte eine Versionsnummer ausgeben. Kommt stattdessen die Meldung easy_install: Befehl nicht gefunden, könnt ihr das Programm einfach über das Paket python-setuptools installieren. Also so:

sudo apt-get install python-setuptools

mutagen

Das Modul kann nun mit Hilfe von easy_install ganz einfach mit folgendem Befehl installiert werden:

sudo easy_install mutagen

Erstes Beispiel

Als erstes, relativ einfaches Beispiel, möchte ich nun erst einmal zeigen, wie aus einer MP3-Datei die Tags ausgelesen werden können:

#!/usr/bin/python
from mutagen.easyid3 import EasyID3
audio = EasyID3(u'/pfad/zu/meiner/mp3datei.mp3')
for tag in audio:
    print '{0}: {1}'.format(tag, audio[tag][0])

Bilder schreiben/entfernen

Die Vorgehensweise zum Speichern von Bildern in den Musikdateien unterscheidet sich von Format zu Format. Da sich meine Musiksammlung auf MP3– und FLAC-Dateien beschränkt, möchte ich hier auch nur auf diese beiden Formate Beispiele eingehen (andere Formate habe ich selbst nicht ausprobiert).

MP3-Dateien

Bei MP3-Dateien wird zur Speicherung der Metadaten das ID3-Format verwendet. Folgendes Beispiel fügt das Bild test.jpg als Frontcover in die Metadaten der MP3-Datei test.mp3 ein:

#!/usr/bin/python
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC
a = MP3(u'test.mp3', ID3=ID3)
imgdata = open(u'test.jpg').read()
img = APIC(3, u'image/jpeg', 3, u'Albumcover', imgdata)
a.tags.add(img)
a.save()

Und das bedeuten die Argumente für das APIC-Objekt im einzelnen:

  1. die erste 3 steht dabei für das Encoding UTF-8
  2. dann folgt der MIME-Type, der natürlich abhängig vom Grafik-Format ist. Eine Übersicht der MIME-Typen findet ihr z.B. hier bei SELFHTML (interessant sind in dem Fall alle die mit image/ beginnen).
  3. die zweite 3 gibt an, welche Bedeutung das Bild hat (3 = Frontcover; die möglichen Zahlenwerte könnt ihr in der ID3-Spezifikation nachschlagen)
  4. dann folgt die Bildbeschreibung
  5. und schließlich der Inhalt der Grafikdatei

Man muss beachten, dass die Datei auch zwei (bzw. mehrere) Bilder vom Typ Frontcover aufnimmt. Ein vorhandenes Bild wird nur dann überschrieben, wenn der Bildtyp (3. Argument) und die Bildbeschreibung (4. Argument) übereinstimmt. Will man sicherstellen, dass kein anderes (Frontcover)-Bild in der Datei gespeichert ist, dann muss man zuvor die ungewollten Bilder aus den Metadaten entfernen:

#!/usr/bin/python
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC
a = MP3(u'test.mp3', ID3=ID3)
keys = [tag for tag in a.keys() if 'APIC' in tag and a[tag].type == 3]
for key in keys:
    del a[key]
a.save()

Dieses Beispiel löscht alle Bilder vom Typ Frontcover aus der Datei test.mp3 heraus. Die Einschränkung auf die Frontcover findet sich in der langen Zeile in Form von and a[tag].type == 3. Bei Bedarf kann hier also die Einschränkung auf einen anderen Bildtyp abgeändert oder komplett entfernt werden.

FLAC-Dateien

Im Gegensatz zu den MP3-Dateien wird für das FLAC-Format ein Metadaten-Format verwendet das sich Vorbis Comment nennt. Inhaltlich entsprechend dem ersten MP3-Beispiel, schreibt dieses Beispiel das Bild test.jpg als Frontcover mit der Beschreibung Albumcover in die Datei test.flac:

#!/usr/bin/python
from mutagen.flac import FLAC, Picture
a = FLAC(u'test.flac')
imgdata = open(u'test.jpg').read()
img = Picture()
img.mime = u'image/jpeg'
img.type = 3
img.desc = u'Albumcover'
img.data = imgdata
a.add_picture(img)
a.save()

Für die Eigenschaften, die dem Bild-Eintrag zugewiesen werden, gilt die gleiche Beschreibung wie bei dem MP3-Beispiel aufgeführt.

Da es wohl keinen Konstruktor für die Klasse Picture gibt, der gleich alle Daten entgegennimmt, sieht das FLAC-Beispiel erst einmal etwas umständlicher aus als das für das MP3-Format. Dafür ist das Löschen vorhandener Bilder mit einem einzigen Aufruf erledigt: a.clear_pictures() – hier das komplette Beispiel, das einfach alle Bilder aus der Datei löscht:

#!/usr/bin/python
from mutagen.flac import FLAC, Picture
a = FLAC(u'test.flac')
a.clear_pictures()
a.save()

Allerdings kann man sich auf diese Weise nicht auf bestimmte Bild-Typen beschränken. Es werden einfach alle Bilder entfernt. Möchte man nur einzelne Bilder löschen, muss man einen kleinen Umweg gehen:

#!/usr/bin/python
from mutagen.flac import FLAC, Picture
a = FLAC(u'test.flac')
pics = a.pictures
a.clear_pictures()
for p in pics:
    if p.type != 3:
        a.add_picture(p)
a.save()

Dabei merkt man sich erst alle bereits eingetragene Bilder, entfernt dann alle und fügt schließlich alle Bilder, die beibehalten werden sollen, wieder ein. Entsprechend dem MP3-Beispiel entfernt dieses Skript also alle Frontcover-Bilder aus der Datei – und behält die übrigen Bilder.

Weitere Informationen

Wer weitere Informationen und Beispiele sucht, für den könnten folgende Links ggfs. interessant sein:

  • Quellcode von Musicbrainz Picard und dort speziell ausgehend von den Dateien in formats – hier kann man sich das ein oder andere abschauen, was die Verwendung von mutagen angeht. Man sollte Python-Programme allerdings einigermaßen lesen können.
  • Die mutagen-Homepage – hier sind neben Picard auch weitere „Real World Uses“ genannt.
  • Auf der Wiki-Unterseite der mutagen-Homepage findet ihr außerdem ein (wirklich sehr) kurzes Tutorial.

Dieser Artikel wurde in der/den Kategorie(n) Planet-U, Praxis, Programmierung und Skripting veröffentlicht und mit den Tags , , , , , versehen.

2 Kommentare zu Python/mutagen: Audiodateien mit Bildern versehen

  1. Kommentar von posativ
    10. September 2011, 20:25 Uhr.

    Für mehr Formatauswahl könntest du `mimetypes` via `mimetypes.guess_type(‚keks.png‘) == (‚image/png‘, None)` und so weiter, verwenden.

  2. Kommentar von produnis
    10. September 2011, 22:58 Uhr.

    Super, genau das brauche ich gerade!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>