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版を公開しました。
スクリプトの使い方
以下をダウンロードして、適当なフォルダに展開してください。
中に入っているのは、フォルダとスクリプトです。
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)











コメントを残す