やりたかったこと
ニコニコ動画からダウンロードしたボカロ曲が大量にあるのですが、Pythonでカバーアートを付けようと思いスクリプトを組んでみました。
開発環境がWindowsだったのでいろいろと苦労させられましたが、無事にそれっぽい流れを実現することができました。
ちなみに、タグ付け後はWindowsのエクスプローラでこんな感じにきれいに表示されます。嬉しい!!
流れ
まずはrequestsでニコ動からサムネイルを取得します。
その後、Pillowを使って画像のサイズを取得し、正方形にクロップします。
最後にmutagenを使ってタグ付けをします。
本当はeyeD3を使いたかったのですが、Python3非対応だったので諦めました。
コード
import requests
from mutagen.id3 import ID3, APIC
from mutagen.id3 import ID3NoHeaderError
from PIL import Image
from io import BytesIO
def add_tag(file_path, thumbnail_url):
try:
tags = ID3(file_path)
except ID3NoHeaderError:
print("Adding ID3 header.")
tags = ID3()
retry = 3
while retry >= 0:
try:
coverart_page= requests.get(thumbnail_url + ".L")
if coverart_page.status_code == 404:
coverart_page= requests.get(thumbnail_url)
jpeg_file = BytesIO(coverart_page.content)
image_processor = Image.open(jpeg_file)
size = image_processor.size
smaller, larger = size if size[0] < size[1] else size[::-1]
box = ((larger-smaller)/2, 0, (larger-smaller)/2+smaller, smaller)
cropped = image_processor.crop(box)
temp = BytesIO()
cropped.save(temp, format="JPEG")
temp.seek(0)
coverart = temp.read()
tags["APIC:"] = APIC(
encoding=3,
mime='image/jpeg',
type=3,
desc='Cover',
data=coverart
)
break
except requests.ConnectionError as e:
print(e)
retry -= 1
tags.save(file_path, v1=0, v2_version=3)
Pillowはファイルの読み書きを前提に作られていますので、今回のようにファイルを仲介せずにカバーアートを埋め込む場合、BytesIOなどのファイルオブジェクトを仲介する必要があります。(読み込みに関してはバイト文字列からの関数があった気もしますが)
また、ニコニコ動画のサムネイルは大サイズと小サイズの2種類がありますので、requestsで サムネイルURL + .L のURLを取得して404が帰ってきたらリトライして小サイズを持ってくるようにしています。