はじめに
当ブログをAstroにリファクタリングした際に、記事のファイル名も01.mdx
等からblog-renaming-gpt-3-5-turbo.mdx
に変えました。
Next.jsもAstroもこのファイル名がそのままSlugになります。
ただ、前回同様手作業では面倒すぎるので、gpt-3.5-turboにお願いしました。
方法
前提として、content[1]
がtitle行になってます。
また、Slugだけをそのまま出力してほしいのですが、たまに余計な文がくっついてくるので、tryを挟んでいます。
本当はプロンプトやJSON出力でかっちりやればいいんですがそこまでやるのが面倒だったので…。
import glob, shutil
from openai import OpenAI
# タイトルからスラッグを考えてファイル名を変更する関数
def rename_file(file_path, model="gpt-3.5-turbo", temperature=0.5, max_tokens=90):
try:
# ファイルを読み込む
with open(file_path, "r", encoding="utf-8") as f:
content = f.readlines()
title = content[1]
# OpenAI設定
client = OpenAI(api_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
# スラッグ生成
slug_query = f"""以下のブログタイトルを英語に翻訳した後、ブログで使用するスラッグを作成してください。回答はスラッグのみで大丈夫です。:
\n\n{title}
"""
slug = client.chat.completions.create(
messages=[{"role": "user", "content": slug_query}],
model=model,
temperature=temperature,
max_tokens=max_tokens,
)
# ファイル名をスラッグに変更する
file_name = slug.choices[0].message.content.split('"')[1]
print(f"ファイル名: {file_name}\n---")
# 新ファイル作成
shutil.move(file_path, f"./new_file/{file_name}.mdx")
except:
print(f"ERROR: {file_path}")
使い方
old_fileフォルダにあるmdxファイルをサブフォルダを含めて読み取って処理します。デフォルトではリネーム後のファイルはnew_fileフォルダに吐き出されるようになってます。
posts = glob.glob("old_file/**/*.mdx", recursive=True)
for post in posts:
print(f"---\n処理: {post}")
rename_file(post)