Acessando metadados MP3 com Python [fechado]


Respostas:


106

Eu usei o eyeD3 outro dia com muito sucesso. Descobri que ele poderia adicionar arte-final à tag ID3 que os outros módulos que eu observei não conseguiam. Você terá que instalar usando pip ou baixar o tar e executar a python setup.py installpartir da pasta de origem.

Exemplos relevantes do site estão abaixo.

Lendo o conteúdo de um arquivo mp3 contendo as informações da tag v1 ou v2:

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

Leia um arquivo mp3 (comprimento da faixa, taxa de bits, etc.) e acesse a tag:

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

Versões de tags específicas podem ser selecionadas:

 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 você pode iterar sobre os quadros brutos:

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

Depois que uma tag é vinculada a um arquivo, ela pode ser modificada e salva:

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

Se a tag vinculada foi v2 e você deseja salvá-la como v1:

 tag.update(eyeD3.ID3_V1_1)

Leia uma tag e remova-a do arquivo:

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

Adicione uma nova 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
O eyeD3 também é GPL ... então se, como eu, você planeja usá-lo em seu programa, você deve lançá-lo como um programa gratuito também ... danado com essas pessoas, por que eles não podem ser lançados sob LGPL?
Ciantic

9
@Ciantic: as tags ID3 são extremamente simples, por que você não cria uma biblioteca e a libera no BSD? Além disso, essas pessoas não possuem nada para você em primeiro lugar. Olhe aqui diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Kuber

2
@voyager, as tags ID3v1 são simples, as tags ID3v2 são complicadas como o inferno ... E agora eu criei o wrapper BSD para o pytagger github.com/Ciantic/songdetails Ainda não o etiquetei como lançado, mas funciona.
Ciantic

5
Na versão mais recente, use import eyed3(d minúsculo).
Jake Z

4
Observe que essas notas são para uma versão mais antiga do eyed3 e não funcionarão mais. Por exemplo, a função link () desapareceu e os atributos são definidos declarativamente agora, sem os configuradores.
mlissner

37

Eu usei o mutagen para editar tags em arquivos de mídia antes. O bom do mutagen é que ele pode lidar com outros formatos, como mp4, FLAC etc. Escrevi vários scripts com muito sucesso usando esta API.


2
code.google.com/p/mutagen - Observe também que o Mutagen é GPL, portanto não é necessário para a maioria dos projetos.
Ciantic

3
Mutagen é legal, no entanto, estou perdendo uma maneira uniforme de obter o artista, o gênero do título etc. - você acaba tendo que conhecer as várias teclas, que dependem do formato. TIT2para mp3, titlepara ogg, \xa9nampara mp4, Titlepara WMA etc. - isso é péssimo.
QuIT - Anony-Mousse

20

Um problema eyed3é que ele será lançado NotImplementedError("Unable to write ID3 v2.2")para arquivos MP3 comuns.

Na minha experiência, a mutagenturma EasyID3funciona de maneira mais confiável. Exemplo:

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

Todas as outras tags podem ser acessadas dessa maneira e salvas, o que servirá a muitos propósitos. Mais informações podem ser encontradas no Tutorial da Mutagen .


13

O que você procura é o módulo ID3 . É muito simples e fornecerá exatamente o que você precisa. Basta copiar o arquivo ID3.py no diretório de pacotes do site e você poderá fazer algo como o seguinte:

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
Apenas uma nota. Este módulo é muito antiga (2002) e V2 o apoio de doesn de tags ID3
Eli Bendersky

8

verifique este:

https://github.com/Ciantic/songdetails

Exemplo de uso:

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

Salvando alterações:

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

7

Apenas informações adicionais para vocês:

dê uma olhada na seção "Editores de material de MP3 e metadados" na página do PythonInMusic .


6

Um exemplo simples do livro Dive Into Python funciona bem para mim, este é o link para download, o exemplo é fileinfo.py. Não sei se é o melhor, mas ele pode fazer o trabalho básico.

