O-Lab +Ossan Laboratory+

Ossanの研究所です。

Praggerで重複チェック

にたまごほうれん草 - フィードの重複を取り除くプラグインFilter::deduped.rb
http://d.hatena.ne.jp/emergent/20070506/1178439299


cronで定期的にフィードを取得して(例えばはてダなどに)投稿する場合、
フィードの重複を取り除きたい場合があるかもしれません。

ローカルで実行するときに使わせていただいてたんだけど、
ファイル出力が私は必要なかったので
ファイル出力なし&rssの要素名を指定できるのをパクって作ったw


勝手にパクってすみません m(_)m

## Filter::chk_duplicate 
## 
## ** What's this **
##    Plugin to Checking for duplicate entries
## 
## ** example **
##
## - module: Filter::chk_duplicate
##   config:
##     item:
##       - title
##       - link
##       - description
##
##      etc...
##
## ** default **
##
##   config:
##     item:
##       - link
##
require 'digest/md5'

def chk_data(item, data)
  
  cache_hash = Hash::new
  
  result_data = data.select {|d|
    d_str = d.__send__(item).to_s rescue d.to_s
    
    if cache_hash.key?(Digest::MD5.hexdigest(d_str))
      false
    else 
      cache_hash[Digest::MD5.hexdigest(d_str)] = d rescue false
    end
  }
  
  return result_data
end


def chk_duplicate(config, data)
  
  if(config == nil || config['item'] == nil)
    item_name = 'link'  # default
  else
    item_name = config['item']
  end
  
  item_name.each {|i|
    data = chk_data(i, data)
  }
  
  return data
end


config.yamlには

 - module: Filter::chk_duplicate
   config:
     item:
       - title

ってな感じで重複チェックを行う要素名を指定。

 - module: Filter::chk_duplicate

上記のようにconfigなしだと、
<link>〜</link>要素だけを重複チェック

 - module: Filter::chk_duplicate
   config:
     item:
       - title
       - link
       - description

複数指定しても、一応、動いてる、はず。



でも、ファイル出力しない版なんて、
探せばすでにどこかにありそうな気もするな… orz