Доступ к метаданным mp3 с Python

Каков наилучший способ получить метаданные mp3 в Python? Я видел пару фреймворков, но я не уверен, какой из них лучше всего использовать.... Есть идеи?

16 ответов

Я использовал eyeD3 на днях с большим успехом. Я обнаружил, что он может добавить иллюстрацию к тегу ID3, чего не смогли другие модули, на которые я смотрел. Вам придется скачать tar и выполнить python setup.py install из исходной папки.

Соответствующие примеры с сайта приведены ниже.

Чтение содержимого mp3-файла, содержащего информацию тега v1 или v2:

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

Прочитайте mp3-файл (длина трека, битрейт и т. Д.) И получите доступ к его тегу:

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

Конкретные версии тегов могут быть выбраны:

 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.

Или вы можете перебрать необработанные кадры:

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

Как только тег связан с файлом, его можно изменить и сохранить:

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

Если связанный тег был v2, и вы хотите сохранить его как v1:

 tag.update(eyeD3.ID3_V1_1)

Прочитайте тег и удалите его из файла:

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

Добавить новый тег:

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

Я использовал мутаген для редактирования тегов в медиа-файлах раньше. Приятной особенностью мутагена является то, что он может обрабатывать другие форматы, такие как mp4, FLAC и т. Д. Я написал несколько скриптов с большим успехом, используя этот API.

Проблема с eyed3 это то, что он бросит NotImplementedError("Unable to write ID3 v2.2") для обычных файлов MP3.

По моему опыту, mutagen учебный класс EasyID3 работает надежнее. Пример:

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

Все остальные теги могут быть доступны таким образом и сохранены, что будет служить большинству целей. Более подробную информацию можно найти в учебнике по мутагену.

То, что вы ищете, это модуль ID3. Это очень просто и даст вам именно то, что вам нужно. Просто скопируйте файл ID3.py в каталог site-packages, и вы сможете сделать что-то вроде следующего:

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

После попытки простого pip install Рекомендованный маршрут для модулей eyeD3, pytaglib и ID3, я обнаружил, что этот четвертый вариант - единственный, который работает. У остальных были ошибки импорта с отсутствующими зависимостями в C++ или чем-то волшебным или какой-то другой библиотекой, которая pip пропущенный. Итак, воспользуйтесь этим для базового чтения тегов ID3 ​​(все версии):

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

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

Список возможных атрибутов, которые вы можете получить с 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

Это было крошечным и самодостаточным, как рекламируется.

Проверить это:

https://github.com/Ciantic/songdetails

Пример использования:

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

Сохранение изменений:

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

Самый простой способ это songdetails..

для чтения данных

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

аналогично для редактирования

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

Не забудьте добавить вас перед именем, пока вы не знаете китайский язык.

Вы можете читать и редактировать в массе с помощью модуля Python Glob

ех.

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

Просто дополнительная информация для вас, ребята:

взгляните на раздел "Редакторы MP3 и метаданных" на странице PythonInMusic.

Я использовал tinytag 1.3.1, потому что

  1. Активно поддерживается:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Он поддерживает основные форматы:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Код ЗАРАБОТАЛ всего за несколько минут разработки.
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)

  • РЕЗУЛЬТАТ
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>

Простой пример из книги Dive Into Python хорошо работает для меня, это ссылка на скачивание, пример fileinfo.py. Не знаю, лучший ли это, но он может выполнять основную работу.

Вся книга доступна онлайн здесь.

Я посмотрел приведенные выше ответы и обнаружил, что они не подходят для моего проекта из-за проблем с лицензированием GPL.

И я выяснил это: PyID3Lib, в то время как эта конкретная дата выпуска привязки Python устарела, она использует ID3Lib, которая сама по себе актуальна.

Следует отметить, что оба LGPL, и они хороши.

Первый ответ, который использует eyed3, устарел, поэтому здесь его обновленная версия.

Чтение тегов из 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)

Пример с сайта для изменения тегов:

 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

Проблема, с которой я столкнулся при попытке использовать eyed3 впервые, была связана с ошибкой импорта libmagic, даже если она была установлена. Чтобы исправить это, установите волшебную корзину отсюда

Используя 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

Я бы предложил mp3-tagger. Лучше всего то, что он распространяется по лицензии MIT и поддерживает все необходимые атрибуты.

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

Пример:

from mp3_tagger import MP3File

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

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

Он поддерживает установку, получение, обновление и удаление атрибутов mp3 файлов.

Это может зависеть от того, что именно вы хотите сделать в дополнение к чтению метаданных. Если вам нужен просто битрейт / имя и т. Д., И ничего более, то, вероятно, лучше использовать что-то легковесное.

Если вы манипулируете прошлым mp3, PyMedia может подойти.

Есть немало, что бы вы ни получили, убедитесь и протестируйте это на большом количестве образцов носителей. В частности, существует несколько разных версий тегов ID3, поэтому убедитесь, что они не слишком устарели.

Лично я использовал этот небольшой класс MP3Info с удачей. Это довольно старый, хотя.

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

После некоторого начального исследования я подумал, что songdetails может соответствовать моему сценарию использования, но он не обрабатывает файлы.m4b. Мутаген делает. Обратите внимание, что в то время как у некоторых (разумно) возникли проблемы с отображением Mutagen форматных ключей, которые варьируются от формата к формату (TIT2 для mp3, title для ogg, \xa9nam для mp4, Title для WMA и т. Д.), Mutagen.File() имеет (новый?) параметр easy=True, который предоставляет теги EasyMP3/EasyID3, которые имеют согласованный, хотя и ограниченный, набор ключей. До сих пор я проводил только ограниченное тестирование, но общие ключи, такие как альбом, исполнитель, альбомист, жанр, номер трека, номер диска и т. Д., Присутствуют и идентичны для файлов.mb4 и.mp3 при использовании easy=True, что делает его очень удобно для моих целей.

Этот инструментарий может делать то, что вам нужно. Я не могу сказать, является ли это "лучшим", но на самом деле, если он делает то, что вам нужно, это все, что имеет значение, верно?

НТН

Если вы можете использовать IronPython, есть TagLibSharp. Его можно использовать с любого языка.NET.

Другие вопросы по тегам