Acceso a metadatos MP3 con Python [cerrado]


Respuestas:


106

Utilicé eyeD3 el otro día con mucho éxito. Descubrí que podía agregar ilustraciones a la etiqueta ID3 que los otros módulos que miré no podían. Tendrás que instalar usando pip o descargar el tar y ejecutar python setup.py installdesde la carpeta de origen.

A continuación se muestran ejemplos relevantes del sitio web.

Lectura del contenido de un archivo mp3 que contiene información de etiqueta v1 o v2:

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

Lea un archivo mp3 (longitud de la pista, velocidad de bits, etc.) y acceda a su etiqueta:

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

Se pueden seleccionar versiones específicas de etiquetas:

 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.

O puede iterar sobre los cuadros sin formato:

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

Una vez que una etiqueta está vinculada a un archivo, se puede modificar y guardar:

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

Si la etiqueta vinculada era v2 y desea guardarla como v1:

 tag.update(eyeD3.ID3_V1_1)

Lea una etiqueta y elimínela del archivo:

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

Añadir una nueva etiqueta:

 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 también es GPL ... así que si como yo planeas usarlo en tu programa, debes lanzar tu programa como un programa gratuito también ... maldita sea con estas personas, ¿por qué no pueden lanzarlo bajo LGPL?
Ciantic

9
@Ciantic: las etiquetas ID3 son extremadamente simples, ¿por qué no crea una biblioteca usted mismo y la libera bajo BSD? Además, esta gente no te posee nada en primer lugar. Mire aquí diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, las etiquetas ID3v1 son simples, las etiquetas ID3v2 son complicadas ... Y ahora he creado BSD wrapper para pytagger github.com/Ciantic/songdetails No lo he etiquetado aún cuando se lanzó, pero funciona.
Ciantic

55
En la versión más nueva, use import eyed3(d minúscula).
Jake Z

44
Tenga en cuenta que estas notas son para una versión anterior de eyed3 y ya no funcionarán bien. Por ejemplo, la función link () ha desaparecido y los atributos se establecen declarativamente ahora, sin los establecedores.
mlissner

37

He usado mutagen para editar etiquetas en archivos multimedia antes. Lo bueno de mutagen es que puede manejar otros formatos, como mp4, FLAC, etc. He escrito varios scripts con mucho éxito utilizando esta API.


2
code.google.com/p/mutagen : tenga en cuenta también que Mutagen es GPL, por lo que es un no-no para la mayoría de los proyectos.
Ciantic

3
Mutagen es agradable, sin embargo, me falta una forma uniforme de obtener el artista, el género del título, etc., terminas teniendo que conocer las diferentes teclas, que dependen del formato. TIT2para mp3, titlepara ogg, \xa9nampara mp4, Titlepara WMA, etc., eso apesta.
HA SALIDO - Anony-Mousse

20

Un problema con eyed3es que arrojará NotImplementedError("Unable to write ID3 v2.2")archivos MP3 comunes.

En mi experiencia, la mutagenclase EasyID3funciona de manera más confiable. Ejemplo:

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

Se puede acceder a todas las otras etiquetas de esta manera y guardarlas, lo que servirá para la mayoría de los propósitos. Se puede encontrar más información en el Tutorial de Mutagen .


13

Lo que buscas es el módulo ID3 . Es muy simple y le dará exactamente lo que necesita. Simplemente copie el archivo ID3.py en el directorio de paquetes de su sitio y podrá hacer algo como lo siguiente:

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
Solo una nota. Este módulo es muy antiguo (2002) y no admite V2 de etiquetas ID3
Eli Bendersky

8

mira este:

https://github.com/Ciantic/songdetails

Ejemplo de uso:

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

Guardando cambios:

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

7

Solo información adicional para ustedes:

eche un vistazo a la sección "Cosas MP3 y editores de metadatos" en la página de PythonInMusic .


6

Un ejemplo simple del libro Dive Into Python funciona bien para mí, esto es el enlace de descarga, el ejemplo es fileinfo.py. No sé si es lo mejor, pero puede hacer el trabajo básico.

El libro completo está disponible en línea aquí .


