ニコ動のコメントをREPLで
最近ニコ動に上がっている作業用BGMとか、音声だけで楽しめるものをWinampで聴く、ということをしているんですが
(Scheme でローカルサーバー -> localhost:2525/?id=VIDEO_ID 的なURLをWinampで再生 -> にこさうんど or にこみみのキャッシュを探す -> mp3をWinampに転送、という流れで。タイトルにダブルクォートが付いているのがウェブ上のリソースという印です。Content-Disposition の filename フィールドを表示しています)
コメントが見れないのがちょっと寂しくなってきたので、REPLに表示してみました:
(上のとは別の動画です)
コメントXMLのタイミング情報の単位がちょっと変わっていて (10ミリ秒) 戸惑いました。あと、XMLの取得に若干時間がかかってしまい、再生から少し送れて表示されてしまうという欠点があるんですが、プレイヤー側で時間調整すれば一応時間通りに表示することができます。
追記:
コメントの出力形式を変えてみました。歌詞職人のコメだけ抽出、みたいなことも出来たり…
あと、コメント表示が再生開始のタイミングと同期できない問題は、カリー化関数の部分評価の機能により思いがけず解決しました。
(fun (nico-comment-disp ignore? chats) (let ((start (current-milliseconds))) (let loop ((chats chats)) (if (pair? chats) (receive (vpos chat) (values (* (caar chats) 10) (cdar chats)) (cond ((ignore? chat) (loop (cdr chats))) ((<= vpos (- (current-milliseconds) start)) (cout #\; (ms->time vpos) #\space (sxml:string chat) " \"" (user-id chat) #\" nl) (loop (cdr chats))) (else (sleep 0.333) (loop chats)))) (cout "; end of comments" nl)))))
この関数を、先に第1引数に適用してからXMLを取りに行くようにしたところ、startの値がその時点 (再生開始時) でのミリ秒に固定されるので、フルに適用されるまでの時間幅が吸収されるようになったんです。
まぁ、startの値を関数のパラメータにしておけば良かった話なんですが…