Zugriff auf MP3-Metadaten mit Python [geschlossen]


Antworten:


106

Ich habe neulich eyeD3 mit viel Erfolg benutzt. Ich fand heraus, dass es dem ID3-Tag Grafiken hinzufügen konnte, die die anderen Module, die ich mir ansah, nicht konnten. Sie müssen mit pip installieren oder den tar herunterladen und python setup.py installaus dem Quellordner ausführen .

Relevante Beispiele von der Website sind unten.

Lesen des Inhalts einer MP3-Datei mit Informationen zu v1- oder v2-Tags:

 import eyeD3
 tag = eyeD3.Tag()
 tag.link("/some/file.mp3")
 print tag.getArtist()
 print tag.getAlbum()
 print tag.getTitle()

Lesen Sie eine MP3-Datei (Titellänge, Bitrate usw.) und greifen Sie auf das Tag zu:

if eyeD3.isMp3File(f):
     audioFile = eyeD3.Mp3AudioFile(f)
     tag = audioFile.getTag()

Bestimmte Tag-Versionen können ausgewählt werden:

 tag.link("/some/file.mp3", eyeD3.ID3_V2)
 tag.link("/some/file.mp3", eyeD3.ID3_V1)
 tag.link("/some/file.mp3", eyeD3.ID3_ANY_VERSION)  # The default.

Oder Sie können über die Rohrahmen iterieren:

 tag = eyeD3.Tag()
 tag.link("/some/file.mp3")
 for frame in tag.frames:
    print frame

Sobald ein Tag mit einer Datei verknüpft ist, kann es geändert und gespeichert werden:

 tag.setArtist(u"Cro-Mags")
 tag.setAlbum(u"Age of Quarrel")
 tag.update()

Wenn das verknüpfte Tag v2 war und Sie es als v1 speichern möchten:

 tag.update(eyeD3.ID3_V1_1)

Lesen Sie ein Tag ein und entfernen Sie es aus der Datei:

 tag.link("/some/file.mp3")
 tag.remove()
 tag.update()

Fügen Sie ein neues Tag hinzu:

 tag = eyeD3.Tag()
 tag.link('/some/file.mp3')    # no tag in this file, link returned False
 tag.header.setVersion(eyeD3.ID3_V2_3)
 tag.setArtist('Fugazi')
 tag.update()

19
eyeD3 ist auch GPL ... Wenn Sie also wie ich vorhaben , es in Ihrem Programm zu verwenden, müssen Sie Ihr Programm auch als kostenloses Programm veröffentlichen ... verdammt noch mal, warum können sie es nicht unter LGPL veröffentlichen?
Ciantic

9
@Ciantic: ID3-Tags sind extrem einfach. Warum erstellen Sie keine Bibliothek selbst und geben sie unter BSD frei? Außerdem besitzen diese Leute dir überhaupt nichts. Schauen Sie hier diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, ID3v1-Tags sind einfach, ID3v2-Tags sind höllisch kompliziert ... Und jetzt habe ich einen BSD-Wrapper für pytagger github.com/Ciantic/songdetails erstellt. Ich habe ihn noch nicht als veröffentlicht markiert, aber er funktioniert.
Ciantic

5
Verwenden Sie in der neueren Version import eyed3(Kleinbuchstaben d).
Jake Z

4
Beachten Sie, dass diese Hinweise für eine ältere Version von eyed3 gelten und nicht mehr gut funktionieren. Zum Beispiel ist die Funktion link () weggegangen und Attribute werden jetzt ohne die Setter deklarativ gesetzt.
mlissner

37

Ich habe zuvor Mutagen verwendet , um Tags in Mediendateien zu bearbeiten. Das Schöne an Mutagen ist, dass es andere Formate wie mp4, FLAC usw. verarbeiten kann. Ich habe mehrere Skripte mit viel Erfolg mit dieser API geschrieben.


2
code.google.com/p/mutagen - Beachten Sie auch, dass Mutagen eine GPL ist, sodass dies für die meisten Projekte kein Nein ist.
Ciantic

3
Mutagen ist nett, aber mir fehlt eine einheitliche Methode, um den Künstler, das Titelgenre usw. zu ermitteln. Am Ende müssen Sie die verschiedenen Tasten kennen, die vom Format abhängig sind. TIT2für mp3, titlefür ogg, \xa9namfür mp4, Titlefür WMA etc. - das ist scheiße.
Hat aufgehört - Anony-Mousse

20

Ein Problem mit eyed3ist, dass es NotImplementedError("Unable to write ID3 v2.2")für gängige MP3-Dateien werfen wird .

Nach meiner Erfahrung arbeitet die mutagenKlasse EasyID3zuverlässiger. Beispiel:

from mutagen.easyid3 import EasyID3

audio = EasyID3("example.mp3")
audio['title'] = u"Example Title"
audio['artist'] = u"Me"
audio['album'] = u"My album"
audio['composer'] = u"" # clear
audio.save()

Auf alle anderen Tags kann auf diese Weise zugegriffen und gespeichert werden, was den meisten Zwecken dient. Weitere Informationen finden Sie im Mutagen Tutorial .


