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

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

12.08.2008 15:16:00
18 ОТВЕТОВ

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

НТН

1
12.08.2008 15:32:05

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

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

6
12.08.2008 23:54:32
Этот пример немного устарел, как с точки зрения версии Python, так и с точки зрения версии ID3 ...
Bex 14.01.2014 16:33:48
обе ссылки больше не работают. (Я знаю, что ответу 9 лет) Если вы ищете онлайн книгу «Погружение в Python», вот текущая ссылка
Edwin van Mierlo 25.11.2017 08:33:57
Эта ссылка также больше не работает. Лучшее, что я мог быстро
tripleee 18.01.2019 04:04:27

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

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

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

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

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

1
12.08.2008 15:37:59

То, что вы ищете, это модуль 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
13
13.08.2008 00:44:26
Просто записка. Этот модуль очень старый (2002 г.) и не поддерживает V2 тегов ID3
Eli Bendersky 28.11.2008 10:52:18

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

36
3.04.2018 11:40:19
code.google.com/p/mutagen - также обратите внимание, что Mutagen является лицензией GPL, так что для большинства проектов это нет-нет.
Ciantic 19.12.2009 21:57:58
Мутаген хорош, но мне не хватает единого способа получить исполнителя, жанр заголовка и т. Д. - в конечном итоге вам придется знать различные ключи, которые зависят от формата. TIT2для mp3, titleдля ogg, \xa9namдля mp4, Titleдля WMA и т. д. - это отстой.
Has QUIT--Anony-Mousse 16.02.2013 15:26:53

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

0
23.05.2017 10:31:23

Я использовал 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()
104
10.12.2019 01:08:12
eyeD3 также является лицензией GPL ... поэтому, если вы, как и я, планируете использовать ее в своей программе, вы должны также выпустить ее как бесплатную программу ... черт побери с этими людьми, почему они не могут выпускать их под LGPL?
Ciantic 20.12.2009 09:54:01
@Ciantic: теги ID3 чрезвычайно просты, почему бы вам не создать библиотеку самостоятельно и не выпустить ее под BSD? Кроме того, эти люди не имеют ничего общего с вами. Посмотрите здесь diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber 8.01.2010 14:46:53
@voyager, теги ID3v1 просты, теги ID3v2 сложны до чертиков ... А теперь я создал оболочку BSD для pytagger github.com/Ciantic/songdetails Я еще не отметил его как выпущенный, но он работает.
Ciantic 18.01.2010 20:30:43
В более новой версии используйте import eyed3(строчная d).
Jake Z 22.03.2014 00:18:09
Обратите внимание, что эти заметки относятся к более старой версии eyed3 и больше не будут работать. Например, функция link () исчезла, и атрибуты теперь устанавливаются декларативно, без установщиков.
mlissner 24.07.2014 17:43:41

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

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

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

6
20.12.2009 19:32:11

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

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()
8
7.07.2011 17:51:08

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

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

6
8.07.2011 08:24:29

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

0
12.07.2015 23:17:59

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

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

20
27.04.2019 04:10:47

Самый простой способ это 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()

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

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

ех.

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

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

2
8.04.2018 15:52:20

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

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

4
16.04.2018 01:34:52
более новая версия для tinytag: pypi.org/project/tinytag
Daenys Targaryen 10.12.2019 17:42:55

Я бы предложил 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 файлов.

2
26.06.2018 14:05:06

используя 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
6.02.2020 23:51:17
Можете ли вы предоставить и объяснение этого?
Nelles 7.02.2020 02:00:43

Я использовал 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>
0
10.03.2020 21:12:51