plaggerで重複を削除しつつまとめてみる

20080406追記

わざわざモジュールを書かなくても

http://yusukebe.com/archives/07/08/09/105502.html

にて、以下の設定で同じことができることがわかりました。otsuneさん、yusukebeさん、ありがとうございます。

  - module: Filter::Rule
    rule:
      - expression: $args->{entry}->{date} = undef; 1
      - module: Deduped

ここまで追記20080406

ここから元の文

Deduped/DB_File.pmは便利なんだけど、
なんかの都合で同じURLだが別の時間というのになると、新規のものとして
通過してしまうので、適当にでっちあげる。

DB_File_URL

package Plagger::Rule::Deduped::DB_File_URL;
use strict;
use base qw( Plagger::Rule::Deduped::Base );

use DB_File;

sub id_for {
    my($self, $entry) = @_;

    return $entry->permalink;
}

sub init {
    my($self, $rule) = @_;
    $self->{path} = $rule->{path} || Plagger->context->cache->path_to('Deduped.db');
    $self->{db} = tie my %cache, 'DB_File', $self->{path}, O_RDWR|O_CREAT, 0666, $DB_HASH
        or Plagger->context->error("Can't open DB_File $self->{path}: $!");
}

sub find_entry {
    my($self, $url) = @_;

    my $status = $self->{db}->get($url, my $value);
    return if $status == 1; # not found

    return $value;
}

sub create_entry {
    my($self, $url, $digest) = @_;
    $self->{db}->put($url, $digest);
}

1;

Plugin/Rule/Deduped/DB_File.pm
に次のようなのを追加して、パッケージ名をかえて、適当なファイルで保存しただけ

sub id_for {
    my($self, $entry) = @_;

    return $entry->permalink;
}

config.hoge.yaml

global:
  timezone: Asia/Tokyo
  log:
    level: debug
  cache:
    base: /tmp/cache


plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://del.icio.us/rss/tag/plagger

  - module: SmartFeed
    rule:
      module: Deduped
      engine: DB_File_URL
      path: /tmp/deduped_urlonly.db

  - module: Publish::Feed
    rule:
      expression: $args->{feed}->id eq 'smartfeed:Deduped'
    config:
      format: RSS
      dir: /tmp/feed
      filename: rss_%t.rss