Amazon.co.jp ウィジェット

さむしんぐにゅぅ

さとうようぞう のBlog。気の向いた時に更新。サーバー落ちてたらまた来てちょ。
Plagger
2008年11月12日

P::P::F::TrackEndTimeFromTitleを書いた

先週の続き

だいぶ前にhackしたEvent.pmを使うの前提にPlagger::Plugin::Filter::TrackEndTimeFromTitleってのを書いてみました。書いたというかyusukebeさんのP::P::Filter::YouTubeFromTitleをほぼそのままパクリ。ありがとうございます。
package Plagger::Plugin::Filter::TrackEndTimeFromTitle;

use strict;
use base qw( Plagger::Plugin );
use Encode;
use HTML::Entities;
use Plagger::Event;

sub register {
    my($self, $context) = @_;
    $context->register_hook($self,
                            'update.entry.fixup' => \&filter,);
}

sub filter {
    my($self, $context, $args) = @_;
    my $e = $args->{entry};
    my ($title, $artist,$duration);
    my $starttime = $e -> date;
    my $event = $e -> event;

    $title = $e->title;
    $title = encode('UTF-8',$title);

    #Last.FM/audioscrobbler
    if($title =~ /(.*?)\s\342\200\223\s(.*?)\Z/){
        $artist = decode('UTF-8',$1);
        $title = decode('UTF-8',$2);
    }

    $duration = get_duration($self, $context, $artist, $title);

    unless($duration eq '') {
        my $event = Plagger::Event -> new;
        $event -> dtstart($e -> date);
        $event -> dtend($e -> date + DateTime::Duration->new(seconds => ($duration/1000)));
        $e -> add_event($event);
    }
}

sub get_duration {
    my ($self,$context,$artist, $title) = @_;
    my $url  = URI->new('http://ws.audioscrobbler.com/2.0/');
    my $file = $self->cache->path_to('track.getInfo_result.html');

    $artist = encode('UTF-8', $artist) unless $context->conf->{no_decode_utf8};
    $title = encode('UTF-8', $title) unless $context->conf->{no_decode_utf8};
    $context->log( info => 'Getting song duration from ' . $artist . " / " . $title );

    my $ua = Plagger::UserAgent->new;
    $url->query_form(method => 'track.getinfo',
                     artist => $artist,
                     track => $title,
                     api_key => $self->conf->{api_key} || 'b25b959554ed76058ac220b7b2e0a026',);

    my $res = $ua->mirror( $url->as_string => $file );
    if($res->is_error) {
        $context->log( error => $res->status );
        return;
    }

    open my $fh, "<:encoding(utf-8)", $file
        or return $context->log(error => "$file: $!");

    my $duration;
    while (<$fh>) {
        if(m!(.*?)!){
            $duration = $1;
            $context->log(info => "duration: $duration");
            last;
        }
    }
    return $duration;
}

yamlはこんな感じ。
plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://ws.audioscrobbler.com/1.0/user/yoozoosato/recenttracks.rss

  - module: Filter::Rule
    rule:
      module: Fresh
      mtime:
        path: ./lastfm.tmp
        autoupdate: 1

  - module: Filter::TrackEndTimeFromTitle
    config:
      api_key: YOUR_API_KEY

しょこたんTVと同じようにGoogle Calendarに放るとこんな感じで自分がiTunesで再生した曲が可視化できる。

20081112.png

明日くらいからもうちょっと突っ込んだことに挑戦する予定。
2008年02月20日

しょこたんが出るTV番組の情報をGoogle Calendarに入れておくことで見逃さないようにするテスト【その2】

前回作った時は結構簡単に実装できたもんだから「すぐ行ける!」と思いつつハマった。

関連エントリ:しょこたんが出るTV番組の情報をGoogle Calendarに入れておくことで見逃さないようにするテスト

その時はRule::Deduptedの存在を知らなかったので、dc:timeが「放送開始時刻」じゃぁFreshが使えなくて意味ないな、という結論だった。
で、最近になってGoogle Code Hosting SVN -> TwitterというPlaggerレシピを書く過程で発見したRule::Dedupedって便利じゃん!ってのに今さら気づき、早速使ってみたという訳。

Freshの代わりにDBで管理するDedupedを使えば、ちゃんと

Plagger::Plugin::Filter::Rule [debug] Deleting ????????? - livedoor ??? since it has 0 entries

