Hatena::Grouptwitter

smokeymonkey@ついったー部 RSSフィード

 | 

2008-01-24

LastFmRank機能拡張:ついったー部Last.fm部全員の中で最近聴いたトラックを投稿する

15:11 | LastFmRank機能拡張:ついったー部Last.fm部全員の中で最近聴いたトラックを投稿する - smokeymonkey@ついったー部 を含むブックマーク はてなブックマーク - LastFmRank機能拡張:ついったー部Last.fm部全員の中で最近聴いたトラックを投稿する - smokeymonkey@ついったー部

LastFmRankですが、1週間に1回しか動かないのではもったいない。そこで、ついったー部のLast.fm部から各ユーザIDを抽出し、Last.fmのデータフィードの「最近聴いたトラック」フィードを収集し、一番最近再生されたトラックを、@LastFmRankに投稿するようにしました。

毎時間0分、30分に実行するよう、Cronで回してます。

ツッコミ、修正を募集しています。

#!/usr/bin/perl

use strict;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use HTML::LinkExtor;
use XML::DOM;
use Encode;
use Net::Twitter;
use Jcode;

sub main {
  # Last.fm Club
  my $URL = 'http://twitter.g.hatena.ne.jp/keyword/Last.fm%E9%83%A8';

  my $proxy = new LWP::UserAgent;
  my $req = HTTP::Request->new('GET' => $URL);
  my $res = $proxy->request($req);

  my $p = HTML::LinkExtor->new(unlink(),$URL);
  $p->parse($res->{_content});
  my $i=0;
  my @trklst;
  for my $link ($p->links){
    my $href = join(" ", @{$link});
    if ($href =~ /.*http:\/\/www\.last.*\/user\//) {
      $href =~ s/.*\/user\///;
      $href =~ s/\///g;
      my $xml = "http://ws.audioscrobbler.com/1.0/user/$href/recenttracks.xml";
      my $proxy = new LWP::UserAgent;
      my $req = HTTP::Request->new('GET' => $xml);
      my $res = $proxy->request($req);
      if ($res->is_success) {
        eval {
          my $parser = new XML::DOM::Parser;
          my $doc = $parser->parsefile($xml); 
          my $nodelist = $doc->getElementsByTagName("track");
          my $node = $nodelist->item(0); 
          my $arttmp = $node->getElementsByTagName("artist")->item(0)->getFirstChild->getNodeValue;
          my $namtmp = $node->getElementsByTagName("name")->item(0)->getFirstChild->getNodeValue;
          my $uts = $node->getElementsByTagName("date")->item(0)->getAttribute("uts");
          my $artist = encode('utf8',$arttmp);
          my $name = encode('utf8',$namtmp);
          $trklst[$i][0] = $href;
          $trklst[$i][1] = $artist;
          $trklst[$i][2] = $name;
          $trklst[$i][3] = $uts;
          $i++;
        };
      }
      sleep(1);
    }
  }

  my @playlst = sort{$b->[3] <=> $a->[3] } @trklst;

  my $twit = Net::Twitter->new(
    username=>"LastFmRank" 
    , password=>"PASSWORD"
  );

  my $text = "ついったー部 Now Playing! 【$playlst[0][1]:[$playlst[0][2]]】 by $playlst[0][0]";
  Jcode::convert(\$text, 'utf8');
  my $result = $twit->update($text);
}

eval {&main(@ARGV)};
print "ERROR\n" if $@;

exit;
 |