py2exo

概要

Python DSLで書かれた原稿を Aviutl のタイムラインファイル(.exo)に変換するCLIツール。
動画を作ろうとしたら動画を作るものを作り始めてしまった。

初めて Python で複数ファイルに分けてOOPなコードを書いた気がする。最初バーッと書いた後, 結合度が気になって全部書き直した。
期間を持つ動画オブジェクトをタイムラインに配置する所が競技プログラミングの問題みたいで面白かったが、妥協した。

DSL

from src import scene, movie, Actor
from src.generator import Seikasay
from src.objects import ImageObject, AudioObject
 
caption_style = {
    'サイズ': '40',
    'font': '07ロゴたいぷゴシック7',
    # 中央寄せ[中]
    'align': 4,
    'color': '8fcdda',
    'Y': '200.0',
}
 
aoi_caption_style = {
    **caption_style,
    'color': '8fcdda',
}
 
akane_caption_style = {
    **caption_style,
    'color': 'df7d81',
}
 
with movie():
    aoi = Actor('葵',
	    options=aoi_caption_style, 
	    generator=Seikasay(options={ '-cid': '2002' }))
    akane = Actor('茜',
	    options=akane_caption_style, 
	    generator=Seikasay(options={ '-cid': '2003' }))
 
    back = ImageObject('./back.jpg').scaled(0.5)
    bgm = AudioObject('./Morning.mp3', 0)
    aoi_stand = ImageObject('./aoi.png').scaled(0.4).positioned('bl')
    akane_stand = ImageObject('./akane.png').scaled(0.4).positioned('br')
 
    with scene(scene_objects=[back, bgm, aoi_stand, akane_stand]) as s:
        aoi > '全集中'
        s < ImageObject('./morpeko.png').scaled(0.5)
        akane > '水の呼吸'
        akane > '壱の型'
        aoi > '水面斬り'
        
    with scene(scene_objects=[back, bgm, aoi_stand]) as s:
        aoi > 'ありがとうございました'

Pythonに少し詳しくなれた. operator overloadingとか, contextlib とか