在python中检索mp3元数据的最佳方法是什么?我已经看到了一些框架,但我不确定哪种框架最好用......有什么想法吗?
答案 0 :(得分:96)
前几天我使用eyeD3取得了很大的成功。我发现它可以在ID3标签上添加艺术品,而我看到的其他模块则不能。您必须下载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()
答案 1 :(得分:34)
之前我曾使用mutagen编辑媒体文件中的标签。 mutagen的优点在于它可以处理其他格式,例如mp4,FLAC等。我使用这个API编写了几个成功很多的脚本。
答案 2 :(得分:15)
eyed3
的一个问题是,它会为常见的MP3文件抛出NotImplementedError("Unable to write ID3 v2.2")
。
根据我的经验,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。
答案 3 :(得分: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
答案 4 :(得分: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()
答案 5 :(得分:6)
答案 6 :(得分:5)
向你们提供更多信息:
查看PythonInMusic页面中的“MP3内容和元数据编辑器”部分。
答案 7 :(得分:5)
我看了上面的答案,发现由于GPL的许可问题,它们对我的项目不利。
我发现了这个:PyID3Lib,而那个特定的 python绑定发布日期已经过时了,它使用ID3Lib,它本身是最新的。
值得一提的是,两者都是 LGPL ,并且不错。
答案 8 :(得分: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 。
你可以使用python glob模块批量阅读和编辑
离。
import glob
songs = glob.glob('*') // script should be in directory of songs.
for song in songs:
// do the above work.
答案 9 :(得分:4)
我之所以使用tinytag 1.3.1是因为
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
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>
答案 10 :(得分:3)
在为这里推荐的eyeD3,pytaglib和ID3模块尝试简单的pip install
路由后,我发现第四个选项是唯一可行的选项。其余的都有导入错误,缺少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
如同广告宣传的那样,它很小而且独立。
答案 11 :(得分:1)
This toolkit可能会满足您的需求。我不能说它是否是“最好的”,但实际上,如果它能满足您的需求,那就重要了,对吗?
HTH
答案 12 :(得分:1)
除了阅读元数据之外,它还可以完全取决于您想要做什么。如果它只是你需要的比特率/名称等,而没有别的,轻量级的东西可能是最好的。
如果您正在操纵mp3,那么PyMedia可能是合适的。
有很多,无论你做什么,请确保并在大量样本媒体上进行测试。特别是有几种不同版本的ID3标签,因此请确保它不会过时。
就我个人而言,我已经运用了这个小型的MP3Info课程。它虽然很老。
答案 13 :(得分:1)
使用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的导入错误有关,即使它已安装。要解决此问题,请安装来自here
的魔术贴答案 14 :(得分:1)
我建议 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文件的属性。
答案 15 :(得分:1)
使用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
答案 16 :(得分:0)
如果您可以使用IronPython,则有TagLibSharp。 It can be used from any .NET language
答案 17 :(得分:0)
经过一些初步研究,我认为songdetails可能适合我的用例,但它不处理.m4b文件。 Mutagen确实如此。请注意,虽然有些人(合理地)对Mutagen的格式本机键表面处理有问题,但格式与格式不同(mp3的TIT2,ogg的标题,mp4的\ xa9nam,WMA的标题等),mutagen.File( )有一个(new?)easy = True参数,提供EasyMP3 / EasyID3标签,这些标签具有一致但有限的密钥组。到目前为止我只进行了有限的测试,但是当使用easy = True时,普通键,如专辑,艺术家,albumartist,流派,轨道号码,号码等等都存在且相同.mb4和.mp3文件非常方便我的目的。