使用 Python 访问 MP3 元数据 [关闭]
Posted
技术标签:
【中文标题】使用 Python 访问 MP3 元数据 [关闭]【英文标题】:Accessing MP3 metadata with Python [closed] 【发布时间】:2010-09-05 18:07:23 【问题描述】:是否有可用于使用 Python 检索和设置 MP3 ID3 元数据的维护包?
【问题讨论】:
eyed3.readthedocs.io/en/latest 【参考方案1】:最简单的方法是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.
【讨论】:
【参考方案2】:我用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>
【讨论】:
看起来像是一个好的图书馆的开始。不幸的是,它们还不支持所有标签,特别是歌词的 USLT 和 SYLT。【参考方案3】:使用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
【讨论】:
您能对此提供解释吗?【参考方案4】:前几天我使用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()
【讨论】:
eyeD3 也是 GPL...所以如果您像我一样打算在您的程序中使用它,您也必须将您的程序作为免费程序发布...该死的这些人,为什么不能在 LGPL 下发布? @Ciantic:ID3标签非常简单,为什么不自己做一个库,在BSD下发布呢?此外,这个人一开始并不拥有你的任何东西。看这里diveintopython.org/object%5Foriented%5Fframework/index.html @voyager,ID3v1 标签很简单,ID3v2 标签非常复杂......现在我已经为 pytagger github.com/Ciantic/songdetails 创建了 BSD 包装器,我还没有将它标记为已发布,但它可以工作。 在较新的版本中,使用import eyed3
(小写d)。
请注意,这些注释适用于较旧版本的 eyed3,不再适用。例如,link() 函数已经消失,现在以声明方式设置属性,没有设置器。【参考方案5】:
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找到。
【讨论】:
github.com/tooxie/shiva-server/issues/14 说“eyeD3 库已被 Mutagen 取代” 您提到的 eyeD3 错误有一个解决方法。您只需要在执行任何属性分配之前调用标签的 clear() 方法(如果您需要继承任何原始标签值,请在清除之前复制音频的标签对象)。 clear() 重置所有标签数据并使用与 eyeD3 兼容的默认 ID3 标签版本创建一个新标签【参考方案6】:我建议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文件的属性。
【讨论】:
【参考方案7】:在尝试了这里推荐的 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
正如宣传的那样,它很小且独立。
【讨论】:
tinytag 的较新版本:pypi.org/project/tinytag 最佳解决方案!谢谢【参考方案8】:第一个使用 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 安装 magic-bin whl
【讨论】:
这个答案错过了audiofile.tag.save()
保存修改后标签的调用【参考方案9】:
我以前用mutagen 编辑媒体文件中的标签。 mutagen 的好处是它可以处理其他格式,例如 mp4、FLAC 等。我使用这个 API 编写了几个脚本并取得了很大的成功。
【讨论】:
code.google.com/p/mutagen - 另请注意,Mutagen 是 GPL,因此对于大多数项目来说这是禁忌。 Mutagen 很好,但是我缺少一种统一的方式来获取艺术家、标题类型等 - 你最终必须知道各种键,这些键取决于格式。TIT2
用于 mp3,title
用于 ogg,\xa9nam
用于 mp4,Title
用于 WMA 等 - 太糟糕了。【参考方案10】:
经过一些初步研究,我认为 songdetails 可能适合我的用例,但它不能处理 .m4b 文件。诱变剂可以。请注意,虽然有些人(合理地)对 Mutagen 的格式原生键的表面处理提出了问题,但因格式而异(mp3 为 TIT2,ogg 为标题,mp4 为 \xa9nam,WMA 为标题等),mutagen.File( ) 有一个(新的?)easy=True 参数,它提供了 EasyMP3/EasyID3 标签,这些标签有一组一致但有限的键。到目前为止,我只进行了有限的测试,但是当使用 easy=True 时,.mb4 和 .mp3 文件的常用键,如专辑、艺术家、专辑艺术家、流派、曲目编号、光盘编号等都存在并且相同,使其成为对我来说非常方便。
【讨论】:
【参考方案11】:只是给你们一些额外的信息:
查看PythonInMusic页面中的“MP3素材和元数据编辑器”部分。
【讨论】:
【参考方案12】:看看这个:
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()
【讨论】:
【参考方案13】:我查看了上述答案,发现由于 GPL 的许可问题,它们不适合我的项目。
我发现了这一点:PyID3Lib,虽然那个特定的 python 绑定 发布日期很旧,但它使用的是 ID3Lib,它本身是最新的。
值得一提的是,两者都是 LGPL,而且都很好。
【讨论】:
【参考方案14】:您所追求的是ID3 模块。它非常简单,可以为您提供所需的一切。只需将 ID3.py 文件复制到您的站点包目录中,您就可以执行以下操作:
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
【讨论】:
只是一个注释。这个模块很旧(2002),不支持 V2 的 ID3 标签【参考方案15】:Dive Into Python 一书中的一个简单示例对我来说可以,this 是下载链接,示例是 fileinfo.py。不知道是不是最好的,但基本可以做。
整本书可在线获取here。
【讨论】:
这个例子现在有点过时了,无论是python版本还是ID3版本...... 两个链接都失效了。 (我知道答案是9岁)如果你正在寻找在线书籍《潜入Python》,这里是当前的link 那个链接也失效了。我现在可以快速谷歌的最好的是github.com/diveintomark/diveintopython3【参考方案16】:除了读取元数据之外,它还可以完全取决于您想要做什么。如果它只是您需要的比特率/名称等,没有别的,那么轻量级的可能是最好的。
如果您正在处理过去的 mp3,PyMedia 可能是合适的。
有很多,无论您得到什么,请确保并在大量示例媒体上进行测试。特别是有几个不同版本的 ID3 标签,所以请确保它不会太过时。
我个人很幸运地使用了这个小的 MP3Info 类。不过已经很老了。
http://www.omniscia.org/~vivake/python/MP3Info.py
【讨论】:
以上是关于使用 Python 访问 MP3 元数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 firebase 存储上上传多个文件并将访问 url 和元数据作为 json 或 csv 文件获取? [关闭]
在 Python 中编辑类似文件的对象上的 MP3 元数据?