【问题标题】:Accessing MP3 metadata with Python [closed]使用 Python 访问 MP3 元数据 [关闭]
【发布时间】:2010-09-05 18:07:23
【问题描述】:

是否有可用于使用 Python 检索和设置 MP3 ID3 元数据的维护包?

【问题讨论】:

标签: python mp3 metadata


【解决方案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. 积极支持:
    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>
    

    【讨论】:

    • 看起来像是一个好的图书馆的开始。不幸的是,它们还不支持所有标签,特别是歌词的 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")

    根据我的经验,mutagenEasyID3 工作更可靠。示例:

    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
      

      正如宣传的那样,它很小且独立。

      【讨论】:

      【解决方案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

              【讨论】:

                猜你喜欢
                • 2011-03-16
                • 2012-09-28
                • 2012-01-27
                • 1970-01-01
                • 1970-01-01
                • 2016-07-02
                • 1970-01-01
                • 1970-01-01
                • 2011-07-17
                相关资源
                最近更新 更多