mpv scripts

今日も mpv を Lua で弄る。

で、例によってディレクトリ内巡回機能なんですが。
筆者は再生終了で本体を終了しないように指定している。
再生中に「次のファイル」とすると普通に上手く切り替わるんだけど。
EOF 状態からだとファイルは切り替わるけどポーズされた状態で始まる。

GStreamer は EOS(End of Stream) という表現だったけど。
mpv では EOF(End of File) なんですね、同じ意味だしどうでもいいけど。

試しに途中でポーズして切り替えだと完全に同じだ。
つまり mpv の EOF は単にポーズされた状態。
もしポーズだったら解除する、というコードを追加すればいい。

mp.command('loadfile "file://'..directory..filename..'"')
-- これでもいい、true|false を yes|no の文字列で
--if mp.get_property('pause') == 'yes' then
if mp.get_property_bool('pause') then
    mp.set_property_bool('pause', false)
    -- これでもいい、true|false を yes|no の文字列で
    --mp.set_property('pause', 'no')
end
break

mpv の property アクセスは全部文字列。
UNIX 系を知っているなら macOS を含んでありがちだと解りますね。
コレを直接 Lua から使える BOOL 値で取り出せるのが _bool 付き関数。

ところで。
~/.config/mpv/scripts
にソースを放り込めば全部が起動時に読み込みされ適用されていくんだね。
これは機能ごとに分割したほうが色々と都合がいい。

そういえばアスペクト比変更もデフォルトでは割り付けされていない。
色々割り付けても筆者はキーを忘れるので Ctrl+2 でサイクルがいいな。
-1 を突っ込むとデフォルトになるので一周させるようにすれば完璧。
OSD(On Screen Document) で表示もあると良さげ。

-- ~/.config/mpv/scripts/mpv_aspect_rate.lua

aspect_num = 0
aspects = {'4:3', '16:9', '1:1'}

function on_change_aspectrate()
    aspect_num = aspect_num + 1
    if aspect_num > #aspects then
        aspect_num = 0
        mp.set_property('video-aspect', '-1')
        mp.osd_message('Aspect Rate @ Default')
    else
        mp.set_property('video-aspect', aspects[aspect_num])
        mp.osd_message('Aspect Rate @ '..aspects[aspect_num])
    end
end
mp.add_key_binding('Ctrl+2', 'aspectrate_func', on_change_aspectrate)

これを放り込んで、よし動いた。
グローバル変数はインスタンス毎に記憶してくれるようだ、助かる。
以降 mpv プログラミングはまとめたページを作るか。

いやープログラミングって面白いですね。
Lua は別に面白くないけど書いたら思った通りに動いてくれるのが面白い。
言語はただの道具で重要なのは完成品、実社会と同じ。