発売日reminder

Daemon化してみた。本やCD、DVDごとにアトリビュートが違うから意外と手間がかかった。24時間sleepすればいいんだけど、MacBookで動かすので1時間sleepして1日1回だけチェックするようにしてみた。ちゃんと動くかな?

追記>AWSがtimeoutすることがあるようです。

$KCODE='u'

require 'rubygems'
require 'recs4'
gem 'twitter4r'
require 'twitter'
require 'date'
require 'webrick'

# Your Amazon Web Service access key
AWSKey = "xxxxxxxxxxxxxxxxxxxxxx"
# Your target list
TARGET = [
  {:artist => "Coldplay", :category => "Music"},
  {:artist => "スガシカオ", :category => "Music"},
  {:author => "伊坂幸太郎", :category => "Books"},
  {:author => "森博嗣", :category => "Books"},
  {:title => "サラリーマンNEO", :category => "DVD"}
  ]
# Twitter user/pass
USER = "xxxxxxxxxx"
PASSWORD = "xxxxxxxxxx"

class AmazonService

  OPTION = {
    "Books" => {:search_index => "Books", :sort => "daterank", :item_page => "1", :response_group => "Medium"},
    "Music" => {:search_index => "Music", :sort => "-releasedate", :item_page => "1", :response_group => "Medium"},
    "DVD" => {:search_index => "DVD", :sort => "-releasedate", :item_page => "1", :response_group => "Medium"}
  }
  OUTPUT = {
    "Books" => {:title => :title, :date => :publication_date, :author => :author},
    "Music" => {:title => :title, :date => :release_date, :author => :artist},
    "DVD" => {:title => :title, :date => :release_date, :author => :actor}
  }

  def initialize
    @opr = RECS4::Operation.new(AWSKey, :locale => "jp")
  end

  def retrieve
    ret = []
    TARGET.each do |t|
      op = t.reject{|k, v| k == :keyword or k == :category}
      op.merge!(OPTION[t[:category]])
      result = @opr.item_search(t[:keyword], op)
      
      next if result[:items][:item] == nil
      
      result[:items][:item].each do |i|
        item = {}
        ret << item
        OUTPUT[t[:category]].each do |key, value|
          if i[:item_attributes][value] != nil then
            item[key] = i[:item_attributes][value].text
          else
            item[key] = ""
          end
        end
      end
    end
    return screen(ret)
  end

  def screen(items)
    tmr = Date::today + 1
    items.delete_if {|i| i[:date] != tmr.to_s}
  end
  
end

class ReleasePoster
  def initialize
    @twit = Twitter::Client.new(:login => USER, :password => PASSWORD)
  end
  
  def post(items)
    items.each do |i|
      str = "明日発売: " + i[:title] + " / " + i[:author]
      @twit.status(:post, str)
    end
  end
end

WEBrick::Daemon.start {
  today = ""
  loop do
    unless today == Date::today then
      as = AmazonService.new
      items = as.retrieve
      if items != nil and items.size > 0 then
        tw = ReleasePoster.new
        tw.post(items)
        tw = nil
      end
      as = nil
      today = Date::today
    end
    sleep 60 * 60
  end
}