Pythonで音楽ファイルのタグ情報を抽出するライブラリの一つとして、mutagen
があります。
mutagen
は個々の拡張ファイルに特化したタグ抽出が可能ですが、様々な拡張子をまとめて扱う際には条件分岐が多くなってしまいます。
そこで、様々な拡張子をまとめて扱うのに優れたタグ抽出ライブラリであるPyTagLib
を紹介します。
PyTagLib
PyTagLibはC++のタグ抽出ライブラリTagLib
のPythonラッパーです。
MP3 (ID3v1, ID3v2)だけでなく、FLAC、MPC、Speex、WavPack、TrueAudio、WAV、AIFF、MP4、ASFファイルをサポートしています。
mutagen
と比較すると、より簡単にタグ情報を抽出することができます。
インストール方法
PyTagLib
のインストールは、環境によっては厄介かもしれません。
Windowsの場合、単純にpip install pytaglib
でインストールしようとするとErrorがでます。
インストール方法は2つあります。
1. C++ライブラリをビルド
少し難易度が高いですが、自身でTagLib
をビルドするやりかたです。
詳しい手順は以下のWebページをご参考ください。
GitHub - supermihi/pytaglib: Python audio tagging library
2. ver. 1.4.1をインストール
以下のStack Overflowの回答では、Ubuntu 16.04 and Python 2で pip install pytaglib==1.4.1
とすることでpipによるインストールができたという報告がありました。
python - Pip installing pytaglib error - Stack Overflow
私のWin10環境でもインストールできました。
使い方
抽出方法は以下のように非常に簡単に記述できます。
import taglib filepath = "your_audiofilepath.xxx" song = taglib.File(filepath) song.tags # => アーティストやアルバム情報の辞書 # 例:アルバム情報を変更して保存する方法 # song.tags["ALBUM"] = ["Change"] # song.tags.save()
デモ
同じ楽曲で拡張子のみ異なる各ファイルから、タグ情報を抽出しました。
トラックやアルバムの番号はフォーマットによって形式が異なるため、利用する際は拡張子による場合分けが必要そうです。
$python test_tablib.py 03-10 FLASH.mp3 {'ALBUM': ['Perfume The Best “P Cubed”'], 'ARTIST': ['Perfume'], 'DATE': ['2019-09-18'], 'DISCNUMBER': ['3/3'], 'TITLE': ['FLASH'], 'TRACKNUMBER': ['10/18']} 03-10 FLASH.m4a {'ALBUM': ['Perfume The Best “P Cubed”'], 'ARTIST': ['Perfume'], 'DATE': ['2019-09-18'], 'DISCNUMBER': ['3/3'], 'ENCODEDBY': ['Nero AAC codec / 1.5.4.0'], 'TITLE': ['FLASH'], 'TRACKNUMBER': ['10/18']} 03-10 FLASH.flac {'ALBUM': ['Perfume The Best “P Cubed”'], 'ARTIST': ['Perfume'], 'DATE': ['2019-09-18'], 'DISCNUMBER': ['3'], 'DISCTOTAL': ['3'], 'TITLE': ['FLASH'], 'TRACKNUMBER': ['10'], 'TRACKTOTAL': ['18']} 03-10 FLASH.wav {'ALBUM': ['Perfume The Best “P Cubed”'], 'ARTIST': ['Perfume'], 'DATE': ['2019-09-18'], 'DISCNUMBER': ['3/3'], 'TITLE': ['FLASH'], 'TRACKNUMBER': ['10/18']}
デモ ソースコード
# -*- Coding: utf-8 -*- import taglib from pprint import pprint basename = "03-10 FLASH" exts = [".mp3", ".m4a", ".flac", ".wav"] for ext in exts: filepath = f"{basename}{ext}" song = taglib.File(filepath) print(filepath) pprint(song.tags) print("")
注意点
pytablib
で開いている状態のオーディオファイルはロックされるため、ファイル自体の再生や編集ができません。
同様に、taglibではファイルを開く必要があるため、pytaglib
を使ったプログラムを実行中は
操作対象となるオーディオファイルを操作・編集しないように注意が必要です。