Truy cập siêu dữ liệu MP3 bằng Python [đã đóng]


122

Làm cách nào tôi có thể truy xuất siêu dữ liệu mp3 trong Python?

Câu trả lời:


106

Tôi đã sử dụng eyeD3 vào một ngày khác với rất nhiều thành công. Tôi thấy rằng nó có thể thêm tác phẩm nghệ thuật vào thẻ ID3 mà các mô-đun khác mà tôi đã xem không thể. Bạn sẽ phải cài đặt bằng pip hoặc tải tar và thực thi python setup.py installtừ thư mục nguồn.

Các ví dụ liên quan từ trang web dưới đây.

Đọc nội dung của tệp mp3 chứa thông tin thẻ v1 hoặc v2:

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

Đọc tệp mp3 (độ dài bản nhạc, bitrate, v.v.) và truy cập thẻ của nó:

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

Phiên bản thẻ cụ thể có thể được chọn:

 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.

Hoặc bạn có thể lặp lại qua các khung thô:

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

Khi một thẻ được liên kết đến một tệp, nó có thể được sửa đổi và lưu lại:

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

Nếu thẻ được liên kết trong là v2 và bạn muốn lưu nó dưới dạng v1:

 tag.update(eyeD3.ID3_V1_1)

Đọc trong thẻ và xóa nó khỏi tệp:

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

Thêm một thẻ mới:

 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 cũng là GPL ... vì vậy, giống như tôi, bạn dự định sử dụng nó trong chương trình của mình, bạn phải phát hành chương trình của mình dưới dạng một chương trình miễn phí cũng ... với những người này, tại sao họ không thể phát hành theo LGPL?
Ciantic

9
@Ciantic: Thẻ ID3 cực kỳ đơn giản, tại sao bạn không tự tạo thư viện và phát hành nó trong BSD? Hơn nữa, những người này không sở hữu bạn bất cứ điều gì ở nơi đầu tiên. Nhìn vào đây diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, thẻ ID3v1 rất đơn giản, thẻ ID3v2 phức tạp như địa ngục ... Và bây giờ tôi đã tạo trình bao bọc BSD cho pytagger github.com/Ciantic/songdetails Tôi chưa gắn thẻ nó khi được phát hành, nhưng nó hoạt động.
Ciantic

5
Trong phiên bản mới hơn, sử dụng import eyed3(chữ thường d).
Jake Z

4
Lưu ý rằng những lưu ý này dành cho phiên bản cũ hơn của Eyed3 và sẽ không hoạt động tốt nữa. Ví dụ, hàm link () đã biến mất và các thuộc tính được thiết lập khai báo ngay bây giờ, không có setters.
mlissner

37

Tôi đã sử dụng mutagen để chỉnh sửa thẻ trong các tập tin phương tiện trước đây. Điều thú vị về mutagen là nó có thể xử lý các định dạng khác, chẳng hạn như mp4, FLAC, v.v. Tôi đã viết một số tập lệnh với rất nhiều thành công khi sử dụng API này.


2
code.google.com/p/mutagen - Cũng lưu ý rằng Mutagen là GPL, do đó, điều này là không có đối với hầu hết các dự án.
Ciantic

3
Mutagen là tốt, tuy nhiên tôi đang thiếu một cách thống nhất để có được nghệ sĩ, thể loại tiêu đề, v.v. - cuối cùng bạn phải biết các khóa khác nhau, phụ thuộc vào định dạng. TIT2cho mp3, titlecho ogg, \xa9namcho mp4, Titlecho WMA, v.v. - thật tệ.
Có QUIT - Anony-Mousse

20

Một vấn đề với eyed3là nó sẽ némNotImplementedError("Unable to write ID3 v2.2") cho các tệp MP3 phổ biến.

Theo kinh nghiệm của tôi, mutagenlớp học EasyID3hoạt động đáng tin cậy hơn. Thí dụ:

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

Tất cả các thẻ khác có thể được truy cập theo cách này và được lưu, sẽ phục vụ hầu hết các mục đích. Thông tin thêm có thể được tìm thấy trong Hướng dẫn Mutagen .


13

Những gì bạn đang theo là mô-đun ID3 . Nó rất đơn giản và sẽ cung cấp cho bạn chính xác những gì bạn cần. Chỉ cần sao chép tệp ID3.py vào thư mục gói trang web của bạn và bạn sẽ có thể làm một cái gì đó như sau:

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
Chỉ cần một lưu ý. Mô-đun này rất cũ (2002) và không hỗ trợ V2 thẻ ID3
Eli Bendersky

8

kiểm tra cái này

https://github.com/Ciantic/songdetails

Ví dụ sử dụng:

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

Lưu thay đổi:

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

7

Chỉ cần thêm thông tin cho các bạn:

hãy xem phần "Công cụ MP3 và trình chỉnh sửa siêu dữ liệu" trong trang PythonInMusic .


6

Một ví dụ đơn giản từ cuốn sách Lặn vào Python hoạt động tốt với tôi, điều này là liên kết tải xuống, ví dụ là fileinfo.py. Không biết nếu nó là tốt nhất, nhưng nó có thể làm công việc cơ bản.

Toàn bộ cuốn sách có sẵn trực tuyến ở đây .


