使用Python访问MP3元数据[关闭]


Answers:


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

9
@Ciantic:ID3标签非常简单,为什么不自己创建一个库并在BSD下发布呢?此外,这些人一开始并不拥有您任何东西。在这里看一下diveintopython.org/object%5Fdirectional%5Fframework/index.html
EstebanKüber2010年

2
@ voyager,ID3v1标签很简单,ID3v2标签很复杂……现在,我为pytagger github.com/Ciantic/songdetails创建了BSD包装器,但尚未将其标签为已发布,但它可以工作。
Ciantic 2010年

5
在较新的版本中,使用import eyed3(小写字母d)。
2014年

4
请注意,这些说明适用于旧版本的eyed3,现在将无法正常使用。例如,link()函数消失了,现在以声明方式设置了属性,而没有setter。
mlissner,2014年

37

我以前使用过诱变剂来编辑媒体文件中的标签。mutagen的优点在于它可以处理其他格式,例如mp4,FLAC等。我已经使用此API编写了许多脚本,并取得了很多成功。


2
code.google.com/p/mutagen-另外请注意Mutagen是GPL,因此对于大多数项目来说都是不可以的。
Ciantic

3
Mutagen很好,但是我缺少一种统一的方式来获取艺术家,标题类型等。-您最终不得不知道各种键,这些键与格式有关。TIT2对于mp3,titleogg,\xa9nammp4,TitleWMA等-很烂。
已退出–Anony-Mousse 2013年

20

问题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-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),不支持ID2标签的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()


6

《 Dive Into Python》一书中的一个简单示例对我来说很好,是下载链接,示例是fileinfo.py。不知道它是否是最好的,但它可以完成基本工作。

整本书可在此处在线获得。


3
就python版本和ID3版本而言,该示例现在都已经过时了
Bex 2014年

这两个链接都不再起作用。(我知道答案已经9岁了)如果您正在寻找在线书籍“ Dive into Python”,那么这里是当前链接
Edwin van Mierlo 17-11-25

该链接也不再起作用。我现在可以快速搜索到的最好的是github.com/diveintomark/diveintopython3
Tripleee,

6

我查看了以上答案,发现由于GPL的许可问题,它们对我的项目不利。

而且我发现了这一点:PyID3Lib,尽管该特定的python绑定发布日期较旧,但它使用的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

您可以使用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标签有几种不同的版本,因此请确保它不是过时的。

我个人很幸运地使用了这个小的MP3Info类。虽然已经很老了。

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


0

经过一些初步研究,我认为songdetails可能适合我的用例,但它不能处理.m4b文件。诱变剂确实如此。请注意,尽管有些人(合理地)对Mutagen的格式本机键出现问题有所不同,但格式不同(TIT2表示mp3,ogg的标题,\ xa9nam表示mp4,WMA的标题等),mutagen.File( )有一个(new?)easy = True参数,该参数提供EasyMP3 / EasyID3标签,这些标签具有一致的(尽管数量有限)密钥集。到目前为止,我只进行了有限的测试,但是使用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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.