ニコ動のコメントをREPLで

最近ニコ動に上がっている作業用BGMとか、音声だけで楽しめるものをWinampで聴く、ということをしているんですが
nico-winamp
(Scheme でローカルサーバー -> localhost:2525/?id=VIDEO_ID 的なURLをWinampで再生 -> にこさうんど or にこみみのキャッシュを探す -> mp3をWinampに転送、という流れで。タイトルにダブルクォートが付いているのがウェブ上のリソースという印です。Content-Disposition の filename フィールドを表示しています)

コメントが見れないのがちょっと寂しくなってきたので、REPLに表示してみました:
nicocomment-scheme
(上のとは別の動画です)

コメントXMLのタイミング情報の単位がちょっと変わっていて (10ミリ秒) 戸惑いました。あと、XMLの取得に若干時間がかかってしまい、再生から少し送れて表示されてしまうという欠点があるんですが、プレイヤー側で時間調整すれば一応時間通りに表示することができます。


追記:

コメントの出力形式を変えてみました。歌詞職人のコメだけ抽出、みたいなことも出来たり…
nico-comment-occur

あと、コメント表示が再生開始のタイミングと同期できない問題は、カリー化関数の部分評価の機能により思いがけず解決しました。

(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の値を関数のパラメータにしておけば良かった話なんですが…