#概要
筆者はitunesという音楽プレイヤーを長年使っていたのですが、ubuntuに開発環境を移行してしまったため使えなくなりました。
代わりにRhythmboxというubuntu標準の音楽プレイヤーを使い始めたのですが、一つ問題が発生しました。itunesではmusicディレクトリ配下→アーティスト名ディレクトリ→アルバム名ディレクトリ→曲名ファイル、というように階層ごとに音楽ファイルが整理され、タグを編集する度に自動でリネームされていました。
しかしRhythmboxにこの整理機能はなく、音楽ファイルを追加するにつれてディレクトリ構造がぐちゃぐちゃになってしまいました。そこでPythonとmutagenというライブラリを使用することによって、音楽フォルダの階層構造を整理しようと考えました。
本スクリプトは Python 3.8.0、mutagen1.45.1で動作確認しています。
##mutagenとは
mp3やAAC、FLACなどの音楽ファイルのタグ(メタデータ)をPythonで取り扱うことが出来るライブラリです。細かいクラスの仕様なんかは公式ドキュメントのAPIリファレンスとかに書いてあります。
##ライブラリをインストール
$ pip3 install mutagen #mutagenパッケージをインストールします。
##以下ソースコード
#ライブラリをインポート
import glob
from mutagen.mp4 import MP4
from mutagen.flac import FLAC
from mutagen.easyid3 import EasyID3
import os
import shutil
directory = 'temp' #整理したい音楽ファイルが入っているディレクトリのパスを書いてください。
indirectory = 'main' #整理した音楽ファイルとディレクトリを入れたいディレクトリのパスを書いてください。
filelist = glob.glob(directory + '/**',recursive=True) #globモジュールでファイル名を再帰的にリスト化します。
for file in filelist: #filelistをfor文で回します。
if file.endswith('.m4a'): #ファイル名の末尾がm4aの場合、MP4クラスでタグ情報を取り出します。
tags = MP4(file)
end = '.m4a'
musicfile = 'MP4'
elif file.endswith('.mp3'): #ファイル名の末尾がmp3の場合、EasyID3クラスでタグ情報を取り出します。
tags = EasyID3(file)
end = '.mp3'
musicfile = 'MP3'
elif file.endswith('.flac'): #ファイル名の末尾がflacの場合、FLACクラスでタグ情報を取り出します。
tags = FLAC(file)
end = '.flac'
musicfile = 'FLAC'
else:
musicfile = 'FALSE'
if musicfile != 'FALSE':
#tracknumber変数に曲のトラック番号を入れます。
if (musicfile == 'MP3') or (musicfile == 'FLAC'):
tracknumber = str((tags['tracknumber'])[0])
elif musicfile == 'MP4':
tracknumber = str((tags['trkn'])[0])
if '/' in tracknumber:
temp = tracknumber.find('/') #トラック番号/総トラック数(例:2/14)などの形でトラック番号が入るので、/以降を取り除きます。
tracknumber = tracknumber[0:temp]
#album変数に曲のアルバム名を入れます。
if (musicfile == 'MP3') or (musicfile == 'FLAC'):
album = str((tags['album'])[0])
elif musicfile == 'MP4':
album = str((tags['\xa9alb'])[0])
#title変数に曲のタイトルを入れます。
if (musicfile == 'MP3') or (musicfile == 'FLAC'):
title = str((tags['title'])[0])
elif musicfile == 'MP4':
title = str((tags['\xa9nam'])[0])
#artist変数に曲のアーティスト名を入れます。
if (musicfile == 'MP3') or (musicfile == 'FLAC'):
artist = str((tags['artist'])[0])
elif musicfile == 'MP4':
artist = str((tags['\xa9ART'])[0])
#albumartist変数に曲のアルバムアーティスト名を入れます。
if (musicfile == 'MP3') or (musicfile == 'FLAC'):
albumartist = str((tags['albumartist'][0]))
elif musicfile == 'MP4':
albumartist = str((tags['aART'][0]))
#filenameとfoldernameの構造を決めます。ここを書き換えることで好みのディレクトリ構造にすることが可能です。
filename = tracknumber + '_' + title + end
foldername = albumartist + '/' + album
#ディレクトリを作成します。exist_ok=Trueのため、既に存在している場合は何もしません。
os.makedirs(indirectory + '/' + foldername,exist_ok=True)
#ファイルを移動させ、リネームします。そしてファイルのパスを出力します。
print(shutil.move(file,indirectory + '/' + foldername + '/' + filename))
##ハマったところ
AAC周りのタグの取り出し方が非常に分かりづらい。そこ以外は非常に使いやすいライブラリでした。ありがとうございます。
#参考文献
・https://mutagen.readthedocs.io/en/latest/
・https://note.nkmk.me/python-mutagen-mp3-id3/
・https://www.wizard-notes.com/entry/python/mutagen-cheatsheet