Cocoa::Growlで遊ぶ。

モジュールのアップデート書けてたら Growl::Anyがアップデートされてて
なんだろって思ったら、Cocoa::Growl対応となっていた。なんじゃそりゃ
って思った。調べていると最近できたモジュールらしいです。


詳しいことはhttp://perl-users.jp/articles/advent-calendar/2010/hacker/15にあります。


Mac::Growlだと文字コード周りでいろいろ使いづらいところがあったけど、
Cocoa::Growlだと普通の文字コード処理の流れで問題ないっぽい。
クリックした場合のコールバックも設定できるし、これからは Cocoa::Growl
使ってればいいんじゃないかと思いました。


で、遊びで書いてみたコードが以下のもの。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;

use Cocoa::Growl qw(:all);
use Web::Scraper;
use Encode;
use Time::HiRes;

use AnyEvent;
use AnyEvent::Impl::NSRunLoop;

my $cv = AnyEvent->condvar;

growl_register(
    app => 'Dmm Actress Ranking',
    notifications => [qw(actress_ranking)],
);

my $actress_ranking = scraper {
    process "td.bd-b", "rankings[]" => scraper {
        process 'span.rank', rank => 'TEXT',
        process 'a > img', name => '@alt', image => '@src';
        process 'div > a', href => '@href', title => 'TEXT';
    };
};

my @actresses;
my $base = 'http://www.dmm.co.jp/mono/dvd/-/ranking/=/term=monthly/mode=actress/rank=';
for my $page (qw/1_20 21_40 41_60 61_80 81_100/) {
    my $url = $base . $page . '/';
    my $res = $actress_ranking->scrape(URI->new($url));

    for my $rank (@{$res->{rankings}}) {
        push @actresses, $rank;
    }
}

my $w = AnyEvent->timer(
    after => 0, interval => 3,
    cb => sub {
        my $actress = shift @actresses;
        growl_notify(
            name        => 'actress_ranking',
            title       => encode_utf8($actress->{rank} . "位: " . $actress->{name}),
            icon => $actress->{image},
            description => encode_utf8($actress->{title}),
            on_click    => sub {
                `open $actress->{href}`;
            },
        );

        if (scalar @actresses == 0) {
            $cv->send;
        }
    }
);

$cv->recv;

DMM.co.jpのAV女優売り上げランキングから上位 100位の人を
取ってきてそれを Growlに通知。名前と顔写真と最新の作品を
表示するようにしています。クリックするとその商品の
ページに飛ぶようになってます。


cronで一時間に一回ぐらい回せば、どんな女優のどんな作品が
売れているというのがわかるのではないでしょうか。