Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2011-03-28

AnyEvent で DAAP サーバが立てられる AnyEvent::DAAP::Server というのを書きました

| 21:08 | AnyEvent で DAAP サーバが立てられる AnyEvent::DAAP::Server というのを書きました - NaN days を含むブックマーク はてなブックマーク - AnyEvent で DAAP サーバが立てられる AnyEvent::DAAP::Server というのを書きました - NaN days

DAAP っていうのは iTunes で同じネットワークにいる他人のライブラリの音楽が聞けたりするあれです。

CPAN には Net::DAAP::Server というのがすでにあり、かなり古いモジュールにも関わらず今でも使えてありがたいのですが、POE で実装されていて他の AnyEvent で書かれたソフトと連携が取りづらかったので、これと同じこと(+α)をするモジュールを AnyEvent で書き直したものです。

https://github.com/motemen/AnyEvent-DAAP-Server

以下のようなスクリプトを走らせると、iTunes の共有ってところに "AnyEvent::DAAP::Server" というのが出てきて、カレントディレクトリ以下の mp3 を一覧/再生できます。

http://gyazo.com/a1ed7a865721083c1a8e7051da201388.png

use strict;
use warnings;
use AnyEvent;
use AnyEvent::DAAP::Server;
use AnyEvent::DAAP::Server::Track::File::MP3;
use File::Find::Rule;

my $daap = AnyEvent::DAAP::Server->new;

foreach my $file (find name => '*.mp3', in => '.') {
    my $track = AnyEvent::DAAP::Server::Track::File::MP3->new(file => $file);
    $daap->add_track($track);
}

$daap->setup;

AE::cv->wait;

オリジナルの Net::DAAP::Server の機能 (ローカルの mp3 を配信する DAAP サーバを立てる) に加え、以下の機能も実装しています。

  • プレイリストの作成
  • 曲をあとから追加できる
    • $daap->database_updated を叩くと、クライアントにデータベースの更新が反映されます
  • 曲のポーズ/スキップ
    • AnyEvent::DAAP::Track::File::MP3 がデフォルトで対応しています
  • ローカルファイル以外のソースからでも配信できるように
    • AnyEvent::DAAP::Track を継承したクラスを定義すれば、いちおう実装可能にはなっているはずです

https://github.com/motemen/AnyEvent-DAAP-Server/blob/master/script/simple_daap_server.pl に微妙なサンプルを書いてあります。