と表示してくれたよ!!よかった!!!


ということでカレンダー自体を公開設定にしたので、googleのアカウントをお持ちでしたら誰でもこのカレンダーを自分のgoogle calendarにインポートできます。


↓このblogで表示用に少し小さくしてます。まぁ我慢して下さい。

» 続きを読む

Plaggerでgoogle code hosting SVN -> twitterするレシピを修正

先週くらいに、RBCで用意してもらったgoogle codeプロジェクトホスティングからSVNコミットログを抜き出し、twitterに投げるというのを作った。(see also this entry.)

「Twitterと連動させたよ!」ってMLにポストしたらメンバーからの評判も概ね良かったんですが、自分的にはtwittされる順番がおかしいってのだけがどうしても気に喰わなかった。

CustomFeed::SVNLogでreverse指定して引っ張ってくるだけだと、最新のコミットログがtwitterの一番上に表示されなかったんだよね。


Plagger自体をdream hostで動かしてるからそもそもサーバーのload averageも異常に高い時があるし、google codeにもその都度アクセスするからcronの頻度をあんまり縮める訳にもいかず、さてどうしたものかと思っていたらPlaggerのEntryを逆順にするFilterを見つけた。

参考:(フィルタ本体)[sbm] del.icio.us to hatebu - nirvashの日記
参考:(利用例)cohtan blog: Bloggerの投稿をTwitterやJaikuで通知するPlaggerレシピ
参考:(利用例):嶋の徒然なる日々 with podcast : ●不満点が出てきた[Plaggerを使ってLivedoor BlogからMixiへ自動投稿を行う]


Filter::Reverseはここのページにあるのをそのままコピペで使った。

package Plagger::Plugin::Filter::Reverse;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.feed.fixup' => ¥&feed
    );
}

sub feed {
    my($self, $context, $args) = @_;

    $context->log(debug => "reverse");
    my @entries = $args->{feed}->entries;
    @entries = reverse(@entries);
    $args->{feed}->{entries} = ¥@entries;
}

1;

OK、ちゃんとやりたかったことが実現できていることが確認できた。

20080220.png
» 続きを読む
2008年02月15日

DreamhostにSVN::Coreを入れ、PlaggerでGoogle CodeのSVNコミットログをtwitterに流す

PlaggerにはCustomFeed::SVNLogというモジュールが付属しているので、ありがたく使わせてもらおうと思ったら、perlモジュールのSVN::Coreが足りない、とエラーになった・・・。

% plagger -c ./svn2twitter.yaml
Can't locate SVN/Core.pm in @INC

