Accéder aux métadonnées MP3 avec Python [fermé]


122

Comment puis-je récupérer des métadonnées MP3 en Python?

Réponses:


106

J'ai utilisé eyeD3 l'autre jour avec beaucoup de succès. J'ai trouvé qu'il pouvait ajouter des illustrations à la balise ID3, ce que les autres modules que j'ai examinés ne pouvaient pas. Vous devrez installer à l'aide de pip ou télécharger le tar et l'exécuter à python setup.py installpartir du dossier source.

Vous trouverez ci-dessous des exemples pertinents tirés du site Web.

Lecture du contenu d'un fichier mp3 contenant des informations de balise v1 ou v2:

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

Lisez un fichier mp3 (longueur de la piste, débit, etc.) et accédez à sa balise:

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

Des versions de balises spécifiques peuvent être sélectionnées:

 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.

Ou vous pouvez parcourir les images brutes:

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

Une fois qu'une balise est liée à un fichier, elle peut être modifiée et enregistrée:

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

Si le tag lié était v2 et que vous souhaitez l'enregistrer en tant que v1:

 tag.update(eyeD3.ID3_V1_1)

Lisez une balise et supprimez-la du fichier:

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

Ajouter un nouveau tag:

 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 est également GPL ... donc si comme moi vous prévoyez de l'utiliser sur votre programme, vous devez également publier votre programme en tant que programme gratuit ... sacrément avec ces gens, pourquoi ne peuvent-ils pas le publier sous LGPL?
Ciantic

9
@Ciantic: Les balises ID3 sont extrêmement simples, pourquoi ne pas créer vous-même une bibliothèque et la publier sous BSD? De plus, ce peuple ne vous possède rien en premier lieu. Regardez ici diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, les tags ID3v1 sont simples, les tags ID3v2 sont compliqués comme l'enfer ... Et maintenant j'ai créé un wrapper BSD pour pytagger github.com/Ciantic/songdetails Je ne l'ai pas encore tagué comme publié, mais cela fonctionne.
Ciantic

5
Dans la version la plus récente, utilisez import eyed3(d minuscule).
Jake Z

4
Notez que ces notes concernent une ancienne version d'eyed3 et ne fonctionneront plus correctement. Par exemple, la fonction link () a disparu et les attributs sont maintenant définis de manière déclarative, sans les setters.
mlissner

37

J'ai déjà utilisé mutagen pour modifier les balises dans les fichiers multimédias. L'avantage de mutagen est qu'il peut gérer d'autres formats, tels que mp4, FLAC, etc. J'ai écrit plusieurs scripts avec beaucoup de succès en utilisant cette API.


2
code.google.com/p/mutagen - Notez également que Mutagen est GPL, ce qui est non-non pour la plupart des projets.
Ciantic

3
Mutagen est bien, mais il me manque un moyen uniforme pour obtenir l'artiste, le genre du titre, etc. - vous finissez par devoir connaître les différentes touches, qui dépendent du format. TIT2pour mp3, titlepour ogg, \xa9nampour mp4, Titlepour WMA etc. - ça craint.
A QUITTER - Anony-Mousse

20

Un problème avec eyed3est qu'il lancera NotImplementedError("Unable to write ID3 v2.2")des fichiers MP3 courants.

D'après mon expérience, la mutagenclasse EasyID3fonctionne de manière plus fiable. Exemple:

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()

Toutes les autres balises peuvent être accédées de cette façon et enregistrées, ce qui servira à la plupart des fins. Pour plus d'informations, consultez le didacticiel Mutagen .


13

Ce que vous recherchez, c'est le module ID3 . C'est très simple et vous donnera exactement ce dont vous avez besoin. Copiez simplement le fichier ID3.py dans votre répertoire site-packages et vous pourrez faire quelque chose comme ce qui suit:

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
Juste une note. Ce module est très ancien (2002) et ne prend pas en charge V2 des tags ID3
Eli Bendersky

8

vérifiez celui-ci:

https://github.com/Ciantic/songdetails

Exemple d'utilisation:

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

Enregistrer les modifications:

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

7

Juste des informations supplémentaires pour vous les gars:

jetez un œil à la section " Trucs MP3 et éditeurs de métadonnées" dans la page de PythonInMusic .


6

Un exemple simple du livre Plongez au coeur de Python fonctionne bien pour moi, c'est le lien de téléchargement, l'exemple est fileinfo.py. Je ne sais pas si c'est le meilleur, mais cela peut faire le travail de base.

Le livre entier est disponible en ligne ici .


