Help us understand the problem. What is going on with this article?

音楽ファイルのファイル名をタグを利用して一括変更

More than 1 year has passed since last update.

初投稿です。更に、自ら思い立ったものを実装することすら初めてになります。至らない点等多々あるかと思いますがご容赦ください。

はじめに

自動でタグ付けしてくれる機能を備えた音楽管理ソフトは多々ありますが、意外とそれに合わせてファイル名を一括で変更してくれる機能を持ったソフトは見ません。おそらくその機能を見落としているだけだとは思うんですが、いい機会なので勉強もかねて、タグに準じてファイル名を変更する機能をPython3で実装してみようと思います。

概要

ディレクトリを指定して、内部のファイルのリストを作成。その後拡張子より音楽ファイルを識別し、タグをもとにファイル名を変更するような機能を実装します。

実装の手順

mutagenのインストール

ターミナルより、$pip install mutagenで、mutagenという音楽ファイルのタグを編集するモジュールを読み込みます。これにより、数多くの形式の音楽ファイルのタグをいじれるようになります。

ソースコードの記述

sample.py
import os
from mutagen.flac import FLAC
from mutagen.easyid3 import EasyID3

def name_change():
    os.chdir('~音楽ファイルの格納されたディレクトリの絶対パス~')
    filelist = os.listdir(os.getcwd())

    for file in filelist:

        path = os.path.join(os.getcwd(), file)

        #tagsにタグのディクショナリを読み込む
        if file.endswith(".flac"):
            tags = FLAC(file)
            end = ".flac"
        elif file.endswith(".mp3"):
            tags = EasyID3(file)
            end = ".mp3"

        #ここから拡張子の対応を増やせる


        #文字列を取り出す
        name = ','.join(tags['title'])


        i = 1
        original = name
        name = original + end

        if name != file:
            while os.path.exists(name):
                    i += 1
                    name = original + " " + str(i) + end

            os.rename(path, name.replace("\"","").replace("\\","").replace("/","").replace("*","").replace(":","").replace("|","").replace("<","").replace(">","").replace("?",""))

import

osはディレクトリ内のファイルのリスト作成やファイル名の変更、FLACはflacファイルのタグの辞書化、EasyID3はmp3ファイルのタグの辞書化に用います。

ディレクトリの指定とディレクトリ内のファイルのリスト作成

os.chdir('絶対パス') によってディレクトリの移動を行い、 os.listdir() でファイルのリストを作成します。 os.getcwd() はカレントディレクトリの絶対パスを返す関数です。

ファイルを1つずつ見ていく

ここからはfor文の中に入り、1つずつファイルを操作します。

  1. パスをくっつける関数 os.path.join() を用いて、pathに操作するファイルの絶対パスを格納します。
  2. if文と、 endswith() 関数を用いて、選択しているファイルの拡張子を調べます。分岐したのち、拡張子に対応した方法でtagsというディクショナリーを作成します。また、この時忘れずに拡張子も文字列として保存してください。今回書いたコードではmp3とflacのみの対応ですが、importしたのちにこの部分を書き加えることでほかの拡張子にも対応することができます。
  3. nameにタグの中身を保存します。私はファイル名は長くなると見にくいので曲名だけにしましたが、この辺をうまくいじったり、ほかの変数にほかのタグを入れたりすることで、「アーティスト名 - タイトル」のようにファイル名を変更するプログラムも作れます。辞書の中身の文字列だけ取り出すいい方法がイマイチわからなかった・・・
  4. originalという変数にタグのタイトルのみを格納したのち、nameの中身をタイトル + 拡張子となるようにします。この時点でタグからタイトルを取り出す作業は終わりです。
  5. if文でファイル名に変更が必要かどうかを判定したのち、while文を用いてファイル名の重複が起きないように命名していきます。今回は、「タイトル 数字 拡張子」となるようにしました。このために拡張子を別で穂損したんですね。これをしないと同じ名前の曲があったときに消えるファイルが出てきます。この作業アイドルマスターのオタクには非常に重要になってきます。最後に、os.renameの関数で実際にファイルを指定しリネームしてコードはおしまいです。この際、.replace()を連立させることで、使用禁止文字を消し飛ばします。

おわり

これまでCでプログラミングを勉強していたんですがPythonほんとに便利ですね。優しすぎて不安になってきます。こんなにあっさりできるとは思いませんでした。絶対パスの指定を実行時にもできるようにするとか拡張子の対応を増やすとかできそうなところからもっと実用的にしたいですね。ちなみにMusicBeeだとタグからの命名がすごく簡単にできます。おすすめです。私はAIFFファイルのタグ付けが非対応なので常用はできませんが・・・

更新情報

ファイル名を変更する際、タグに使用禁止文字が含まれていた場合の不具合を修正しました。

参考にさせていただいたサイト

PythonでFlacファイルを扱う
Python osを使ったファイルの動作、操作。パスの操作などなど

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away