2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】Pythonでミュージックディレクトリの階層構造を整理する【mutagen】

Last updated at Posted at 2021-02-15

#概要
 筆者は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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?