การเข้าถึงข้อมูลเมตา MP3 ด้วย Python [ปิด]


123

ฉันจะดึงข้อมูลเมตาของ 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()

20
eyeD3 ยังเป็นGPL ... ดังนั้นถ้าอย่างฉันคุณวางแผนที่จะใช้ในโปรแกรมของคุณคุณต้องปล่อยโปรแกรมของคุณเป็นโปรแกรมฟรีด้วย ... ยี้กับคนเหล่านี้ทำไมพวกเขาถึงปล่อยภายใต้ LGPL ไม่ได้?
Ciantic

9
@Ciantic: แท็ก ID3 นั้นง่ายมากทำไมคุณไม่สร้างห้องสมุดด้วยตัวเองและเผยแพร่ภายใต้ BSD? นอกจากนี้คนเหล่านี้ไม่ได้เป็นเจ้าของอะไรคุณตั้งแต่แรก ดูที่นี่diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager แท็ก ID3v1 นั้นเรียบง่ายแท็ก ID3v2 นั้นซับซ้อนราวกับนรก ... และตอนนี้ฉันได้สร้าง BSD wrapper สำหรับ pytagger github.com/Ciantic/songdetailsฉันยังไม่ได้ติดแท็กตอนที่เปิดตัว แต่มันใช้งานได้
Ciantic

5
ในเวอร์ชันที่ใหม่กว่าให้ใช้import eyed3(ตัวพิมพ์เล็ก d)
Jake Z

4
โปรดทราบว่าโน้ตเหล่านี้ใช้สำหรับ eyed3 เวอร์ชันเก่ากว่าและจะใช้งานได้ไม่ดีอีกต่อไป ตัวอย่างเช่นฟังก์ชัน link () หายไปและแอตทริบิวต์ถูกตั้งค่าอย่างเปิดเผยในขณะนี้โดยไม่มีตัวตั้งค่า
mlissner

37

ฉันเคยใช้การกลายพันธุ์เพื่อแก้ไขแท็กในไฟล์มีเดียมาก่อน สิ่งที่ดีเกี่ยวกับการกลายพันธุ์คือมันสามารถจัดการกับรูปแบบอื่น ๆ เช่น mp4, FLAC เป็นต้นฉันได้เขียนสคริปต์หลาย ๆ สคริปต์ด้วยความสำเร็จมากมายโดยใช้ API นี้


2
code.google.com/p/mutagen - โปรดทราบว่า Mutagen คือ GPL ดังนั้นจึงไม่จำเป็นสำหรับโครงการส่วนใหญ่
Ciantic

3
การกลายพันธุ์เป็นสิ่งที่ดี แต่ฉันพลาดวิธีที่เหมือนกันในการหาศิลปินประเภทชื่อเรื่อง ฯลฯ - คุณต้องรู้คีย์ต่างๆซึ่งขึ้นอยู่กับรูปแบบ TIT2สำหรับ mp3, titleogg, \xa9namสำหรับ mp4, Titleสำหรับ WMA เป็นต้น - นั่นแย่มาก
มี QUIT - Anony-Mousse

21

ปัญหา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()

แท็กอื่น ๆ ทั้งหมดสามารถเข้าถึงได้ด้วยวิธีนี้และบันทึกไว้ซึ่งจะตอบสนองวัตถุประสงค์ส่วนใหญ่ สามารถดูข้อมูลเพิ่มเติมได้ในบทแนะนำเกี่ยวกับการกลายพันธุ์


13

สิ่งที่คุณต้องการคือโมดูลID3 มันง่ายมากและจะให้สิ่งที่คุณต้องการ เพียงคัดลอกไฟล์ ID3.py ไปยังไดเร็กทอรี site-package ของคุณและคุณจะสามารถทำสิ่งต่อไปนี้:

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

ข้อมูลเพิ่มเติมสำหรับพวกคุณ:

ดูที่หัวข้อ "สิ่ง MP3 และเมตาดาต้าบรรณาธิการ" ในหน้าของการPythonInMusic


6

ตัวอย่างง่ายๆจากหนังสือ Dive Into Python ใช้ได้สำหรับฉันนี่คือลิงค์ดาวน์โหลดตัวอย่างคือ fileinfo.py ไม่รู้ว่าดีที่สุดไหม แต่ก็ทำงานพื้นฐานได้

หนังสือทั้งเล่มพร้อมใช้งานออนไลน์ที่นี่


3
ตัวอย่างนั้นค่อนข้างล้าสมัยไปแล้วทั้งในแง่ของเวอร์ชัน python และในแง่ของเวอร์ชัน ID3 ...
Bex

ลิงก์ทั้งสองไม่ทำงานอีกต่อไป (ฉันรู้คำตอบคือ 9 ขวบ) หากคุณกำลังมองหาหนังสือออนไลน์ "Dive into Python" นี่คือลิงค์
Edwin van Mierlo

ลิงก์นั้นใช้งานไม่ได้อีกต่อไป สิ่งที่ดีที่สุดที่ฉันทำได้อย่างรวดเร็วใน Google ตอนนี้คือgithub.com/diveintomark/diveintopython3
tripleee

6

ฉันดูคำตอบข้างต้นและพบว่าคำตอบเหล่านี้ไม่ดีสำหรับโครงการของฉันเนื่องจากปัญหาการออกใบอนุญาตกับ GPL

และฉันพบสิ่งนี้: PyID3Libในขณะที่วันที่เผยแพร่การผูกไพ ธ อนนั้นเก่า แต่ก็ใช้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 แม้ว่าจะติดตั้งแล้วก็ตาม ในการแก้ไขปัญหานี้ให้ติดตั้ง 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 เวอร์ชันต่างๆโดยเฉพาะดังนั้นโปรดตรวจสอบว่าแท็ก ID3 ไม่ล้าสมัยเกินไป

โดยส่วนตัวแล้วฉันใช้คลาส MP3Info ขนาดเล็กนี้ด้วยความโชคดี มันค่อนข้างเก่า

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


0

หลังจากการวิจัยเบื้องต้นฉันคิดว่ารายละเอียดเพลงอาจพอดีกับกรณีการใช้งานของฉัน แต่มันไม่ได้จัดการไฟล์. m4b สารก่อกลายพันธุ์ โปรดทราบว่าในขณะที่บางคนมีปัญหา (อย่างสมเหตุสมผล) เกี่ยวกับการเปลี่ยนพื้นผิวของคีย์รูปแบบเนทีฟของ Mutagen ซึ่งแตกต่างกันไปในแต่ละรูปแบบ (TIT2 สำหรับ mp3, ชื่อสำหรับ ogg, \ xa9nam สำหรับ mp4, Title for WMA เป็นต้น), การกลายพันธุ์ 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

คุณสามารถให้และอธิบายสิ่งนี้ได้หรือไม่?
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.