3
Ese ejemplo está un poco desactualizado ahora, tanto en términos de la versión de Python como en términos de la versión ID3 ...
Bex

ambos enlaces ya no funcionan. (Sé que la respuesta tiene 9 años) Si está buscando el libro en línea "Sumérjase en Python", aquí está el enlace actual
Edwin van Mierlo

Ese enlace ya no funciona. Lo mejor que pude buscar
tripleee

6

Miré las respuestas anteriores y descubrí que no son buenas para mi proyecto debido a problemas de licencia con GPL.

Y descubrí esto: PyID3Lib , aunque esa fecha de lanzamiento de enlace de Python en particular es antigua, usa ID3Lib , que está actualizada.

Cabe mencionar que ambos son LGPL y están listos para comenzar.


4

El método más fácil es detalles de canciones .

para leer datos

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

de manera similar para editar

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

No olvides agregarte antes del nombre hasta que conozca el lenguaje chino.

Puedes leer y editar en masa usando el módulo Python Glob

ex.

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

4

Después de probar la pip installruta simple para los módulos eyeD3, pytaglib e ID3 recomendados aquí, encontré que esta cuarta opción era la única que funcionaba. El resto tenía errores de importación con dependencias faltantes en C ++ o algo mágico o alguna otra biblioteca quepip faltaba. Así que vaya con este para la lectura básica de las etiquetas ID3 (todas las versiones):

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

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

Lista de posibles atributos que puede obtener con 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

Era pequeño y autónomo, como se anunciaba.


1
versión más reciente para tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

La primera respuesta que usa eyed3 está desactualizada, así que aquí hay una versión actualizada de la misma.

Lectura de etiquetas de un archivo 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 ejemplo del sitio web para modificar etiquetas:

 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 problema que encontré al intentar usar eyed3 por primera vez tuvo que ver con un error de importación de libmagic a pesar de que estaba instalado. Para solucionar esto, instale el magic-bin whl desde aquí


2

Sugeriría mp3-tagger . Lo mejor de esto es que se distribuye bajo licencia MIT y admite todos los atributos requeridos.

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

Ejemplo:

from mp3_tagger import MP3File

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

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

Es compatible con establecer, obtener, actualizar y eliminar atributos de archivos mp3.


1

Puede depender exactamente de lo que desea hacer además de leer los metadatos. Si lo que necesita es simplemente la tasa de bits / nombre, etc., y nada más, probablemente lo mejor sea algo liviano.

Si está manipulando el pasado mp3, PyMedia puede ser adecuado.

Hay bastantes, lo que sea que consigas, asegúrate y pruébalo en muchos medios de muestra. Hay algunas versiones diferentes de etiquetas ID3 en particular, así que asegúrese de que no esté demasiado desactualizado.

Personalmente, he usado esta pequeña clase de MP3Info con suerte. Sin embargo, es bastante viejo.

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


0

Después de una investigación inicial, pensé que los detalles de las canciones podrían ajustarse a mi caso de uso, pero no maneja archivos .m4b. Mutagen lo hace. Tenga en cuenta que, si bien algunos (razonablemente) han tenido problemas con la aparición de Mutagen de claves nativas de formato, que varían de formato a formato (TIT2 para mp3, título para ogg, \ xa9nam para mp4, Título para WMA, etc.), mutagen.File ( ) tiene un parámetro (¿nuevo?) easy = True que proporciona etiquetas EasyMP3 / EasyID3, que tienen un conjunto de claves coherente, aunque limitado. Hasta ahora solo he realizado pruebas limitadas, pero las claves comunes, como álbum, artista, albumartista, género, número de pista, número de disco, etc., están presentes e son idénticas para los archivos .mb4 y .mp3 cuando se usa easy = True, lo que lo hace Muy conveniente para mis propósitos.


0

usando 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

¿Puede proporcionar una explicación para esto?
Nelles

0

Solía Tinytag 1.3.1 porque

  1. Se apoya activamente:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Es compatible con los principales formatos:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. El código funcionó en solo unos minutos de desarrollo.
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)
  • RESULTADO
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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.