参考ページ
CLIP STUDIO PAINTの.lipファイルをハックして作業動画を書き出すWindowsアプリを作った – NET BIZ DIV. TECH BLOG
イラストを Git で管理したかったのでツールをつくった - blog.syfm
思いつき
上記ページを見ていて、もしかしたら漫画制作時のcmcファイルもsqlite3のデータなんじゃないかと思い、sqliteに通してみたら案の定sqlite3のデータベースファイルになっていた。
ページ順の取得
テーブルが存在するということは各clip/lipファイルを指し示す部分があるはずという事でCanvasNodeを見てみると、LinkPathに「ディレクトリ相対パスっぽいの:ファイル名」という形式で含まれているのが判ったため、CanvasNodeで順番さえとれれば、参考ページにあるようなサムネール抽出をページ順に名前付けして出せそうだという事が判った。
しかし、ナイーブツリーなパターンだったので一発で抽出するには再帰クエリが必要だった。
仕様っぽいの
- LinkPathがNULLのデータがツリールート
- ツリールートからはFirstChildIndexを参照して最初のページ情報を取得出来る。
- _PW_IDではなくMainIdが各インデックス参照に利用されている。
- 2ページ目以降はNextIndexが次のページ情報を指し示している。
- NextIndexが0になったら最終ページ
ただし、単純な漫画用データを見た結果なのでこれで全て扱えるかというと多分違う。
実験
WITH RECURSIVE r2 AS (
WITH RECURSIVE r1 AS (
SELECT CanvasNode.* FROM CanvasNode WHERE NextIndex = 0 AND LinkPath is NULL
UNION ALL
SELECT CanvasNode.* FROM CanvasNode, r1 WHERE CanvasNode.MainId = r1.FirstChildIndex
)
SELECT * FROM r1
UNION ALL
SELECT CanvasNode.* FROM CanvasNode, r2 WHERE CanvasNode.MainId = r2.NextIndex
)
SELECT LinkPath FROM r2 WHERE LinkPath IS NOT NULL;
画像のクエリでは一部*_PW_ID見てるけど、たまたま_PW_IDとMainId*が同じレコードを指してたので大丈夫だった。
各clip/lipファイルから画像を抜く
とりあえず実験の為、参考ページにあった画像抽出コマンドを書いておく。
sqlite3 page0010.lip "SELECT quote(ImageData) FROM CanvasPreview" | cut -d\' -f2 | xxd -r -p > page10.png
コマンドでやる場合は直接SELECTしても上手く通らないのでquoteで16進数文字列に変換してからシングルクオートを取り除いたものをバイナリに戻してファイルにリダイレクトしてるのか。なるほど。
雑感
なにか作りたい。golangで。