Filter::EntryIndex

ということで車輪の再発明(車輪にもなってないかもしれませんが)かもしれませんが重複エントリーをはじくことが出来るプラグインを作って見ました。


とりあえずのたたき台なので、かなり未テストです。取扱いには注意してください。

追記
6/6: 正しく動いていなかったのでコードを修正

config.yaml

 - module: Filter::EntryIndex
config:
interval: 259200 # optional def. 259200 3days
body_check: 1 # optional def. 0
expires: 2592000 # optional def. 259200 3days

上記の例だと同じID($entry->id_safe)を3日間、本文が同じでも30日間は無視する設定です。config:以下を指定しないデフォルトの設定では、3日間IDを確認するだけです。

package Plagger::Plugin::Filter::EntryIndex;
use strict;
use base qw( Plagger::Plugin );
use Tie::Storable;
use Digest::MD5 qw (md5_hex);
use Data::Dump qw (dump);

our $VERSION = '0.1';

sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'plugin.init' => \&initialize,
'update.entry.fixup' => \&filter,
);
}

sub initialize {
my ($self, $context, $args) = @_;
my $path = $self->{cache}->path_to;
unless (-d $path) {
mkdir($path, 0700)
or die $context->log(error=>'Could not Create tmpdir');
$context->log(info=>"Create new folder : $path");
}
my $index = $self->{cache}->path_to.'/'.($self->conf->{file} || 'index.cache');
tie $self->{obj} => 'Tie::Storable', $index
or die $context->log(error => $!);
}
sub filter {
my($self, $context, $args) = @_;

my $entry = $args->{entry};
my $date = time;
my $body = $entry->body;
utf8::encode($body);
$body = md5_hex($body);
# my $id = $entry->{parmlink} || 0;
my $id = $entry->id_safe;

my $interval = $self->conf->{interval} || 60*60*24*3;
my $same = $self->conf->{body_check} || 0;
my $expires = $self->conf->{expires} || $interval;

if (exists $self->{obj}->{$id}) {
my $obj = $self->{obj}->{$id};
if ($interval != 0 && $interval > time - $obj->{date}) {
$context->log(info => "Strip minor amendment " . $entry->link);
$args->{feed}->delete_entry($entry);
}
if ($same && $body eq $obj->{body}) {
$context->log(info => "Strip same entry " .$entry->link);
$args->{feed}->delete_entry($entry);
}
foreach (keys %{$self->{obj}}) {
my $key = $self->{obj}->{@_};
if ($expires !=0 && $expires < $key->{date} - time) {
delete $self->{obj}->{$_};
$context->log(debug => 'Expires $key');
}
}
}
$self->{obj}->{$id} = { date => $date, body => $body } unless $id == 0;
}

1;