Plagger::Plugin::Notify::Browser

Plagger::Plugin::Notify::Browser
試してみたらIEが起動しました。
たぶんSleipnirを「標準のブラウザ」に設定すればいいのだろうけど、
ちょっとそれは嫌だったのでやってみた。

- module: Notify::OpenBrowser
  config:
    browser_path: C:\Program Files\Fenrir & Co\Sleipnir\bin\Sleipnir.exe
package Plagger::Plugin::Notify::OpenBrowser::mswin32;
use base qw( Plagger::Plugin::Notify::OpenBrowser );

use strict;

sub open {
    my ($self, $link) = @_;

    if (my $path = $self->conf->{browser_path}) {
        system qq("$path" $link);
        return;
    }
    system 'start', $link;
}

1;

一応動いた。
これでいいのかはワカンネ。


FirefoxLunaScapeインスコしてやってみたらタブじゃなくて新しいウインドウで開いちゃったよ!

Drk7jp.yaml of EFT

Bloglinesに登録してるblogのひとつに、Drk7.jpさんがあるのですが、
PlaggerでBloglines2Gmailするときに本文を全部取得できていなかったので作ってみました。

author: tayaya
handle: http://www\.drk7\.jp/MT/
extract: <div class="blogbody">(.*?)<!-- Google AdSense
extract_capture: body

EntryFullTextのconfigでforce_upgradeしないと使えないです。

  - module: Filter::EntryFullText
    config:
      force_upgrade: 1

[perl][Plagger]Plaggerソースコード読む(2)

bootstrapメソッド(Plagger.pm)の中身。

sub bootstrap {
    my $class = shift;
    my $self = $class->new(@_);
    $self->run();
    $self;
}

newしてrunしてるだけ。
newに渡してる引数はハッシュで、YAMLのファイル名が入ってるというのは前回書いた。


じゃあまずコンストラクタnewから。
定義されてるデータ構造はこんな感じ。

    my $self = bless {
        conf  => {},
        update => Plagger::Update->new,
        subscription => Plagger::Subscription->new,
        plugins_path => {},
        plugins => [],
        rewrite_tasks => []
    }, $class;

次に、

    my $loader = Plagger::ConfigLoader->new;
    my $config = $loader->load($opt{config}, $self);

ここでYAMLファイルを読み込んでハッシュリファレンスに変換。


下のようなYAMLの場合、

global:
  timezone: Asia/Tokyo
  assets_path: C:\Perl\site\lib\Plagger\assets

plugins:
  - module: Subscription::Config
    config:
      feed: 
        - url: http://d.hatena.ne.jp/tayaya/rss

  - module: Filter::EntryFullText

  - module: Publish::Gmail
    config:
      mailto: xxxxx@gmail.com
      mailroute:
        via: smtp_tls
        host: smtp.gmail.com:587
        username: xxxxx@gmail.com
        password: base64::xxxxx=

$configをDumpするとこのようになる。

'plugins' => [
               {
                 'config' => {
                               'feed' => [
                                           {
                                             'url' => 'http://d.hatena.ne.jp/tayaya/rss'
                                           }
                                         ]
                             },
                 'module' => 'Subscription::Config'
               },
               {
                 'module' => 'Filter::EntryFullText'
               },
               {
                 'config' => {
                               'mailto' => xxxxx@gmail.com',
                               'mailroute' => {
                                                'password' => 'base64::xxxxx=',
                                                'via' => 'smtp_tls',
                                                'username' => xxxxx@gmail.com',
                                                'host' => 'smtp.gmail.com:587'
                                              }
                             },
                 'module' => 'Publish::Gmail'
               }
             ],
'global' => {
              'timezone' => 'Asia/Tokyo',
              'assets_path' => 'C:\\Perl\\site\\lib\\Plagger\\assets'
            }

各Pluginの設定とGlobalの設定が入ってるのがわかる。

[perl][Plagger]Plaggerソースコード読む

とりあえずメモ書き。
以下はWindows環境での話です。


コマンドプロンプトからPlaggerって打つと、
C:\Perl\bin\Plagger(拡張子がついてない、「Plagger」ってファイル)が実行される。
その中で、Plagger.pmのbootstrapメソッドを呼んでます。

Plagger->bootstrap(config => $config);

$configには指定したconfig.yamlのファイル名が入ってる。
例えば、

C:\>Plagger -c bloglines2Gmail.yaml

ってやると、
$configには「bloglines2Gmail.yaml」という文字列が入る。


つづく

