先週からほったらかしのネタ。
File::Mork で history.dat を読んで CustomFeed にする、というものだが。title のデコードがわからん。
例えば "YouTube - スプー、襲来 [SPOO ATTACK]" というタイトル。
Y$00o$00u$00T$00u$00b$00e$00 $00-$00 $00$B90$D70$FC0$010r$89eg $00[$00S$00P$00O$00O$00 $00A$00T$00T$00A$00C$00K$00]$00
これが histroy.dat に入っている生の文字列。これを decode してるのが File::Mork の以下の部分。
# Approximate wchar_t -> ASCII and remove NULs
$val =~ s/\$00//g; # faster if we remove these first
$val =~ s/\$([\dA-F]{2})/chr(hex($1))/ge;最初の置換で $00 が取っ払われてこうなる。
YouTube - $B90$D70$FC0$010r$89eg [SPOO ATTACK]
ここまではいいんだが、次の置換で謎なことになる。ASCIIだけなら問題ないんだけど。
"$00$B90$D70$FC0$010r$89eg" が 「スプー、来襲」になる、んだけどどうすれば UTF-8 に持って行けるのか?
[追記] http://d.hatena.ne.jp/sfujiwara/20060605/1149488462 UTF-16-(LE|BE) なんだけど環境(マシンアーキテクチャ) 依存ぽい. orz.
ということで、頓挫。CustomFeed::Mork はせっかく書いたので、一応貼っておく。
package Plagger::Plugin::CustomFeed::Mork;
use strict;
use base qw( Plagger::Plugin );
use Plagger::Date;
use File::Mork;
sub register {
my ( $self, $context ) = @_;
$context->register_hook( $self, 'subscription.load' => \&load, );
}
sub load {
my ( $self, $context ) = @_;
my $feed = Plagger::Feed->new;
$feed->aggregator( sub { $self->aggregate(@_) } );
$context->subscription->add($feed);
}
sub aggregate {
my ( $self, $context, $args ) = @_;
my $file = $self->conf->{filename};
my $mork = File::Mork->new( $file )
or do {
$context->log( error => $File::Mork::ERROR );
return;
};
my $feed = Plagger::Feed->new;
$feed->title( $file );
$feed->link( sprintf 'file://%s', $file );
$feed->updated( Plagger::Date->from_epoch((stat($file))[9]) );
ENTRY:
foreach my $entry( $mork->entries ) {
foreach my $key( keys %{$self->conf->{cond}} ){
my $regexp = $self->conf->{cond}->{$key};
next ENTRY unless $entry->{$key} =~ /$regexp/;
}
my $p_entry = Plagger::Entry->new;
$p_entry->title( $entry->{Name} );
$p_entry->link ( URI->new( $entry->{URL} ) );
$p_entry->date ( Plagger::Date->from_epoch( $entry->{FirstVisitDate} ) );
$feed->add_entry( $p_entry );
}
$context->update->add($feed);
return 1;
}
1;
__END__
=head1 NAME
Plagger::Plugin::CustomFeed::Mork - Custom feed reading Mork file.
=head1 SYNOPSIS
- module: CustomFeed::Mork
config:
filename: /home/fujiwara/.mozilla/firefox/xxxxxxx/history.dat
cond:
URL: youtube\.com/watch\?v=
=head1 AUTHOR
FUJIWARA Shunichiro <fujiwara at topicmaker.com>
=head1 SEE ALSO
L<Plagger>
=cut