13

Was Sie suchen, ist das ID3- Modul. Es ist sehr einfach und gibt Ihnen genau das, was Sie brauchen. Kopieren Sie einfach die ID3.py-Datei in Ihr Site-Packages-Verzeichnis, und Sie können Folgendes tun:

from ID3 import *
try:
  id3info = ID3('file.mp3')
  print id3info
  # Change the tags
  id3info['TITLE'] = "Green Eggs and Ham"
  id3info['ARTIST'] = "Dr. Seuss"
  for k, v in id3info.items():
    print k, ":", v
except InvalidTagError, message:
  print "Invalid ID3 tag:", message

12
Nur eine Notiz. Dieses Modul ist sehr alt (2002) und unterstützt nicht V2 von ID3-Tags
Eli Bendersky

8

Schau dir das an:

https://github.com/Ciantic/songdetails

Anwendungsbeispiel:

>>> import songdetails
>>> song = songdetails.scan("data/song.mp3")
>>> print song.duration
0:03:12

Änderungen speichern:

>>> import songdetails
>>> song = songdetails.scan("data/commit.mp3")
>>> song.artist = "Great artist"
>>> song.save()


6

Ein einfaches Beispiel aus dem Buch Dive Into Python funktioniert für mich in Ordnung. Dies ist der Download-Link. Das Beispiel ist fileinfo.py. Ich weiß nicht, ob es das Beste ist, aber es kann den grundlegenden Job machen.

Das gesamte Buch ist hier online verfügbar .


3
Dieses Beispiel ist jetzt etwas veraltet, sowohl in Bezug auf die Python-Version als auch in Bezug auf die ID3-Version ...
Bex

Beide Links funktionieren nicht mehr. (Ich weiß, die Antwort ist 9 Jahre alt) Wenn Sie nach dem Online-Buch "Dive into Python" suchen, ist hier der aktuelle Link
Edwin van Mierlo

Dieser Link funktioniert auch nicht mehr. Das Beste, was ich jetzt schnell googeln kann, ist github.com/diveintomark/diveintopython3
Tripleee

6

Ich habe mir die obigen Antworten angesehen und festgestellt, dass sie aufgrund von Lizenzproblemen mit der GPL nicht für mein Projekt geeignet sind.

Und ich habe Folgendes herausgefunden: PyID3Lib verwendet zwar das Veröffentlichungsdatum der Python-Bindung , verwendet jedoch die ID3Lib , die selbst auf dem neuesten Stand ist.

Bemerkenswert ist, dass beide LGPL sind und gut zu gehen sind.


4

Die einfachste Methode sind Songdetails .

zum Lesen von Daten

import songdetails
song = songdetails.scan("blah.mp3")
if song is not None:
    print song.artist

ähnlich zum bearbeiten

import songdetails
song = songdetails.scan("blah.mp3")
if song is not None:
    song.artist = u"The Great Blah"
    song.save()

Vergessen Sie nicht , hinzuzufügen u vor Namen , bis Sie chinesische Sprache kennen.

Sie können mit dem Python Glob-Modul in großen Mengen lesen und bearbeiten

Ex.

import glob
songs = glob.glob('*')   // script should be in directory of songs.
for song in songs:
    // do the above work.

4

Nachdem pip installich die hier empfohlene einfache Route für eyeD3-, pytaglib- und ID3-Module ausprobiert hatte, stellte ich fest, dass diese vierte Option die einzige war, die funktionierte. Der Rest hatte Importfehler mit fehlenden Abhängigkeiten in C ++ oder etwas Magischem oder einer anderen Bibliothek, die pipfehlte. Gehen Sie also mit diesem zum grundlegenden Lesen von ID3-Tags (alle Versionen):

https://pypi.python.org/pypi/tinytag/0.18.0

from tinytag import TinyTag
tag = TinyTag.get('/some/music.mp3')

Liste möglicher Attribute, die Sie mit TinyTag erhalten können:

tag.album         # album as string
tag.albumartist   # album artist as string
tag.artist        # artist name as string
tag.audio_offset  # number of bytes before audio data begins
tag.bitrate       # bitrate in kBits/s
tag.disc          # disc number
tag.disc_total    # the total number of discs
tag.duration      # duration of the song in seconds
tag.filesize      # file size in bytes
tag.genre         # genre as string
tag.samplerate    # samples per second
tag.title         # title of the song
tag.track         # track number as string
tag.track_total   # total number of tracks as string
tag.year          # year or data as string

Es war winzig und in sich geschlossen, wie angekündigt.


1
neuere Version für Tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

Die erste Antwort, die eyed3 verwendet, ist veraltet. Hier ist eine aktualisierte Version davon.

Tags aus einer MP3-Datei lesen:

 import eyed3

 audiofile = eyed3.load("some/file.mp3")
 print(audiofile.tag.artist)
 print(audiofile.tag.album)
 print(audiofile.tag.album_artist)
 print(audiofile.tag.title)
 print(audiofile.tag.track_num)

