如何在Python中使用mutagen来编辑mp3和其他ID3标签

商业

Python标签编辑库, mutagen

Python库mutagen可以用来编辑MP3等多媒体文件的标签(元数据)。

Mutagen is a Python module to handle audio metadata. It supports ASF, FLAC, MP4, Monkey’s Audio, MP3, Musepack, Ogg Opus, Ogg FLAC, Ogg Speex, Ogg Theora, Ogg Vorbis, True Audio, WavPack, OptimFROG, and AIFF audio files.

你可以用pip安装它。

$ pip install mutagen

下面是一个编辑ID3标签的例子。

关于ID3的更多信息,见以下链接。该标准最初是为mp3创建的,但现在也适用于mp4(m4a)和其他非mp3文件。

mutagen.easyid3

如果你只想读或写艺术家的名字、专辑名称、曲目编号等,使用EasyID3模块很容易。

from mutagen.easyid3 import EasyID3

要写一个歌名,请做以下工作

path = 'example.mp3'
tags = EasyID3(path)
tags['title'] = 'new_title'
tags.save()

为了实现简单的界面,只有有限的标签可以被编辑,但对于基本的使用来说已经足够。可以编辑的标签见下文。
EasyID3.valid_keys.keys()

for key in EasyID3.valid_keys.keys():
    print(key)
# album
# bpm
# compilation
# composer
# copyright
# encodedby
# lyricist
# length
# media
# mood
# title
# version
# artist
# albumartist
# conductor
# arranger
# discnumber
# organization
# tracknumber
# author
# albumartistsort
# albumsort
# composersort
# artistsort
# titlesort
# isrc
# discsubtitle
# language
# genre
# date
# originaldate
# performer:*
# musicbrainz_trackid
# website
# replaygain_*_gain
# replaygain_*_peak
# musicbrainz_artistid
# musicbrainz_albumid
# musicbrainz_albumartistid
# musicbrainz_trmid
# musicip_puid
# musicip_fingerprint
# musicbrainz_albumstatus
# musicbrainz_albumtype
# releasecountry
# musicbrainz_discid
# asin
# performer
# barcode
# catalognumber
# musicbrainz_releasetrackid
# musicbrainz_releasegroupid
# musicbrainz_workid
# acoustid_fingerprint
# acoustid_id

定义一个函数是很有用的。

标签的写法如下。轨道的总数(歌曲的数量)由'tracknumber'的分母来表示。盘数也是如此。

def set_id3_tag(file_path, title=None, artist=None, albumartist=None, album=None, genre=None,
                track_num=None, total_track_num=None, disc_num=None, total_disc_num=None):
    tags = EasyID3(file_path)

    if title:
        tags['title'] = title
    if artist:
        tags['artist'] = artist
    if albumartist:
        tags['albumartist'] = albumartist
    if album:
        tags['album'] = album
    if genre:
        tags['genre'] = genre
    if total_track_num:
        if track_num:
            tags['tracknumber'] = '{}/{}'.format(track_num, total_track_num)
        else:
            tags['tracknumber'] = '/{}'.format(total_track_num)
    else:
        if track_num:
            tags['tracknumber'] = '{}'.format(track_num)
    if total_disc_num:
        if disc_num:
            tags['discnumber'] = '{}/{}'.format(disc_num, total_disc_num)
        else:
            tags['discnumber'] = '/{}'.format(total_disc_num)
    else:
        if track_num:
            tags['discnumber'] = '{}'.format(disc_num)

    tags.save()

标签的读出(显示)情况如下。

def show_id3_tags(file_path):
    tags = EasyID3(file_path)
    print(tags.pprint())

标签的删除情况如下。

def delete_id3_tag(file_path, target_tag):
    tags = EasyID3(file_path)
    tags.pop(target_tag, None)
    tags.save()


def delete_all_id3_tag(file_path):
    tags = EasyID3(file_path)
    tags.delete()
    tags.save()

使用方法如下。

set_id3_tag(path, albumartist='new_artist')
delete_id3_tag(path, 'discnumber')
show_id3_tags(path)

mutagen.id3

要直接编辑ID3标签,请使用ID3模块。

from mutagen.id3 import ID3, TIT2

path = 'example.mp3'
tags = ID3(path)
print(tags.pprint())

tags.add(TIT2(encoding=3, text="new_title"))
tags.save()

要写,指定标签ID,如下所示。

  • 歌名 (TIT2)
  • 专辑名称 (TALB)

标签ID在以下链接的官方文档中进行了总结,但很难理解它们代表什么样的信息。

使用pprint()方法来显示现有文件的ID3标签以检查其对应关系可能更容易。