Accesso ai metadati MP3 con Python [chiuso]


Risposte:


106

Ho usato eyeD3 l'altro giorno con molto successo. Ho scoperto che poteva aggiungere grafica al tag ID3 che gli altri moduli che ho visto non potevano. Dovrai installare usando pip o scaricare il tar ed eseguirlo python setup.py installdalla cartella di origine.

Di seguito sono riportati esempi rilevanti dal sito web.

Lettura del contenuto di un file mp3 contenente le informazioni sui tag v1 o v2:

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

Leggi un file mp3 (lunghezza della traccia, bitrate, ecc.) E accedi al suo tag:

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

È possibile selezionare versioni di tag specifiche:

 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.

Oppure puoi iterare sui frame grezzi:

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

Una volta che un tag è collegato a un file, può essere modificato e salvato:

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

Se il tag collegato era v2 e desideri salvarlo come v1:

 tag.update(eyeD3.ID3_V1_1)

Leggi un tag e rimuovilo dal file:

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

Aggiungi un nuovo 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 è anche GPL ... quindi se come me prevedi di usarlo sul tuo programma devi rilasciare il tuo programma anche come programma gratuito ... dannazione con queste persone, perché non possono rilasciare sotto LGPL?
Ciantic

9
@Ciantic: i tag ID3 sono estremamente semplici, perché non crei tu stesso una libreria e la rilasci sotto BSD? Inoltre, questa gente non ti possiede nulla in primo luogo. Guarda qui diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, i tag ID3v1 sono semplici, i tag ID3v2 sono complicati da morire ... E ora ho creato il wrapper BSD per pytagger github.com/Ciantic/songdetails Non l'ho ancora etichettato come rilasciato, ma funziona.
Ciantic

5
Nella versione più recente, usa import eyed3(d minuscola).
Jake Z

4
Nota che queste note sono per una versione precedente di eyed3 e non funzioneranno più bene. Ad esempio, la funzione link () è scomparsa e gli attributi sono ora impostati in modo dichiarativo, senza i setter.
mlissner

37

Ho già usato mutagen per modificare i tag nei file multimediali. La cosa bella di mutagen è che può gestire altri formati, come mp4, FLAC, ecc. Ho scritto diversi script con molto successo usando questa API.


2
code.google.com/p/mutagen - Nota anche che Mutagen è GPL, quindi è no-no per la maggior parte dei progetti.
Ciantic

3
Mutagen è carino, tuttavia mi manca un modo uniforme per ottenere l'artista, il genere del titolo, ecc. - Alla fine devi conoscere le varie chiavi, che dipendono dal formato. TIT2per mp3, titleper ogg, \xa9namper mp4, Titleper WMA ecc. - che fa schifo.
HA QUIT - Anony-Mousse

20

Un problema eyed3è che verrà lanciato NotImplementedError("Unable to write ID3 v2.2")per i file MP3 comuni.

Nella mia esperienza, la mutagenclasse EasyID3funziona in modo più affidabile. Esempio:

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

È possibile accedere a tutti gli altri tag in questo modo e salvarli, il che servirà per la maggior parte degli scopi. Maggiori informazioni possono essere trovate nel Tutorial Mutagen .


13

Quello che stai cercando è il modulo ID3 . È molto semplice e ti darà esattamente ciò di cui hai bisogno. Copia semplicemente il file ID3.py nella directory dei pacchetti del tuo sito e sarai in grado di fare qualcosa del genere:

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. Questo modulo è molto vecchio (2002) e non supporta la V2 dei tag ID3
Eli Bendersky

8

controlla questo:

https://github.com/Ciantic/songdetails

Esempio di utilizzo:

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

Salvataggio delle modifiche:

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

7

Solo informazioni aggiuntive per voi ragazzi:

dai un'occhiata alla sezione " Cose MP3 ed editor di metadati" nella pagina di PythonInMusic .


6

Un semplice esempio tratto dal libro Dive Into Python funziona bene per me, questo è il link per il download, l'esempio è fileinfo.py. Non so se sia il migliore, ma può fare il lavoro di base.

L'intero libro è disponibile online qui .