[perl]Data::Dumper

これ、いいですね。
use Data::Dumper;
print dumper $var;って書くのまんどくせだったので助かります。

enclosure内のファイル名が同じだと上書きされる件

プレイヤーズ王国のpodcastをSunscription::Configでとってきて
Filter::FetchEnclosureしてたんですが、
ローカルのフォルダを見るとdownload.mp3が1個あるだけでした。
本当なら5個のmp3ファイルが生成されるはず。


YAMLは以下のとおり。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://players.music-eclub.com/players_podcasting/pickup.xml

  - module: Filter::FetchEnclosure
    config:
      dir: C:\players


調べてみるとどうやらFilter::FetchEnclosure内で呼び出してる、
Plagger::UserAgentのmirrorメソッドが原因ぽい。


Plagger::UserAgentの91行目らへん。

if (-e $file) {
# Some dosish systems fail to rename if the target exists
    chmod 0777, $file;
    unlink $file;
}
rename($tmpfile, $file) or
    die "Cannot rename '$tmpfile' to '$file': $!\n";

どうやら取得したファイルと同じ名前のファイルが存在すると、
既存のファイルは削除されてしまうようです。
プレイヤーズ王国podcastはファイル名が全部download.mp3なので、
5つのmp3ファイルのうち最後のやつだけが残ってたということみたいですね。




とりあえず応急処置。

if (-e $file) {
    # Some dosish systems fail to rename if the target exists
    #chmod 0777, $file;
    #unlink $file;
    $file .= '_' . time;
    rename($tmpfile, $file) or
        die "Cannot rename '$tmpfile' to '$file': $!\n";
}
else {
    rename($tmpfile, $file) or
        die "Cannot rename '$tmpfile' to '$file': $!\n";
}


うまくいきました。




ところでdosishてどういう意味だろう?

Publish::Gmailの$argsをDumperしてみた。

Publish::Gmailの実行フェーズであるpublish.feedフェーズで渡される$args。
その中身はPlagger::Feedオブジェクトみたい。


※追記:下記はSubscription::Configでfeedにhttp://d.hatena.ne.jp/tayaya/rssを指定した時のものです。


ちょっと見にくいけどこんな感じ。

'feed' => { bless ( {
    'source_xml'  => 'XMLソース',
    'link'        => 'http://d.hatena.ne.jp/tayaya/',
    'language'    => undef,
    'entries'     => [Plagger::Entryオブジェクト], 
    'author'      => 'tayaya',
    'description' => 'qw/Perる 日誌/',
    'tags'        => [],
    'meta'        => {},
    'url'         => 'http://d.hatena.ne.jp/tayaya/rss',
    'updated'     => DateTimeオブジェクト,
    'type'        => 'feed',
    'title'       => 'qw/Perる 日誌/'
    }, 'Plagger::Feed' )
}

entriesの中身。Plagger::Entryオブジェクトを要素にもつ無名配列。

'entries' => [ bless( {
    'link'       => 'http://d.hatena.ne.jp/tayaya/20061002/1159796655',
    'widgets'    => [],
    'feed_link'  => 'http://d.hatena.ne.jp/tayaya/',
    'date'       => Plagger::Dateオブジェクト
    'author'     => 'tayaya',
    'meta'       => {},
    'tags'       => [
                     'perl'
                    ],
    'body'       => 'HTMLソース',
    'rate'       => 0,
    'enclosures' => [],
    'id'         => 'http://d.hatena.ne.jp/tayaya/20061002/1159796655',
    'title'      => '[perl]Publish::Gmailの$argsをDumperしてみた。'
    }, 'Plagger::Entry' ),
]


これらを踏まえてPublish::Gmailのソースを読むとなんとなく流れが見えてきます。


Feedオブジェクトをtemplatizeメソッドに突っ込んでメールの本文を生成。

my $feed = $args->{feed};
・
・
・
my $body = $self->templatize('gmail_notify.tt', { feed => $feed });

テンプレートのgmail_notify.ttはこんなんになってて、

[% FOREACH entry = feed.entries -%]
<div>
<div>
・
・
[% IF entry.body.match('(?i)^<p[ >]') %][% entry.body %]
[% ELSE %]<div style="padding: 1em 0">[% entry.body %]</div>[% END %]
・
・
[%- END %]

entriesの数だけループさせて、Entryオブジェクトの中のbodyやらtitleやらを書き出してる。
そして生成されたHTML($body)をMIME::Liteモジュール使って送信っと。


なるほど。