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;
一応動いた。
これでいいのかはワカンネ。
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をもっと深く知りたいし、javascriptも興味あるし、HTMLやCSSも詳しくなりたい。
もっともっとコード書いて読んで、いろんな本を読んで、
ネット上のいろんなサービスに触れて刺激を受けたい。
1日が24時間てのは短すぎると感じてきた今日この頃。
はてなブックマークカウンター
はてなブックマークカウンターつけてみた。
APIも公開だそうな。
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モジュール使って送信っと。
なるほど。