$KCODE='u' require 'rubygems' require 'recs4' require 'date' require 'pp' class Item attr_accessor :author attr_accessor :date attr_accessor :title attr_accessor :asin def initialize(amz_result, keyalias) ia = amz_result[:item_attributes] @title = gettext(ia[keyalias[:title]]) @author = gettext(ia[keyalias[:author]]) @date = parseDate(gettext(ia[keyalias[:date]])) @asin = gettext(amz_result[:asin]) end def gettext(var) if var == nil then "" else var.text end end def parseDate(str) if /\d+-\d+-\d+/ =~ str then d = Date.parse(str) Time.mktime(d.year, d.mon, d.day) elsif /\d+-\d+/ =~ str then d = Date.parse(str + "-01") Time.mktime(d.year, d.mon, d.day) else nil end end def to_s @title + " / " + @author + " / " + self.uri end def uri "http://www.amazon.co.jp/gp/product/" + @asin end end 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"} } ALIAS = { "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(key, target) @opr = RECS4::Operation.new(key, :locale => "jp") @target = target end def retrieve ret = [] @target.each do |t| nt = {} # convert hash key: String -> Symbol t.each_key do |key| nt[:"#{key}"] = t[key] end op = nt.reject{|k, v| k == :keyword or k == :category} op.merge!(OPTION[nt[:category]]) result = @opr.item_search(nt[:keyword], op) next if result[:items][:item] == nil result[:items][:item].each do |i| ret << Item.new(i, ALIAS[nt[:category]]) end end ret end def future_items items = self.retrieve today = Time.now items.delete_if {|i| i.date < today} end end