plexmediaserverのためのドラマ・アニメ用タグ付けpythonスクリプト
plexmediaserverのライブラリにドラマやアニメを登録する際、タグ付けが必要です。
例えば、
「波よ聞いてくれ #3[字]_2023-05-05_2315」
という名前で録画したドラマがあった場合、
以下のようにタグを付ける必要があります。
「波よ聞いてくれ #3s1e3[字]_2023-05-05_2315」
追加したタグは。「s1e3」。
つまり、season 1 episode 3(シーズン1の第3話)
であることを示しています。
このタグ付けを一括で行うpythonスクリプトを作成しました。
2023年5月19日 GUI版を公開しました。
スクリプトの使い方
以下をダウンロードして、適当なフォルダに展開してください。
plexmediaserverのためのドラマ・アニメ用タグ付けpythonスクリプト
中に入っているのは、フォルダとスクリプトです。
test_files
rename_animedrama.py
端末で、スクリプトがあるフォルダに移動します。
そこで、以下のコマンドを実行します。
user@test:~/test$ python3 rename_animedrama.py ./test_files
端末上には、マッチングした文字列が表示され、test_filesフォルダの中にあるファイルの名前にタグが追加されます。
既にタグがついている場合は、何もせず終了します。
タグを付けるためのドラマとアニメのタイトル調査
ドラマやアニメのタイトルでシーズンや話数がどう記述されているか、
2023年4月17~23日の間に放送された地デジ6チャンネルとBSのNHK2チャンネルの番組を調査した。
その結果、ドラマのタイトルでは以下のとおりでした。
表記名 | 表記例 | 数 |
---|---|---|
いげた | #1 | 28 |
かっこ | (1) | 12 |
話 | 第1話 | 10 |
CASE | CASE1 | 1 |
合計 | 51 |
アニメのタイトルでは以下のとおりでした。
表記名 | 表記例 | 数 |
---|---|---|
いげた | #1 | 8 |
話 | 第1話 | 6 |
シャープ | ♯1 | 3 |
かっこ | (1) | 1 |
しょう | 第1章 | 1 |
漢数字 | 第一話 | 1 |
話 | 1話 | 1 |
合計 | 21 |
この結果から、話数に関しては
「#(いげた)」「♯(シャープ)」と数字の場合
「(1)」「第1話」などの挟み込む場合
に話数へのタグを付けることにしました。
それ以外の「CASE1」「第一話」「第1章」などは、稀なケースなので、
事前に文字変換などして個別に処理してください。
シーズンに関しては、
「season」「season 」「Season」「シーズン」の場合
その後の数字をシーズン数としてタグ付けするようにしました。
タグ付けpythonスクリプトの作成
ChatGPTにお願いして、大枠を作り、微調整を行いました。
以下が最初のリクエスト。
pythonで以下の仕様のスクリプトを作成する。
引数で指定したフォルダの配下にあるすべてのファイルを調べる。
指定した条件にマッチした場合、文字列を付加する。
作成したスクリプトは、以下のとおりです。
# rename_animedrama_100.py # version 1.0 # 2023/04/28 # by simplelife # import os import re import argparse def rename_files(folder_path): # 正規表現パターンのコンパイル season_pattern = re.compile(r'(Season|season|season |シーズン)(\d{1,2})') ep1 = re.compile(r'(#|♯)\d{1,3}') ep2 = re.compile(r'\(\d{1,3}\)') ep3 = re.compile(r'第\d{1,3}話') episode_list = [ep1, ep2, ep3] se_pattern = re.compile(r'(s|S)(\d{1,2})(e|E)(\d{1,3})') # 全角から半角に変換するテーブル zenkaku_table = str.maketrans('1234567890()#','1234567890()#') # Get a list of all files in the folder and its subfolders file_list = [] for root, dirs, files in os.walk(folder_path): for filename in files: file_list.append(os.path.join(root, filename)) # Rename each file that matches the criteria for filepath in file_list: filename = os.path.basename(filepath) filename = filename.translate(zenkaku_table) if not re.search(se_pattern, filename): match = re.search(season_pattern, filename) if match: season = re.sub(r'\D', "", match.group()) else: season = 1 for episode_pattern in episode_list: match = re.search(episode_pattern, filename) if match: episode = re.sub(r'\D', "", match.group()) new_filename = re.sub(episode_pattern, match.group() + f's{season}e{episode}_', filename) os.rename(filepath, os.path.join(os.path.dirname(filepath), new_filename)) print(match.group()) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Rename files according to specified criteria') parser.add_argument('folder', metavar='FOLDER', type=str, help='the folder to search for files') args = parser.parse_args() rename_files(args.folder)
コメントを残す