Python으로 MP3 메타 데이터 액세스 [닫기]


122

Python에서 mp3 메타 데이터를 검색하려면 어떻게해야합니까?

답변:


106

요 전날 eyeD3를 사용 하여 많은 성공을 거두었습니다. 내가 본 다른 모듈이 할 수 없었던 ID3 태그에 아트 워크를 추가 할 수 있다는 것을 알았습니다. pip를 사용하여 설치하거나 tar를 다운로드 python setup.py install하고 소스 폴더에서 실행해야 합니다.

웹 사이트의 관련 예는 다음과 같습니다.

v1 또는 v2 태그 정보를 포함하는 mp3 파일의 내용 읽기 :

 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 2009

9
@Ciantic : ID3 태그는 매우 간단합니다. 라이브러리를 직접 만들어 BSD로 공개하지 않겠습니까? 게다가이 사람들 은 애초에 당신을 소유하지 않습니다. 여기를보세요 diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber 2010 년

2
@voyager, ID3v1 태그는 간단하고, ID3v2 태그는 지옥처럼 복잡합니다 ... 그리고 이제 pytagger github.com/Ciantic/songdetails에 대한 BSD 래퍼를 만들었 습니다. 아직 릴리스 된대로 태그를 지정하지 않았지만 작동합니다.
Ciantic

5
최신 버전에서는 import eyed3(소문자 d)를 사용합니다.
Jake Z

4
이 노트는 이전 버전의 eyed3 용이며 더 이상 잘 작동하지 않습니다. 예를 들어, link () 함수는 사라졌고 속성은 setter없이 선언적으로 설정됩니다.
mlissner 2014-07-24

37

전에 mutagen 을 사용 하여 미디어 파일의 태그를 편집했습니다. mutagen의 좋은 점은 mp4, FLAC 등과 같은 다른 형식을 처리 할 수 ​​있다는 것입니다.이 API를 사용하여 많은 성공을 거둔 여러 스크립트를 작성했습니다.


2
code.google.com/p/mutagen- 또한 Mutagen은 GPL이므로 대부분의 프로젝트에 해당되지 않습니다.
Ciantic 2009

3
Mutagen은 좋지만 아티스트, 타이틀 장르 등을 얻을 수있는 통일 된 방법이 없습니다. 형식에 따라 달라지는 다양한 키를 알아야합니다. TIT2mp3, titleogg, \xa9nammp4, TitleWMA 등.
Has QUIT--Anony-Mousse 2013

20

문제 eyed3NotImplementedError("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 Tutorial 에서 찾을 수 있습니다 .


13

당신이 추구 하는 것은 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

12
메모입니다. 이 모듈은 매우 오래되었으며 (2002) ID3 태그의 V2를 지원하지 않습니다
Eli Bendersky

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

여러분에게 추가 정보 :

PythonInMusic 페이지의 "MP3 항목 및 메타 데이터 편집기"섹션을 살펴보십시오 .


6

Dive Into Python 책의 간단한 예제가 저에게 적합합니다. 이것은 다운로드 링크이고 예제는 fileinfo.py입니다. 그것이 최고인지는 모르지만 기본적인 일을 할 수 있습니다.

전체 책은 여기에서 온라인으로 볼 수 있습니다 .


3
그 예는 ... 조금 파이썬 버전의 측면에서와 ID3 버전의 측면에서 모두, 지금은 구식이다
벡스

두 링크가 더 이상 작동하지 않습니다. 당신이 온라인으로 책 "파이썬으로 다이빙"을 찾고 있다면 (내가 대답은 9 살 알고), 여기에 전류 링크
에드윈 반 Mierlo

해당 링크도 더 이상 작동하지 않습니다. 내가 지금 빨리 구글 할 수있는 최고의 것은 github.com/diveintomark/diveintopython3
tripleee

6

위의 답변을 살펴본 결과 GPL의 라이센스 문제로 인해 프로젝트에 적합하지 않다는 것을 알았습니다.

그리고 나는 이것을 발견했습니다 : PyID3Lib , 특정 파이썬 바인딩 릴리스 날짜는 오래 되었지만 자체적으로 최신 상태 인 ID3Lib를 사용합니다 .

주목할만한 점은 둘 다 LGPL 이며 사용하기에 좋다는 것입니다.


4

가장 쉬운 방법은 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 를 추가하는 것을 잊지 마십시오 .

u는 파이썬 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 타르 가르 옌

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 whl을 설치 하십시오.


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은 그렇습니다. 일부는 (합리적으로) Mutagen의 형식 네이티브 키 표시에 문제가 있지만 형식에 따라 형식에 따라 다릅니다 (mp3의 경우 TIT2, ogg의 제목, mp4의 경우 \ xa9nam, WMA의 제목 등), mutagen.File ( )에는 EasyMP3 / EasyID3 태그를 제공하는 (새로운?) easy = True 매개 변수가 있습니다.이 매개 변수는 일관되고 제한적이지만 키 세트가 있습니다. 지금까지 제한된 테스트 만 수행했지만 easy = True를 사용할 때 앨범, 아티스트, 앨범 아티스트, 장르, 트랙 번호, 디스크 번호 등과 같은 공통 키가 모두 존재하고 .mb4 및 .mp3 파일에 대해 동일합니다. 내 목적에 매우 편리합니다.


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

이에 대해 제공하고 설명 할 수 있습니까?
Nelles

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.