MyTunes Rudex なんて iTunes の共有をダウンロードするエグいツールが出てたんで、ちょっと実装を調べてみることに。
基本的には Rendezvous をつかって mDNS にサービスを登録しておき、共有しているサーバのリストを取得。iTunes の音楽配信自体は DAAP というプロトコルで行われる、と。この辺は developer.apple.com などで詳しく解説されています。日本語だと MYCOM の記事 とか。
んで Perl によるオープンな実装は CPAN で検索すると、Net::DAAP::Client というそのものがあり、そこに itshell というコマンドラインツールも同梱されてる。ActivePerl から CPAN シェルでがっつりいれるとカンタンにはいりました。
itshell は Rendezvous を調べる機能はないみたいで、サーバ名なしで起動すれば localhost をルックアップする仕様になっています。
C:\Documents ans Settings\miyagawa> itshell iTunes> db Loading database (may take a moment) iTunes> playlist 1615: miyagawa(Ashlee Simpson) iTunes> find Ashlee 3733 : Autobiography, Ashlee Simpson (Autobiography) iTunes> get 3733 Fetching 3733 : Autobiography, Ashlee Simpson (Autobiography) iTunes>
こんな感じで取得できた。他のマシンは IP アドレス指定すればOK。
んで、そもそも Rendezvous から共有されているマシンリストは、以下のような感じで取得できる。Machine Name は UTF-8 なので適宜シェルの文字コードにあわせて (Win なら cp932 あたり) 変換する必要ありです。
use Net::Rendezvous; my $res = Net::Rendezvous->new("daap"); $res->discover; for my $entry ($res->entries) { printf "%s:%s (%s)\n", $entry->address, $entry->port, $entry->attribute('Machine Name'); }
といじっているうちに、どうも1個だけ IP アドレスが正しく出てこず、しかも問い合わせがとっても長びくものがある。調べてみると iTunes の共有名に . (ドット) が含まれると split にシケる Net::Rendezvous のバグ。しかも Net::DNS::Resolver::Win32 にも影響がありそうなややこしい問題。この辺でとりあえず作者に報告して深追い終了しますか。。。
Net::Rendezvous は重すぎますね…。
ちなみに Win32 の iTunes 4.6 ですが、Forbidden でハジかれずに済んでます。
Net::Rendezvous から取り出した IP を使って、itshell で他の人の共有から playlist を見て、普通に問題なく get 出来ました。
日本語の曲が入ってると "Wide character in print" で怒られるので、itshell を所々書換えて使ってます。
うーん、そうですか。
なんかこっちの Net::DAAP::Client とかの問題かな?
Net::DAAP::Client、なんか CPAN で最新入れた後に、古い dapple っていうパッケージで上書きしてもうてた。最新版にしたら問題なく動いたっす!
Posted by: miyagawa on September 9, 2004 06:11 PM