動画管理用ローカルWebアプリをNode.js & CoffeeScriptで書いてみた

Node.jsで書く理由が全く無いんですが、勉強のために、
ローカルで起動して動画の管理をするためのサーバーを書いてみました。


ビューと使ったライブラリ以外は、全てCoffeeScriptで書いてます。
一応、「BlackAlbum」と名前を付けました。
ネーミングは、二重のパクリです。


joker1007/blackalbum - GitHub
https://github.com/joker1007/blackalbum

必要なもの

  • node.js (v0.4.9 <= v0.4.11で動作確認)
  • mongodb
  • ffmpeg
  • ffmpegthumbnailer
  • 各種npmパッケージ

使い方

起動する

nohup coffee app.coffee -p 12345 &

http://localhost:12345/をブラウザで開く


読み込み対象のディレクトリを追加して、


データベース更新を実行すれば、サムネイルを作成してリスト表示する。


プレーヤーの設定を入れて、サムネイルかファイル名をクリックすると、
プレーヤーが起動して、再生が始まる。

背景

そもそも作ろうと思った理由は、WindowsにWhiteBrowserというイケてるメディア管理用のアプリがあるんですが、
MacLinuxに同様のアプリが無いんで、それじゃあ作るか、ってのが始まりです。
元々Sinatraとかで書くつもりだったんですが、Node.jsとCoffeeScriptの勉強も兼ねてって所。
実際、冒頭にも書きましたがNode.jsで書く理由がこれっぽっちも無いので、無駄な茨を踏んだ気がしてますが・・・。
本当はSocket.IOとか使って、もうちょっとインタラクティブな動きを実現したかったんですが、あんまり使い所が無かったし。


まあ、ノンブロッキングI/Oの挙動とか、コールバックスタイルでのプログラミングが大体分かったので、良かったかなと。
Node.jsでこんなことするのがそもそも間違ってる気がしますが、外部プロセスでffmpegを呼んで大量のデータ処理してると、
非同期でバンバン流れていくもんだから、ファイルディスクリプタ使いきってエラーになるとか・・・。

イマイチな点

  • エラー処理が甘い
    • Nodeのエラー処理がうまいこと行かなくて、しばしばサーバーごと落ちる。
    • そもそもデバッグが難しい。どこで落ちてんのか分からん上に、CoffeeScriptなんでスタックトレースの行表示も役に立たない。
    • try, catchもコールバック挟むと上手く動かないから、エラー処理が分散して死ねる。
  • インストールに手間がかかる
    • mongodbが必要。SQLiteにしとけば良かったかもしれないが面倒だった・・・。
    • 自分でforkしたnode-zipfileに依存してたり
    • Macでiconvを使う時に、利用するiconv本体を入れ替える必要がある
  • Mac専用
    • LinuxGUI環境が無くて検証がめんどいので、プレーヤー呼び出しとかMac用にハードコーディングしてる。


まあ、Macならhomebrewとnave使えばそんなに手間かからず使えるはず・・・。