O livro inteiro está disponível online aqui .


3
Esse exemplo é um pouco desatualizado agora, tanto em termos de versão python e em termos de versão ID3 ...
Bex

os dois links não estão mais funcionando. (Eu sei a resposta é de 9 anos de idade) Se você está procurando o livro online "Dive into Python", aqui está a atual ligação
Edwin van Mierlo

Esse link também não está mais funcionando. O melhor que eu poderia rapidamente o Google agora é github.com/diveintomark/diveintopython3
tripleee

6

Procurei as respostas acima e descobri que elas não são boas para o meu projeto devido a problemas de licenciamento com a GPL.

E descobri o seguinte: PyID3Lib , enquanto essa data específica de lançamento da ligação em python é antiga, ela usa o ID3Lib , que está atualizado.

Notável mencionar é que ambos são LGPL e estão prontos para serem usados .


4

O método mais fácil são os detalhes das músicas .

para ler dados

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

da mesma forma para editar

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

Não se esqueça de adicionar u antes do nome até conhecer o idioma chinês.

você pode ler e editar em massa usando o 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

Depois de tentar a pip installrota simples para os módulos eyeD3, pytaglib e ID3 recomendados aqui, descobri que a quarta opção era a única a funcionar. O restante apresentava erros de importação com dependências ausentes no C ++ ou algo mágico ou alguma outra biblioteca que estava faltando pip. Então vá com este aqui para leitura básica de tags ID3 (todas as versões):

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

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

Lista de possíveis atributos que você pode obter com 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 pequeno e independente, como anunciado.


1
versão mais recente para tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

A primeira resposta que usa eyed3 está desatualizada, portanto, aqui está uma versão atualizada.

Lendo tags de um arquivo 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)

Um exemplo do site para modificar 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

Um problema que encontrei ao tentar usar o eyed3 pela primeira vez tinha a ver com um erro de importação do libmagic, mesmo que estivesse instalado. Para corrigir isso, instale o compartimento mágico whl a partir daqui


2

Eu sugeriria mp3-tagger . O melhor de tudo é que ele é distribuído sob a licença MIT e suporta todos os atributos necessários.

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

Exemplo:

from mp3_tagger import MP3File

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

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

Ele suporta definir, obter, atualizar e excluir atributos de arquivos mp3.


1

Pode depender exatamente do que você deseja fazer, além de ler os metadados. Se você precisa apenas da taxa de bits / nome, etc., e nada mais, algo leve é ​​provavelmente o melhor.

Se você está manipulando o passado do mp3, o PyMedia pode ser adequado.

Existem muitos, o que você obtém, certifique-se e teste-o em várias mídias de amostra. Existem algumas versões diferentes de tags ID3 em particular, portanto, verifique se não está muito desatualizado.

Pessoalmente, usei essa pequena classe MP3Info com sorte. É bastante antigo.

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


0

Após uma pesquisa inicial, pensei que os detalhes da música poderiam se encaixar no meu caso de uso, mas não lida com arquivos .m4b. Mutagen faz. Observe que, embora alguns tenham (razoavelmente) contestado o surgimento de chaves nativas de formato da Mutagen, que variam de formato para formato (TIT2 para mp3, título para ogg, \ xa9nam para mp4, título para WMA etc.), mutagen.File ( ) possui um parâmetro (novo?) easy = True que fornece tags EasyMP3 / EasyID3, que possuem um conjunto de chaves consistente, embora limitado,. Até agora, eu só fiz testes limitados, mas as chaves comuns, como álbum, artista, albumartist, gênero, número da faixa, número da discagem etc. estão presentes e são idênticas para os arquivos .mb4 e .mp3 ao usar easy = True, tornando-o muito conveniente para os meus 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

Você pode fornecer uma explicação para isso?
Nelles

0

Eu usei tinytag 1.3.1 porque

  1. É suportado ativamente:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Ele suporta os principais formatos:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. O código funcionou em apenas alguns minutos de desenvolvimento.
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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.