Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

WebService::Lastfm::Controller - Controlling a Last.fm Stream Programatically

追記。search.cpan.org: Kentaro Kuribayashi / WebService-LastFM てな感じで、CPAN に登録しました。

音楽ストリーミングサイト兼 SNS であるという、なんだかわからないユニークなサービス Last.fm が、ストリーミングを外部からコントロールできる API の提供を開始したことを知り、さっそく遊んでみる。

まぁ、遊んでみるといったところでたいしたこともできないので、とりあえず Perl であれこれできるよう、モジュールを作ってみました。

とりあえずざっくり作っただけなのでドキュメントもなんにもない上に、ちゃんとテストしてないのでアレなのですが、アーカイブに同梱している ctrl.pl を実行すると、コマンドプロンプトから Last.fm が配信してくる曲をあれこれいじることができます。以下に使用例であるctrl.pl を示します。ドキュメント代わりです。ダメ過ぎです…。まぁ、週末にでもそのあたりちょろっと整備します。まぁ、ドキュメントがあったところで何? ってな話だと思いますが!

ちなみにこの例では、iTunes を使用しているので、他のプレイヤをお使いの方はてけとうにあれこれと。あと、API ドキュメントに書かれている ban コマンドや change station のあたり、いまのところどうも書かれてある通りのレスポンスを返してくれないようで、ちゃんと動きません…。どうなってるんでしょうか…。

ctrl.pl

use strict;
use Win32::OLE;
use WebService::Lastfm::Controller;

# set login data
my $username = 'username';
my $password = 'password';

my $ctrl = WebService::Lastfm::Controller->new;
my $stream_info;

eval {
    $stream_info = $ctrl->get_session(
        username => $username,
        password => $password,
    );
};

die "$@\n" if $@;

# create an iTunes object, then add the stream url to its playlist
my $itunes = my $itunes = Win32::OLE->new("iTunes.Application");
my $stream = $itunes->LibraryPlaylist->AddURL($stream_info->{stream_url});

$stream->play;

print "Command: ";

while (<>) {
    chomp;

    # fetch now playing song
    if ($_ eq 'get') {
        my $current_track = $ctrl->get_nowplaying;
        print $current_track->artist.': '.$current_track->track."\n";
    }

    # change station
    # mode: personal, profile, random
    elsif ($_ =~ /change\s+(.+)/) {
        my $response;
        eval { $response = $ctrl->change_station($1) };
        if ($@) {
            print "$@\n";
        } else {
            print "Response: $response\n";
        }
    }

    # quit
    elsif ($_ eq 'quit') {
        $stream->delete;
        print "quit...\n";
        last;
    }

    # send a command
    # command: skip, love, ban
    else {
        my $response;
        eval { $response = $ctrl->send_command($_) };
        if ($@) {
            print "$@\n";
        } else {
            print "Response: $response\n";
        }
    }

    print "Command: ";
}

exit;

まぁ、ぶっちゃけこんなの使いやすくて見栄えのいい UI がないと面白くもなんともないので、上のスクリプトじゃあんまりアレなのですが、まぁ、僕自身が使う分には便利だからいいや。というか、そのうち誰かハカーな方が iTunes 用のプラグインを作ってくれるだろうから期待しまくりです! という感じの尻切れとんぼなおしまし。