👏

asciinema-trim - asciinema の session をトリミングする CLI

2021/12/18に公開

asciinema の session をトリミングする CLI を作りました。

https://github.com/suzuki-shunsuke/asciinema-trim

この記事を書いている時点で最新バージョンは v0.1.0 です。

asciinema とは

asciinema とは何かというと、ターミナルのセッションを録画して共有できるツールです。

https://asciinema.org/

https://github.com/asciinema/asciinema

OSS のデモを作るのに便利だなと思います。

https://zenn.dev/shunsuke_suzuki/scraps/bbfd168d70a01a

に書いたのですが、 asciinema を使って自分が開発している OSS のデモを作成しました。

解決したい問題

asciinema で録画した際、録画した session の一部をトリミングしたいと思うことがあります。

  • typing でもたついている部分を消したい
  • コマンドをコピペする際にもたついた部分を消したい
  • typo してコマンド実行してしまった部分を消したい
  • コマンドの完了に時間がかかっている部分を消したい
  • etc

asciinema では録画した結果をテキストファイルとして出力でき、そのファイルを編集することでトリミングすることができます。
フォーマットはここで定義されています。

https://github.com/asciinema/asciinema/blob/develop/doc/asciicast-v2.md

しかしこれを手で修正してトリミングするのはあまり現実的じゃないと思います。というのも、
ある箇所をトリミングする場合、その行よりあとの全行の time を修正する必要があるからです。

例えば以下のようになっていたとして、 3 行目と 4 行目の間を 3 秒削りたいとしましょう。

[0.248848, "o", "\u001b[1;31mHello \u001b[32mWorld!\u001b[0m\n"]
[1.001376, "o", "That was ok\rThis is better."]
[2.143733, "o", " "]
[6.541828, "o", "Bye!"]
[7.541828, "o", "Bye!"]
[8.541828, "o", "Bye!"]

その場合、 4 行目だけでなく、 5 行目以降の全行の time から 3 を引く必要があります。

[0.248848, "o", "\u001b[1;31mHello \u001b[32mWorld!\u001b[0m\n"]
[1.001376, "o", "That was ok\rThis is better."]
[2.143733, "o", " "]
[3.541828, "o", "Bye!"]
[4.541828, "o", "Bye!"]
[5.541828, "o", "Bye!"]

これが数百行となると手で修正するのは現実的ではありません。

asciinema-trim

そこで簡単にトリミングするための CLI を作りました。
使い方は簡単で、切り取りたい箇所に、切り取りたい秒数を記入します。

[0.248848, "o", "\u001b[1;31mHello \u001b[32mWorld!\u001b[0m\n"]
[1.001376, "o", "That was ok\rThis is better."]
[2.143733, "o", " "]
3
[6.541828, "o", "Bye!"]
[7.541828, "o", "Bye!"]
[8.541828, "o", "Bye!"]

小数でも大丈夫です。

そして asciinema-trim を実行します。結果は標準出力されるので、ファイルに書き出します。

$ asciinema-trim input.cast > output.cast

これだけのシンプルなツールです。

typo した部分を消したい場合は、行を消した上で切り取りたい秒数を記入します。

Discussion