Доступ до метаданих 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?
Сіантік

9
@Ciantic: Теги ID3 надзвичайно прості, чому б вам не створити бібліотеку самостійно і не випустити її під BSD? Крім того, цей народ не має у вас нічого, в першу чергу. Дивіться тут diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, теги ID3v1 прості, теги ID3v2 складні як пекло ... І тепер я створив BSD обгортку для pytagger github.com/Ciantic/songdetails. Я ще не позначив це як випущений, але він працює.
Сіантік

5
У новій версії використовуйте import eyed3(малі г).
Джейк Z

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

37

Раніше я використовував мутаген для редагування тегів у медіафайлах. Приємна річ у мутагені полягає в тому, що він може працювати з іншими форматами, такими як mp4, FLAC тощо. Я написав кілька сценаріїв з великим успіхом, використовуючи цей API.


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

3
Mutagen є приємним, однак мені не вистачає єдиного способу отримати виконавця, жанру заголовку тощо - ви нарешті знаєте різні клавіші, залежні від формату. TIT2для mp3, titleдля ogg, \xa9namдля mp4, Titleдля WMA тощо - це смокче.
Є QUIT - Anonymous-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()

Усі інші теги можна отримати таким чином і зберегти, що послужить більшості цілей. Більше інформації можна знайти в підручнику Mutagen .


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", ось поточне посилання
Edwin van Mierlo

Це посилання також більше не працює. Найкраще, що я міг швидко google зараз, - це 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, навіть якщо вона була встановлена. Щоб виправити це, встановіть звідси чарівну скриньку


2

Я б запропонував 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-файлів.


1

Це може залежати від того, що саме ви хочете зробити на додаток до читання метаданих. Якщо вам потрібен просто бітрейт / ім’я тощо, і нічого іншого, можливо, легке щось легке.

Якщо ви маніпулюєте mp3 в минулому, PyMedia може бути підходящим.

Існує досить багато, що б ви не отримали, переконайтесь і протестуйте це на великій кількості зразків носіїв. Зокрема, є кілька різних версій тегів ID3, тому переконайтеся, що вони не надто застаріли.

Особисто я користувався цим маленьким MP3Info класом із удачею. Це досить старе, хоча.

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


0

Після деяких початкових досліджень я подумав, що songdetails може відповідати моєму випадку використання, але він не обробляє файли .m4b. Мутаген робить. Зауважте, що хоча деякі з них (розумно) взяли проблему з набуттям Mutagen натурних клавіш, які змінюються від формату до формату (TIT2 для mp3, назва для ogg, \ xa9nam для mp4, Назва для 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.