Dostęp do metadanych MP3 w Pythonie [zamknięte]


Odpowiedzi:


106

Użyłem eyeD3 pewnego dnia z dużym sukcesem. Odkryłem, że może dodać grafikę do tagu ID3, czego inne moduły, które oglądałem, nie mogły. Będziesz musiał zainstalować za pomocą pip lub pobrać tar i uruchomić python setup.py installz folderu źródłowego.

Odpowiednie przykłady ze strony internetowej są poniżej.

Odczytywanie zawartości pliku mp3 zawierającego informacje o tagach v1 lub v2:

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

Przeczytaj plik mp3 (długość ścieżki, szybkość transmisji itp.) I uzyskaj dostęp do jego tagu:

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

Można wybrać określone wersje tagów:

 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.

Lub możesz iterować po surowych klatkach:

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

Po połączeniu tagu z plikiem można go modyfikować i zapisywać:

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

Jeśli powiązany tag to v2 i chcesz go zapisać jako v1:

 tag.update(eyeD3.ID3_V1_1)

Wczytaj tag i usuń go z pliku:

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

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

20
eyeD3 jest również na licencji GPL ... więc jeśli tak jak ja planujesz użyć go w swoim programie, musisz wydać swój program jako darmowy program również ... niech to szlag z tymi ludźmi, dlaczego nie mogą wydać go na licencji LGPL?
Ciantic

9
@Ciantic: Tagi ID3 są niezwykle proste, dlaczego nie utworzysz samodzielnie biblioteki i nie wypuścisz jej pod BSD? Co więcej, ci ludzie nie są twoimi właścicielami. Zajrzyj tutaj diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, tagi ID3v1 są proste, tagi ID3v2 są skomplikowane jak diabli ... A teraz stworzyłem opakowanie BSD dla pytagger github.com/Ciantic/songdetails Nie oznaczyłem go jeszcze jako wydany, ale działa.
Ciantic

5
W nowszej wersji użyj import eyed3(małe litery d).
Jake Z

4
Zwróć uwagę, że te notatki dotyczą starszej wersji eyed3 i nie będą już działać dobrze. Na przykład funkcja link () zniknęła i atrybuty są teraz ustawiane deklaratywnie, bez seterów.
mlissner

37

Użyłem mutagen edycji tagów w plikach multimedialnych wcześniej. Zaletą mutagenu jest to, że obsługuje on inne formaty, takie jak mp4, FLAC itp. Napisałem kilka skryptów, które z dużym powodzeniem wykorzystały ten interfejs API.


2
code.google.com/p/mutagen - Zwróć również uwagę, że Mutagen jest na licencji GPL, więc w przypadku większości projektów nie jest to możliwe.
Ciantic

3
Mutagen jest fajny, ale brakuje mi jednolitego sposobu na dotarcie do wykonawcy, gatunku tytułu itp. - w końcu musisz znać różne klucze, które są zależne od formatu. TIT2dla mp3, titledla ogg, \xa9namdla mp4, Titledla WMA itp. - to jest do bani.
ZAKOŃCZYŁO - Anony-Mousse

21

Problem eyed3polega na tym, że wyrzuci NotImplementedError("Unable to write ID3 v2.2")zwykłe pliki MP3.

Z mojego doświadczenia wynika, że mutagenklasa EasyID3działa bardziej niezawodnie. Przykład:

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

W ten sposób można uzyskać dostęp do wszystkich innych tagów i je zapisać, co będzie służyć większości celów. Więcej informacji znajdziesz w samouczku dotyczącym mutagenu .


13

To, czego szukasz, to moduł ID3 . To bardzo proste i zapewni Ci dokładnie to, czego potrzebujesz. Po prostu skopiuj plik ID3.py do katalogu site-packages, a będziesz mógł zrobić coś takiego:

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
Tylko uwaga. Ten moduł jest bardzo stary (2002) i nie obsługuje V2 tagów ID3
Eli Bendersky

8

sprawdź to:

https://github.com/Ciantic/songdetails

Przykład użycia:

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

Zapisywania zmian:

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


6

Prosty przykład z książki Dive Into Python działa dla mnie dobrze, to jest link do pobrania, przykład to fileinfo.py. Nie wiem, czy jest najlepszy, ale może wykonać podstawową pracę.

Cała książka jest dostępna online tutaj .


3
Ten przykład jest teraz nieco przestarzały, zarówno pod względem wersji Pythona, jak i wersji ID3 ...
Bex