なのでCPANからSVN::Coreをインストールしようと思ったが、SVN::CoreはCPANには登録されていないそうなので、インストールは少々やっかい
(参考:ぶらぶら日記: SVN::Core をインストールする

さらに僕がPlaggerを動かしているのはDreamhostだったりするので、SVN::Core dreamhostでぐぐったInstalling SVK on Dreamhost - Dev411: The Code Wikiというドキュメントも発見!(英文です)

参考にさせてもらいながら早速作業をしたので、メモ。


まずは大前提として、DreamhostでちゃんとCPANが使えるようになっていること。これはPlaggerを入れた時点でクリアしているはずなんだけど、今一度コチラのページを確認しておくと良いです。
特にPERL5LIBを正しく設定してexportされていること、また$HOME/local/share/perl/ディレクトリが存在していて、ちゃんとPERL5LIBに含まれていることが超重要です。


以下、SVN::Coreを入れるための方法。

(1-1) swigの取得、configure
Dreamhostにはデフォルトで/usr/bin/swigにswigが入っているが、最初っからインストールされている/usr/bin/perlを使うように設定されているっぽい。DreamhostにPlaggerをインストールする時点で$HOME/local/bin/perlに5.8.8を入れているので、そちらを見てくれるようにswigも新規に$HOME/local/にインストールする。

一応、元々入っているswigとバージョンを合わせる為に1.3.24にしてみた。
(最新版は1.3.33)

% wget http://downloads.sourceforge.net/swig/swig-1.3.24.tar.gz
% tar zxf ./swig-1.3.24.tar.gz
% cd ./SWIG-1.3.24
% ./configure --prefix=$HOME/local \
--with-perl5=$HOME/local/bin/perl


(1-2) configure したらインストール
make && make install でオK
ここは特に問題ないはず。$HOME/local/bin/swigができる。

» 続きを読む
2008年02月11日

Yahoo! weather

U.S.のYahoo!天気予報の情報をRSSで配信してくれている。
例えば僕が住んでいる船橋市の天気だとこんな感じ。

http://xml.weather.yahoo.com/forecastrss?p=JAXX0011&u=c

日本のYahoo!でも天気情報をRSS配信はしてくれてるんだけど、
http://rss.weather.yahoo.co.jp/rss/days/4510.xml
こっちは週間予報がメインで、1日分の情報(現在の天気情報)に関してはU.S.のY!の方が圧倒的に情報量が多い。風速とか、その日の日の出・日没時刻まで判るしね。
日本国内を一括取得、ってのはさすがに無理で、エリアコードを毎回渡さないといけないのが難点だけど。(上の例で言うとJAXX0011ってのが船橋のエリアコード)

このあたりの天気情報をPlagger + cronで毎朝取得して、雨が降りそうだったら自分の携帯にHTMLメール形式でそのまま送れないかなぁ、と。

U.S.のY!から返ってくるRSSにはxmlnsでyweatherとgeo(geocode)というネームスペースが拡張されている。

↓クリックで拡大

» 続きを読む
2008年01月23日

しょこたんが出るTV番組の情報をGoogle Calendarに入れておくことで見逃さないようにするテスト

タイトルのまんま。
前回、しょこたん☆ぶろぐの更新情報をGoogle Calendarに入れるってのができたので、今回はTV番組情報をLivedoor番組表から取得して、Google Calendar APIで更新かけてみる。

アイディアソースは [Plagger] テレビ番組表を Plagger で #2 - Bulknews::Subtech - subtech

結論から言うと、コアの部分はサクッとできた。

けど、今のやりかたじゃぁ色んな所が決定的にダメ。あー、ダメなんじゃなくて、需要を満たせてない、が正しいか。
いずれにしても対応するのには今の僕の知識と技術では結構時間がかかりそう。
すぐできると思ったんだけどなぁ。。。誰かいいアイディア・方法を教えてplease...(突っ込みコメント、TB歓迎!!)

ということで、ここまでのやり方と対応詳細は以下の通り。
» 続きを読む

しょこたん語 → 日本語フィルタ

コメントで「翻訳して」と言われたので、モジュール書いた。
ファイルをダウンロード


言うまでもなく100%ネタなので、動作確認とか一切してません。ご利用は自己責任で。

オリジナルは↓これ。
http://plagger.org/trac/browser/trunk/plagger/lib/Plagger/Plugin/Filter/Kansai.pm

Plagger::Plugin::Publish::GoogleCalendarで動いた

自作しちゃったプラグインでしょこたん☆ぶろぐGoogle CalendarにPOSTするテストですが、PlaggerSubversionリポジトリにあがってるGoogleCalendar.pmモジュールでも動く、ってのを確認しました。

一応yamlだけ貼っておきます。
ファイルをダウンロード

自作プラグインで動作していたものを、リポジトリ上のものに置き換えたので以下を直そうかと。
・予定のタイトルにいちいちfeed titleが入るのは邪魔じゃ → 消す
・終了時刻をなんとかして渡せるようにする
この修正したら、Livedoor番組表からの情報をGoogle Calendarに差し込んでみたい。

さて、寝るか。

2008年01月21日

しょこたんをもの凄い勢いで追いかけてみるテスト

しょこたん☆ぶろぐの更新頻度はすごいなぁ。
テレビにも(ほぼ)毎日出てるし、漫画書いたりCD出したりととても忙しいはずなのに、いったいいつ更新してるんだろう。そもそも、ちゃんと寝てるんだろうか?

というのが気になったので、一個一個のエントリーの更新時刻を拾い読みしてったんだけど、エントリーが多すぎて何が何だかわかんね(w
だからシステム的にしょこたん☆ぶろぐの更新時間を「可視化」してみた。

これで「いつ更新」が一目で把握できるかなぁ、と。

例えばこれは1/18(金)の午前0:00から15:00くらいまで。

0:28から01:49までが更新祭り、終わったかと思ったら03:41まで更新が続いて、その後10:00amくらいまでは普通に寝てそうな感じ。んでもって11:00くらいから活動再開。人並みの睡眠時間は確保できてそう。

» 続きを読む