3
Quell'esempio è un po 'obsoleto ora, sia in termini di versione python che in termini di versione ID3 ...
Bex

entrambi i collegamenti non funzionano più. (So ​​che la risposta è di 9 anni) Se stai cercando il libro online "Dive into Python", ecco il link
Edwin van Mierlo

Anche quel collegamento non funziona più. Il meglio che potrei rapidamente google ora è github.com/diveintomark/diveintopython3
tripleee

6

Ho guardato le risposte sopra e ho scoperto che non sono adatte al mio progetto a causa di problemi di licenza con GPL.

E ho scoperto questo: PyID3Lib , mentre quella particolare data di rilascio dell'associazione Python è vecchia, utilizza ID3Lib , che a sua volta è aggiornato.

Degno di nota è che entrambi sono LGPL e sono pronti per l'uso.


4

il metodo più semplice è songdetails ..

per leggere i dati

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

allo stesso modo per la modifica

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

Non dimenticare di aggiungere u prima del nome finché non conosci la lingua cinese.

puoi leggere e modificare in blocco usando il modulo glob python

ex.

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

4

Dopo aver provato il pip installpercorso semplice per i moduli eyeD3, pytaglib e ID3 consigliato qui, ho scoperto che questa quarta opzione era l'unica che funzionava. Il resto aveva errori di importazione con dipendenze mancanti in C ++ o qualcosa di magico o qualche altra libreria che pipmancava. Quindi segui questo per la lettura di base dei tag ID3 (tutte le versioni):

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

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

Elenco dei possibili attributi che puoi ottenere 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 minuscolo e autonomo, come pubblicizzato.


1
versione più recente di tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

La prima risposta che utilizza eyed3 è obsoleta, quindi ecco una versione aggiornata di esso.

Lettura di tag da un file 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 esempio dal sito web per modificare i tag:

 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 che ho riscontrato durante il tentativo di utilizzare eyed3 per la prima volta aveva a che fare con un errore di importazione di libmagic anche se era installato. Per risolvere questo problema, installa il magic-bin whl da qui


2

Suggerirei mp3-tagger . La cosa migliore di questo è che è distribuito con licenza MIT e supporta tutti gli attributi richiesti.

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

Esempio:

from mp3_tagger import MP3File

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

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

Supporta impostare, ottenere, aggiornare ed eliminare gli attributi dei file mp3.


1

Può dipendere esattamente da cosa vuoi fare oltre alla lettura dei metadati. Se hai bisogno solo del bitrate / nome ecc., E nient'altro, qualcosa di leggero è probabilmente il migliore.

Se stai manipolando il passato mp3, PyMedia potrebbe essere adatto.

Ce ne sono un bel po ', qualunque cosa tu ottenga, assicurati e provalo su molti supporti di esempio. Ci sono alcune versioni differenti dei tag ID3 in particolare, quindi assicurati che non siano troppo obsolete.

Personalmente ho usato questa piccola classe MP3Info con fortuna. È piuttosto vecchio però.

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


0

Dopo alcune ricerche iniziali, ho pensato che i dettagli delle canzoni potessero adattarsi al mio caso d'uso, ma non gestisce i file .m4b. Il mutageno lo fa. Nota che mentre alcuni hanno (ragionevolmente) messo in discussione la comparsa di Mutagen di chiavi native del formato, che variano da formato a formato (TIT2 per mp3, titolo per ogg, \ xa9nam per mp4, titolo per WMA ecc.), Mutagen.File ( ) ha un (nuovo?) parametro easy = True che fornisce tag EasyMP3 / EasyID3, che hanno un set di chiavi coerente, anche se limitato. Finora ho eseguito solo test limitati, ma le chiavi comuni, come album, artista, artista dell'album, genere, numero di traccia, numero di disco, ecc. Sono tutte presenti e identiche per i file .mb4 e .mp3 quando si utilizza easy = True, rendendolo molto conveniente per i miei scopi.


0

utilizzando 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

Potete fornire una spiegazione per questo?
Nelles

0

Ho usato tinytag 1.3.1 perché

  1. È attivamente supportato:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Supporta i principali formati:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Il codice ha FUNZIONATO in pochi minuti di sviluppo.
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)
  • RISULTATO
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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.