3
Ví dụ đó bây giờ hơi lỗi thời, cả về phiên bản python và về phiên bản ID3 ...
Bex

cả hai liên kết không còn hoạt động. (Tôi biết câu trả lời là 9 tuổi) Nếu bạn đang tìm cuốn sách trực tuyến "Lặn vào Python", đây là liên kết
Edwin van Mierlo

Liên kết đó cũng không còn hoạt động. Điều tốt nhất tôi có thể nhanh chóng google bây giờ là github.com/diveintomark/diveintopython3
tripleee

6

Tôi đã xem các câu trả lời ở trên và phát hiện ra rằng chúng không tốt cho dự án của tôi vì vấn đề cấp phép với GPL.

Và tôi phát hiện ra điều này: PyID3Lib , trong khi ngày phát hành ràng buộc trăn cụ thể đó đã cũ, nó sử dụng ID3Lib , bản thân nó đã được cập nhật.

Đáng chú ý phải kể đến là cả hai đều là LGPL , và đều tốt.


4

Phương pháp đơn giản nhất là songdetails ..

để đọc dữ liệu

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

tương tự để chỉnh sửa

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

Đừng quên thêm u trước tên cho đến khi bạn biết tiếng Trung Quốc.

bạn có thể đọc và chỉnh sửa hàng loạt bằng mô-đun python global

Ví dụ.

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

4

Sau khi thử pip installtuyến đường đơn giản cho các mô-đun eyeD3, pytaglib và ID3 được đề xuất ở đây, tôi thấy tùy chọn thứ tư này là lựa chọn duy nhất để hoạt động. Phần còn lại có lỗi nhập với các phụ thuộc bị thiếu trong C ++ hoặc ma thuật hoặc một số thư viện khác pipbị bỏ lỡ. Vì vậy, hãy đi với cái này để đọc các thẻ ID3 cơ bản (tất cả các phiên bản):

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

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

Danh sách các thuộc tính có thể bạn có thể nhận được với 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

Nó nhỏ xíu và khép kín, như quảng cáo.


1
phiên bản mới hơn cho tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

Câu trả lời đầu tiên sử dụng eyed3 đã lỗi thời vì vậy đây là phiên bản cập nhật của nó.

Đọc thẻ từ tệp 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)

Một ví dụ từ trang web để sửa đổi thẻ:

 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

Một vấn đề tôi gặp phải khi cố gắng sử dụng eyed3 lần đầu tiên là do lỗi nhập libmagic mặc dù đã được cài đặt. Để sửa lỗi này, hãy cài đặt Magic-bin whl từ đây


2

Tôi muốn đề nghị mp3-tagger . Điều tốt nhất về điều này là nó được phân phối theo Giấy phép MIT và hỗ trợ tất cả các thuộc tính bắt buộc.

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

Thí dụ:

from mp3_tagger import MP3File

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

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

Nó hỗ trợ thiết lập, nhận, cập nhật và xóa các thuộc tính của tệp mp3.


1

Nó có thể phụ thuộc vào chính xác những gì bạn muốn làm ngoài việc đọc siêu dữ liệu. Nếu nó chỉ đơn giản là bitrate / tên, vv mà bạn cần, và không có gì khác, một cái gì đó nhẹ có lẽ là tốt nhất.

Nếu bạn đang thao tác với mp3 quá khứ thì PyMedia có thể phù hợp.

Có khá nhiều, bất cứ điều gì bạn nhận được, hãy chắc chắn và kiểm tra nó trên nhiều phương tiện mẫu. Cụ thể có một vài phiên bản khác nhau của thẻ ID3, vì vậy hãy đảm bảo rằng nó không quá lỗi thời.

Cá nhân tôi đã sử dụng lớp MP3Info nhỏ này một cách may mắn. Nó khá cũ mặc dù.

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


0

Sau một số nghiên cứu ban đầu, tôi nghĩ rằng các bài hát có thể phù hợp với trường hợp sử dụng của tôi, nhưng nó không xử lý các tệp .m4b. Mutagen nào. Lưu ý rằng mặc dù một số (có lý do) đã gặp sự cố với các khóa gốc định dạng của Mutagen, thay đổi từ định dạng sang định dạng (TIT2 cho mp3, tiêu đề cho ogg, \ xa9nam cho mp4, Tiêu đề cho WMA, v.v.), mutagen.File ( ) có một tham số (mới?) easy = True cung cấp các thẻ EasyMP3 / EasyID3, có một bộ khóa nhất quán, mặc dù có giới hạn. Cho đến nay tôi chỉ thực hiện thử nghiệm giới hạn, nhưng các khóa phổ biến, như album, nghệ sĩ, albumartist, thể loại, tracknumber, Discnumber, v.v ... đều có mặt và giống hệt nhau cho các tệp .mb4 và .mp3 khi sử dụng easy = True, làm cho nó rất thuận tiện cho mục đích của tôi


0

sử dụng 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

Bạn có thể cung cấp và giải thích cho điều này?
Nelles

0

Tôi đã sử dụng tinytag 1.3.1

  1. Nó được hỗ trợ tích cực:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Nó hỗ trợ các định dạng chính:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Mã LÀM VIỆC chỉ trong vài phút phát triển.
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)
  • KẾT QUẢ
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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.