Ein Beispiel von der Website zum Ändern von Tags:

 import eyed3

 audiofile = eyed3.load("some/file.mp3")
 audiofile.tag.artist = u"Integrity"
 audiofile.tag.album = u"Humanity Is The Devil"
 audiofile.tag.album_artist = u"Integrity"
 audiofile.tag.title = u"Hollow"
 audiofile.tag.track_num = 2

Ein Problem, auf das ich beim ersten Versuch mit eyed3 gestoßen bin, hatte mit einem Importfehler von libmagic zu tun, obwohl es installiert war. Um dies zu beheben, installieren Sie den Magic-Bin Whl von hier aus


2

Ich würde mp3-tagger vorschlagen . Das Beste daran ist, dass es unter MIT-Lizenz vertrieben wird und alle erforderlichen Attribute unterstützt.

- artist;
- album;
- song;
- track;
- comment;
- year;
- genre;
- band;
- composer;
- copyright;
- url;
- publisher.

Beispiel:

from mp3_tagger import MP3File

# Create MP3File instance.
mp3 = MP3File('File_Name.mp3')

# Get all tags.
tags = mp3.get_tags()
print(tags)

Es unterstützt das Festlegen, Abrufen, Aktualisieren und Löschen von Attributen von MP3-Dateien.


1

Es kann genau davon abhängen, was Sie zusätzlich zum Lesen der Metadaten tun möchten. Wenn Sie nur die Bitrate / den Namen usw. benötigen und sonst nichts, ist wahrscheinlich etwas Leichtes am besten.

Wenn Sie die MP3-Datei manipulieren, ist PyMedia möglicherweise geeignet.

Es gibt ziemlich viele, was auch immer Sie bekommen, stellen Sie sicher und testen Sie es auf vielen Beispielmedien. Insbesondere gibt es einige verschiedene Versionen von ID3-Tags. Stellen Sie daher sicher, dass diese nicht zu veraltet sind.

Persönlich habe ich diese kleine MP3Info-Klasse mit etwas Glück benutzt. Es ist allerdings ziemlich alt.

http://www.omniscia.org/~vivake/python/MP3Info.py


0

Nach anfänglichen Recherchen dachte ich, dass Songdetails zu meinem Anwendungsfall passen könnten, aber es werden keine .m4b-Dateien verarbeitet. Mutagen tut es. Beachten Sie, dass einige (vernünftigerweise) Probleme mit Mutagens Auftauchen von format-nativen Schlüsseln haben, die jedoch von Format zu Format variieren (TIT2 für mp3, Titel für ogg, \ xa9nam für mp4, Titel für WMA usw.), mutagen.File ( ) hat einen (neuen?) easy = True-Parameter, der EasyMP3 / EasyID3-Tags bereitstellt, die einen konsistenten, wenn auch begrenzten Schlüsselsatz haben. Bisher habe ich nur begrenzte Tests durchgeführt, aber die allgemeinen Tasten wie Album, Künstler, Albumartist, Genre, Tracknummer, Discnumber usw. sind alle vorhanden und für .mb4- und .mp3-Dateien identisch, wenn easy = True verwendet wird sehr praktisch für meine Zwecke.


0

Verwenden von https://github.com/nicfit/eyeD3

import eyed3
import os

for root,  dirs, files in os.walk(folderp):
    for file in files:
        try:
            if file.find(".mp3") < 0:
                continue
            path = os.path.abspath(os.path.join(root , file))
            t = eyed3.load(path)
            print(t.tag.title , t.tag.artist)
            #print(t.getArtist())
        except Exception as e:
            print(e)
            continue

Können Sie dies erklären und erklären?
Nelles

0

Ich habe tinytag 1.3.1 verwendet, weil

  1. Es wird aktiv unterstützt:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Es unterstützt die wichtigsten Formate:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Der Code hat in nur wenigen Minuten der Entwicklung funktioniert.
from tinytag import TinyTag

fileNameL ='''0bd1ab5f-e42c-4e48-a9e6-b485664594c1.mp3
0ea292c0-2c4b-42d4-a059-98192ac8f55c.mp3
1c49f6b7-6f94-47e1-a0ea-dd0265eb516c.mp3
5c706f3c-eea4-4882-887a-4ff71326d284.mp3
'''.split()

for fn in fileNameL:
    fpath = './data/'+fn
    tag = TinyTag.get(fpath)
    print()
    print('"artist": "%s",' % tag.artist)
    print('"album": "%s",' % tag.album)
    print('"title": "%s",' % tag.title)
    print('"duration(secs)": "%s",' % tag.duration)
  • ERGEBNIS
JoeTagPj>python joeTagTest.py

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "17. Thomas Middleditch and Ben Schwartz",
"duration(secs)": "3565.1829583532785",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "Are you ready to make friends?",
"duration(secs)": "417.71840447045264",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "Introducing Conan’s new podcast",
"duration(secs)": "327.22187551899646",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "19. Ray Romano",
"duration(secs)": "3484.1986772305863",

C:\1d\PodcastPjs\JoeTagPj>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.