Plagger で取得した記事のスクリーンショットを出力する
Plagger::Plugin::Publish::Screenshot。
CrenaHtml2jpg を使って、Plagger でスクリーンショットを出力してみる。
キャプチャには Win32::CaptureIE とかその辺のモジュール使えばPerlで完結するけど、試した中で一番安定してたのでCrenaHtml2jpgを使ってみた
もちろんWindows専用。
cmd_path に CrenaHtml2jpg のアーカイブを展開したパスを設定して、dirに出力先ディレクトリを設定すると、そこにスクリーンショットの画像が放り込まれる。
すさまじくいい加減なコードだが、やりたいことは出来たのでよしとしよう。
他のOSにも対応したちゃんとしたモジュールがほしいなぁ。自分で作れって話だな。
package Plagger::Plugin::Publish::Screenshot;
use strict;
use warnings;
use base qw(Plagger::Plugin);
use Cwd;
use Plagger::Util;
sub init {
my $self = shift;
$self->SUPER::init(@_);
Plagger->context->error("dir is missing") unless exists $self->conf->{dir};
Plagger->context->error("cmd_dir is missing") unless exists $self->conf->{cmd_dir};
}
sub register {
my ($self, $context) = @_;
$context->register_hook(
$self,
'publish.feed' => \&feed,
);
}
sub feed {
my ($self, $context, $args) = @_;
my $dir = $self->conf->{dir};
unless (-e $dir && -d _) {
mkdir $dir, 0755 or $context->error("mkdir $dir: $!");
}
my $path = $self->conf->{cmd_dir};
my $pwd = getcwd;
chdir $path;
my $format = $self->conf->{format} || 'jpeg';
my $filename = $self->conf->{filename} || '%l';
my $screen_size = $self->conf->{screen_size} || '1024x768';
my $size = $self->conf->{size} || '120x90';
my $other_opt = $self->conf->{other_opt} || '';
for my $entry ($args->{feed}->entries) {
my $file = Plagger::Util::filename_for($entry, $filename);
my $url = $entry->link;
my $cmd = qq(proccmd -w 30 -c "CrenaHtml2jpg.exe -o"$dir\\$file.$format" -f$format -w$screen_size -s$size $other_opt -u""$url""");
$self->log(debug => $cmd);
system($cmd);
}
chdir $pwd;
}
1;
__END__
=head1 NAME
Plagger::Plugin::Publish::Screenshot - Publish feeds as screenshot.
=head1 SYNOPSIS
- module: Publish::Screenshot
config:
dir: /path/to/destdir # required
cmd_dir: C:\Program Files\CrenaHtml2jpg # required
format: jpeg
filename: %l
screen_size: 1280x768
size: 120x90
other_opt: -q92 -d72 -t25 -l5
=head1 DESCRIPTION
This plugin creates screenshot image files.
=head1 AUTHOR
Jiro Nishiguchi
=head1 SEE ALSO
L<Plagger>, L<http://dip.picolix.jp/disp5.html>
=cut