oba łącza już nie działają. (Wiem, że odpowiedź ma 9 lat) Jeśli szukasz książki online „Dive into Python”, oto aktualny link
Edwin van Mierlo,

To łącze również już nie działa. Najlepsze, co mogłem teraz szybko wygooglować,
tripleee

6

Przejrzałem powyższe odpowiedzi i stwierdziłem, że nie są one dobre dla mojego projektu z powodu problemów licencyjnych z GPL.

I dowiedziałem się, że: PyID3Lib , chociaż ta konkretna data wydania powiązania Pythona jest stara, używa ID3Lib , który sam w sobie jest aktualny.

Warto wspomnieć, że oba są LGPL i są gotowe do użycia.


4

najłatwiejszą metodą są szczegóły dotyczące utworów .

do odczytu danych

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

podobnie do edycji

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

Nie zapomnij dodać u przed nazwą, dopóki nie poznasz języka chińskiego.

Możesz czytać i edytować zbiorczo za pomocą modułu python glob

dawny.

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

4

Po wypróbowaniu prostej pip installtrasy dla modułów eyeD3, pytaglib i ID3 zalecanych tutaj stwierdziłem, że ta czwarta opcja była jedyną działającą. Reszta miała błędy importu z brakującymi zależnościami w C ++ lub czymś magicznym lub inną biblioteką, której pipbrakowało. Więc idź z tym do podstawowego odczytu tagów ID3 (wszystkie wersje):

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

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

Lista możliwych atrybutów, które możesz uzyskać za pomocą 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

Jak reklamowano, był mały i samodzielny.


1
nowsza wersja dla tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

Pierwsza odpowiedź, która używa eyed3, jest nieaktualna, więc oto jej zaktualizowana wersja.

Odczytywanie tagów z pliku 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)

Przykład ze strony do modyfikacji tagów:

 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

Problem, który napotkałem podczas pierwszej próby użycia eyed3, dotyczył błędu importu libmagic, mimo że został zainstalowany. Aby to naprawić, zainstaluj stąd magic-bin whl


2

Proponuję mp3-tagger . Najlepsze w tym jest to, że jest rozpowszechniany na licencji MIT i obsługuje wszystkie wymagane atrybuty.

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

Przykład:

from mp3_tagger import MP3File

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

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

Obsługuje ustawianie, pobieranie, aktualizowanie i usuwanie atrybutów plików mp3.


1

Może to zależeć od tego, co chcesz zrobić, oprócz czytania metadanych. Jeśli potrzebujesz tylko bitrate / nazwy itp., I nic więcej, coś lekkiego jest prawdopodobnie najlepsze.

Jeśli manipulujesz przeszłością mp3, PyMedia może być odpowiednia.

Jest ich sporo, cokolwiek otrzymasz, upewnij się i przetestuj to na wielu przykładowych nośnikach. W szczególności istnieje kilka różnych wersji tagów ID3, więc upewnij się, że nie są one zbyt nieaktualne.

Osobiście użyłem tej małej klasy MP3Info z odrobiną szczęścia. Jest jednak dość stary.

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


0

Po kilku wstępnych badaniach pomyślałem, że szczegóły dotyczące utworów mogą pasować do mojego przypadku użycia, ale nie obsługują plików .m4b. Mutagen tak. Zauważ, że chociaż niektórzy (rozsądnie) mieli problem z wyświetlaniem przez Mutagena kluczy natywnych dla formatu, które różnią się w zależności od formatu (TIT2 dla mp3, tytuł dla ogg, \ xa9nam dla mp4, tytuł dla WMA itp.), Mutagen.File ( ) ma (nowy?) parametr easy = True, który zapewnia tagi EasyMP3 / EasyID3, które mają spójny, aczkolwiek ograniczony zestaw kluczy. Jak dotąd przeprowadziłem tylko ograniczone testy, ale wspólne klucze, takie jak album, wykonawca, artysta albumu, gatunek, numer utworu, numer płyty itp., Są obecne i identyczne dla plików .mb4 i .mp3, gdy używam easy = True, dzięki czemu bardzo wygodne dla moich celów.


0

używając 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

Czy możesz podać i wyjaśnić to?
Nelles

0

Użyłem tinytag 1.3.1, ponieważ

  1. Jest aktywnie wspierany:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Obsługuje główne formaty:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Kod DZIAŁAŁ w zaledwie kilka minut programowania.
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)
  • WYNIK
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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.