Доступ к метаданным MP3 с помощью Python [закрыто]


122

Как я могу получить метаданные mp3 в Python?

Ответы:


106

На днях я успешно использовал eyeD3 . Я обнаружил, что он может добавлять изображения в тег ID3, чего не могли другие модули, на которые я смотрел. Вам нужно будет установить с помощью pip или загрузить 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()

19
eyeD3 также является лицензией GPL ... так что, если вы, как и я, планируете использовать его в своей программе, вы должны выпустить свою программу также как бесплатную ... черт возьми, эти люди, почему они не могут выпустить под LGPL?
Ciantic

9
@Ciantic: Теги ID3 чрезвычайно просты, почему бы вам не сделать библиотеку самостоятельно и не выпустить ее под BSD? Более того, эти люди вообще ничего вам не владеют. Посмотрите здесь diveintopython.org/object%5Forient%5Fframework/index.html
Эстебан Кюбер,

2
@voyager, теги ID3v1 просты, теги ID3v2 чертовски сложны ... И теперь я создал оболочку BSD для pytagger github.com/Ciantic/songdetails. Я еще не пометил ее как выпущенную, но она работает.
Ciantic

5
В более новой версии используйте import eyed3(d в нижнем регистре).
Jake Z

4
Обратите внимание, что эти примечания относятся к более старой версии eyed3 и больше не будут работать. Например, исчезла функция link (), и атрибуты теперь устанавливаются декларативно, без установщиков.
mlissner

37

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


2
code.google.com/p/mutagen - Также обратите внимание, что Mutagen является лицензией GPL, поэтому для большинства проектов это запрещено.
Ciantic

3
Мутаген хорош, однако мне не хватает единого способа получить исполнителя, жанр названия и т. Д. - в конечном итоге вам нужно знать различные ключи, которые зависят от формата. TIT2для mp3, titleдля ogg, \xa9namдля mp4, Titleдля WMA и т.д. - отстой.
ВЫЙТИ - Anony-Mousse

20

Проблема с тем 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()

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


13

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

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
Просто примечание. Этот модуль очень старый (2002 г.) и не поддерживает V2 тегов ID3
Эли Бендерский

8

проверьте это:

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

7

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

взгляните на раздел «MP3-файлы и редакторы метаданных» на странице PythonInMusic .


6

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

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


3
Этот пример сейчас немного устарел как с точки зрения версии Python, так и с точки зрения версии ID3 ...
Bex

обе ссылки больше не работают. (Я знаю, что ответу 9 лет.) Если вы ищете онлайн-книгу «Погрузитесь в Python», вот текущая ссылка
Эдвин ван Мирло

Эта ссылка тоже больше не работает. Лучшее, что я мог быстро погуглить, это github.com/diveintomark/diveintopython3
tripleee

6

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

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

Следует отметить, что оба являются LGPL , и их можно использовать.


4

Самый простой способ - это подробности песни ..

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

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

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

Вы можете читать и редактировать массово, используя модуль Python glob

ех.

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

4

Попробовав простой 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

Как рекламировалось, он был крошечным и самодостаточным.


1
более новая версия для tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

Первый ответ, который использует 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, даже если она была установлена. Чтобы исправить это, установите magic-bin отсюда


2

Я бы посоветовал mp3-теггер . Лучшее в этом то, что он распространяется под лицензией 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.


1

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

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

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

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

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


0

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


0

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

Вы можете дать этому объяснение?
Неллес

0

Я использовал 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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.