3
Cet exemple est un peu dépassé maintenant, à la fois en termes de version python et en termes de version ID3 ...
Bex

les deux liens ne fonctionnent plus. (Je sais que la réponse est de 9 ans) Si vous cherchez le livre en ligne "Dive into Python", voici le lien
Edwin van Mierlo

Ce lien ne fonctionne plus non plus. Le mieux que je puisse rapidement google maintenant est github.com/diveintomark/diveintopython3
tripleee

6

J'ai regardé les réponses ci-dessus et j'ai découvert qu'elles ne sont pas bonnes pour mon projet en raison de problèmes de licence avec GPL.

Et j'ai découvert ceci: PyID3Lib , bien que cette date de sortie de liaison python particulière soit ancienne, elle utilise l' ID3Lib , qui est elle-même à jour.

Il convient de mentionner que les deux sont LGPL et sont prêts à partir.


4

La méthode la plus simple est les détails de la chanson .

pour lire des données

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

de même pour modifier

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

N'oubliez pas d'ajouter u avant le nom jusqu'à ce que vous connaissiez la langue chinoise.

vous pouvez lire et éditer en vrac à l'aide du module python glob

ex.

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

4

Après avoir essayé la pip installvoie simple pour les modules eyeD3, pytaglib et ID3 recommandée ici, j'ai trouvé que cette quatrième option était la seule à fonctionner. Le reste avait des erreurs d'importation avec des dépendances manquantes en C ++ ou quelque chose de magique ou une autre bibliothèque qui pipmanquait. Alors allez avec celui-ci pour la lecture de base des balises ID3 (toutes versions):

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

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

Liste des attributs possibles que vous pouvez obtenir avec TinyTag:

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

C'était minuscule et autonome, comme annoncé.


1
version plus récente pour tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

La première réponse qui utilise eyed3 est obsolète, voici donc une version mise à jour de celle-ci.

Lire des balises à partir d'un fichier mp3:

 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)

Un exemple du site Web pour modifier les balises:

 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

Un problème que j'ai rencontré en essayant d'utiliser eyed3 pour la première fois était lié à une erreur d'importation de libmagic même s'il était installé. Pour résoudre ce problème, installez le magic-bin whl à partir d' ici


2

Je suggérerais mp3-tagger . La meilleure chose à ce sujet est qu'il est distribué sous licence MIT et prend en charge tous les attributs requis.

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

Exemple:

from mp3_tagger import MP3File

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

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

Il prend en charge définir, obtenir, mettre à jour et supprimer les attributs des fichiers mp3.


1

Cela peut dépendre exactement de ce que vous voulez faire en plus de la lecture des métadonnées. Si c'est simplement le débit / le nom, etc. dont vous avez besoin, et rien d'autre, quelque chose de léger est probablement le meilleur.

Si vous manipulez le mp3 au-delà, PyMedia peut convenir.

Il y en a pas mal, quoi que vous obteniez, assurez-vous et testez-le sur de nombreux exemples de supports. Il existe en particulier quelques versions différentes des balises ID3, alors assurez-vous qu'elles ne sont pas trop obsolètes.

Personnellement, j'ai utilisé cette petite classe MP3Info avec chance. C'est assez vieux cependant.

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


0

Après quelques recherches initiales, j'ai pensé que les détails des morceaux pourraient convenir à mon cas d'utilisation, mais ils ne gèrent pas les fichiers .m4b. Mutagène le fait. Notez que si certains ont (raisonnablement) contesté la mise en évidence par Mutagen des clés natives de format, qui varient d'un format à l'autre (TIT2 pour mp3, titre pour ogg, \ xa9nam pour mp4, titre pour WMA etc.), mutagen.File ( ) a un (nouveau?) paramètre easy = True qui fournit des balises EasyMP3 / EasyID3, qui ont un ensemble de clés cohérent, quoique limité. Je n'ai fait que des tests limités jusqu'à présent, mais les clés communes, comme l'album, l'artiste, l'albumartiste, le genre, le numéro de piste, le numéro de disc, etc. sont toutes présentes et identiques pour les fichiers .mb4 et .mp3 lorsque vous utilisez easy = True, ce qui en fait très pratique pour mes besoins.


0

en utilisant 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

Pouvez-vous fournir une explication à ce sujet?
Nelles le

0

J'ai utilisé tinytag 1.3.1 car

  1. Il est activement soutenu:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Il prend en charge les principaux formats:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Le code A FONCTIONNÉ en quelques minutes de développement.
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)
  • RÉSULTAT
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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.