mako なダラーなエスケープ

しょーもないネタ。

動画を「真っ黒かつ無音」部分に基づいて分割な ffmpeg」で書いたスクリプトなんだけれど、「分割ポイントに基いて云々」の「云々」部分て、考えてみると結構バリエーションがあって、ちょっと思いついただけでも「音の切れ目ごとに背景画像を変える」とかあれこれ欲が出てくる。けど基本的に「どんなバリエーションでもやることはほとんど一緒」…、てことは。テンプレートエンジンに頼る頃合かしらねぇと。

なので「Python 組み込みのもの」、Jinja2Mako のどやつでやったろうかいな、と思いを馳せているところ。

なのだけれど、「動画を「真っ黒かつ無音」部分に基づいて分割な ffmpeg」で書いたスクリプトって「bourne-shell スクリプトを吐き出す」ノリなんで、Mako の Expression Substitution と衝突しまくるんだいね。どーしたもんかいなと。

なんのテンプレートエンジンを使うにせよ付きまとう問題、なわけだけれど、Mako はワタシは初めて存在を知ったあと、「知った」だけで満足してしまって、結局使ってきてなかったので、全くの未知。ワガランなぁ、と探していたら見つけたtext ね。

当たり前のことだが「Mako のドキュメント」を書く必要性から、こうしたものは必ずある。google groups で質問してる人もそうなんだけど「エスケープ」というトピックで探そうとすると結構迷走しがちなんだよね。よくよく考えたら、たとえば html であれば「pre」、TeX であれば verbatim みたいに、「全体をそのまま出力する機能はないか?」という切り口で探してれば、もっと素早く正解に辿りついた、てことだわな。

なお、これがわかったので Mako を使う、と決断したってわけではない。作ってるものの性質上、比較的「Python 組み込みのヤツ」でも結構頑張れそうなものではあるので。


2019-03-10 07:00追記:
mako には「mako-render」というコマンドラインスクリプトが含まれてて手始めやすかった。ので手始めてみる。かなり楽だね:

mytemplate
 1 # -*- coding: utf-8 -*-
 2 <%!
 3 import pipes
 4 import json
 5 %>
 6 <%text>
 7 #! /bin/sh
 8 # -*- coding: utf-8 -*-
 9 ffmpeg="${ffmpeg:-c:/Program Files/ffmpeg-4.1-win64-shared/bin/ffmpeg}"
10 </%text>
11 inmov=${pipes.quote(inmov)}
12 outbase=${pipes.quote(outbase)}
13 ext="mp4"
14 <%text>
15 #
16 
17 "${ffmpeg}" -y \
18     -i "${inmov}" -i pipe: \
19     -map_metadata 1 -c copy "${outbase}.${ext}" <<'__END__'
20 </%text>
21 %for s, e in json.loads(splp):
22 [CHAPTER]
23 TIMEBASE=1/1000
24 START=${int(s*1000)}
25 END=${int(e*1000)}
26 %endfor
27 __END__
 1 [me@host: ~]$ /c/Python35/Script/mako-render.exe mytemplate \
 2 > --var 'inmov="hajimari" to "owari" no prologue.mp4' \
 3 > --var 'outbase=../m' \
 4 > --var 'splp=[[1,2],[3,4]]'
 5 
 6 
 7 #! /bin/sh
 8 # -*- coding: utf-8 -*-
 9 ffmpeg="${ffmpeg:-c:/Program Files/ffmpeg-4.1-win64-shared/bin/ffmpeg}"
10 
11 inmov='"hajimari" to "owari" no prologue.mp4'
12 outbase=../m
13 ext="mp4"
14 
15 #
16 
17 "${ffmpeg}" -y \
18     -i "${inmov}" -i pipe: \
19     -map_metadata 1 -c copy "${outbase}.${ext}" <<'__END__'
20 
21 [CHAPTER]
22 TIMEBASE=1/1000
23 START=1000
24 END=2000
25 [CHAPTER]
26 TIMEBASE=1/1000
27 START=3000
28 END=4000
29 __END__

「いつものやつ」、つまり「空白の扱い」については研究必要だけれど、今書いてるコードからの移行はすぐに出来そうだ。