Amazon_shopver='$Id: amazon_shop.rb,v 1.21 2005/08/03 13:02:24 waka Exp waka $'.split(" ")[2]
# http://www.double-red.net/
=begin
日記中に
(@DVD:BCBA-0618)
(@CD:AMCY-7125)
みたいな
(@DVD:背表紙にある記号)
(@CD:背表紙にある記号)
という形式の文字列があると
amazon から書誌、DVD,CDの情報やら書影、ジャケット画像、商品画像やらを引っ張ってきて置き換えます。
www.amazon.co.jp が取り扱っている以下の商品に対応しています。
(基本的に ASIN で指定すれば確実です)
本 (@ASIN:ASIN) もしくは (@ISBN:ISBN)
洋書 (@ASIN:ASIN) もしくは (@ISBN:ISBN)
エレクトロニクス (@ASIN:ASIN)
ホーム&キッチン (@ASIN:ASIN)
ミュージック(CD) (@ASIN:ASIN) もしくは (@CD:背表紙にある記号)
DVD/ビデオ (@ASIN:ASIN) もしくは (@DVD:背表紙にある記号)
ソフトウェア (@ASIN:ASIN)
ゲーム (@ASIN:ASIN)
ゲームは ASIN の他に以下の書式が利用できます
・PlayStation (@PS:背表紙にある記号)
・PlayStation2 (@PS2:背表紙にある記号)
・GAMECUBE (@GC:背表紙にある記号)
・GAME BOY ADVANCE (@GBA:背表紙にある記号)
・Xbox (@XBOX:背表紙にある記号)
・PSP (@PSP:背表紙にある記号)
・Nintendo DS (@NDS:背表紙にある記号)
@@仕様-----------------------------------------------------------
ruby 1.8.x 以上推奨
※ ruby 1.6.x で利用する際には
※ yaml.rb(http://yaml4r.sourceforge.net/)をインストールしてください。
http://prdownloads.sourceforge.net/yaml4r/syck-0.42.tar.gz?download
が最新のようです(2004-01-27現在)
@@キャッシュディレクトリ設定------------------------------------
ndiary.conf の LOG_DIRECTORY で指定したディレクトリに
amazon_shop
というディレクトリを作っておくと取得したデータをキャッシュしておくようになります。
キャッシュの有効期限もスクリプト内で指定しているので必要に応じて変更してください。
※ amazondvd.rb を利用していた方へ。(必読)
amazondvd.rb 上位互換です。
設定も同一です。特に変更するような追加設定項目は今のところありません。
amazondvd.rb のキャッシュがそのまま利用可能です。
amzcacheDVD の中身を amazon_shop へコピーすれば利用可能です。
書式も同一です。過去の日記を書き直す必要はありません。
※ただし、amazon_shop.rb のキャッシュは amazondvd.rb では利用できません。
@@キャッシュ保持期間--------------------------------------------
キャッシュの有効期限を指定できます。
ndiary.conf にて
変数 AMAZON_CACHE_EXPIRE に日数(正の整数)を指定してください。
(0は無期限)
(例)
AMAZON_CACHE_EXPIRE = '30'
@@プロキシ設定--------------------------------------------------
ndiary.conf で
PROXY = 'proxy.hoge.com:8080'
と指定しておくと、情報取得時プロクシを経由するようになります。
@@その他の設定--------------------------------------------------
ndiary.conf にて以下の変数が使用できます(必須ではない)
* BOOKSTORE_AMAZON_ID(Amazonアソシエイトに参加している場合に有効)
(例)
BOOKSTORE_AMAZON_ID = 'hogehoge-foo'
* NO_IMAGE_FILE
・ジャケット画像がない場合に代替に表示する画像(imgタグで表記)
(例)
NO_IMAGE_FILE='
'
* AMAZON_WITH_AP
あれこれポップアップ(http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/ArekorePopup.html)
の ap:banner を使用したリンク表記を使う(true)か
(例)
AMAZON_WITH_AP = true
*AMAZON_NOIMAGE_RETRY_SPAN
画像取得リトライ期間。
設定すると、前回日記生成時に画像がなかった商品について以下の動作をする。
日記生成時から AMAZON_NOIMAGE_RETRY_SPAN 日以上経過、
もしくは前回画像取得リトライから AMAZON_NOIMAGE_RETRY_SPAN 日以上経過していれば、
画像情報のみ取得し、キャッシュを更新する(キャッシュファイル生成日時は前回の状態を保持)。
設定しない場合、もしくは値が '0' の場合は無画像リトライは実行しない。
@@テンプレートにより表示をカスタマイズする-----------------------
ndiary.conf に以下を設定
AMAZON_SHOP_TEMPLATE= true
キャッシュディレクトリ(amazon_shop)以下に"template" という名前の
テンプレートファイルを用意
テンプレートファイルの例ここから
?.amazon.com/images/P/[^.]+.[0-9][0-9].[^T][^H][^U][^M][^B]Z+.jpg))
(?:.*
)+"s =~ review_scope.to_s.gsub(/\n/,'') then
@writer =$1
@desc = $2
end
end
if @writer.to_s.empty? and @desc.to_s.empty? then
if %r"(作品内容|内容(「.+?」データベースより))
\n(.*?)"mis =~ review_scope then
@writer =$1
@desc = $2
end
end
if @writer.to_s.empty? and @desc.to_s.empty? then
if %r|(製品概要)[::](.*?)|mi =~ review_scope then
@writer = $1
@desc = $2
end
end
#--------------------------------------------------
# Published Date
#--------------------------------------------------
#(2002/05/24)
:DVD,CD
#発売日:2002/03/28
:PS2
if %r"(?:発売日[::]|\()([\d\/]+[\d])\)?
" =~ response then
@pubdate = $1
elsif %r|\((\d{4}\/[\d\/]+)\)| =~ response then
@pubdate = $1
end
#--------------------------------------------------
# Size(ディスク枚数)
#--------------------------------------------------
if %r!(?:)?ディスク枚数:(?:)?(.+)
! =~ response then
@size = $1.gsub(/[^\d]/,"")
elsif %r!サイズ\(cm\): ([^<]*)$! =~ response then
@size = $1
end
if @title.nil? then
read_cache
else
save_cache
@flag = true
end
end
end
class Filter
def add_title(str)
href_added_title = Array.new
str.split(",").each{|each_column|
if /href/ =~ each_column then
#a = each_column
unless %r!http://www.amazon.co.jp! =~ each_column then
each_column = each_column.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")
end
column_str = each_column.scan(/>(.+?))[0].to_s
#c = "#{each_column.scan(/(
1 || imageM_h.to_i > 1) then
if /_P._SC/ =~ imageM then
imageM = imageM.gsub(/_P._SC/,"").gsub(/_\.jpg/,".jpg")
end
valiation = ""
base_extention_w = 0
base_extention_h = 0
rotate_angle = 90
if ! @diary.config['AMAZON_IMAGE_VARIATION'].to_s.empty?
valiation = @diary.config['AMAZON_IMAGE_VARIATION']
valiation.split("_").each{|param|
total_w = 0
total_h = 0
#_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_PU90_PF_SCMZZZZZZZ_.jpg
case param
when /^PA/ #ドロップシャドウ
param.gsub!(/^PA/,"")
arg1 = param.split(",")[0].to_i.abs # 余白ピクセルサイズ
arg2 = param.split(",")[1].to_i.abs # x 方向影ピクセルサイズ
arg3 = param.split(",")[2].to_i.abs # y 方向影ピクセルサイズ
arg4 = param.split(",")[3].to_i.abs # シャープさ加減
total_w = arg1 + arg2
total_h = arg1 + arg3
when /^PU/ # 左回転
param.gsub!(/^PU/,"")
arg1 = param.to_i
arg1 = 5 if arg1 == 0 # blank:5
rotate_angle += arg1
when /^PV/ # 右回転
param.gsub!(/^PV/,"")
arg1 = param.to_i
arg1 = 5 if arg1 == 0 # blank:5
rotate_angle -= arg1
end
base_extention_w += total_w
base_extention_h += total_h
}
end
imageS = imageM.gsub(/MZZZZZZZ.jpg/,"_AA50_SCMZZZZZZZ_.jpg")
imageL = imageM.gsub(/MZZZZZZZ.jpg/,"_SCLZZZZZZZ_.jpg") # M x 3.4
imageM = imageM.gsub(/MZZZZZZZ.jpg/,"#{valiation}_SCMZZZZZZZ_.jpg")
imageL_title = "拡大イメージ(#{(imageM_w.to_f*3.4).to_i}x#{(imageM_h.to_f*3.4).to_i})"
# イメージバリエーション後のサイズ計算
imageM_w += base_extention_w
imageM_h += base_extention_h
pi = 3.14159265358979
rad = pi*(rotate_angle.to_f)/180.to_f
xdir = Math.cos(rad).abs * imageM_h + Math.sin(rad).abs * imageM_w
ydir = Math.sin(rad).abs * imageM_h + Math.cos(rad).abs * imageM_w
imageM_w = xdir
imageM_h = ydir
if @diary.config['AMAZON_WITH_AP'] then
ap_banner = " ap:banner=\"#{imageS}\""
end
img = "(.*)<\/a>/)[0]}\" class=\"amazonimg\"#{tagend}"
end
if %r!/,"").gsub(/">/,"\"#{ap_banner}>")
img = img.gsub(/(\ +)?<\/title>/,"")
# maker = メーカー
maker = add_title(amzshop.maker) unless amzshop.maker.to_s.empty?
# company = 販売元
company = amzshop.company unless amzshop.company.to_s.empty?
# actor = 出演者
actor = add_title(amzshop.actor) unless amzshop.actor.to_s.empty?
# director = 監督
director = add_title(amzshop.director) unless amzshop.director.to_s.empty?
# pubdate = 発売日
pubdate = amzshop.pubdate unless amzshop.pubdate.to_s.empty?
# price = 価格
price = amzshop.price.gsub(/¥/,'\\') unless amzshop.price.to_s.empty?
# size = 枚数 (CD,DVD)
size = amzshop.size.gsub(/ /,'') unless amzshop.size.to_s.empty?
# time = 再生時間 (CD,DVD)
time = amzshop.time unless amzshop.time.to_s.empty?
# desc = 内容記述
desc = amzshop.desc.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec") unless amzshop.desc.to_s.empty?
# writer = desc のライター(「DVD NAVIGATOR」データベースより ...など)
writer = amzshop.writer unless amzshop.writer.to_s.empty?
# site = obsolete (google とかだった)
site =amzshop.site unless amzshop.site.to_s.empty?
# voice = 音声(英語/日本語 ...など)
voice = amzshop.voice unless amzshop.voice.to_s.empty?
# voice_spec = 音声仕様 (Dolby Digital 5.1/Dolby Digital 5.1 ...など)
voice_spec = amzshop.voice_spec unless amzshop.voice_spec.to_s.empty?
# caption = 字幕 (日本語/英語/日本語吹き替え用字幕 ...など)
caption = amzshop.caption unless amzshop.caption.to_s.empty?
# stand_in = 吹き替え
stand_in = amzshop.stand_in unless amzshop.stand_in.to_s.empty?
# screen_size = 画面サイズ (シネマスコープ ...など)
screen_size = amzshop.screen_size unless amzshop.screen_size.to_s.empty?
# electro_spec = エレクトロニクススペック
electro_spec = amzshop.electro_spec unless amzshop.electro_spec.to_s.empty?
# edition = エディション
edition = amzshop.edition unless amzshop.edition.to_s.empty?
if desc.size > 100 then
desc.gsub!(/(.{100}.+?)
.*/mi){
$1 + %Q!(...)!
}
end
info_hash = {
"商品タイトル" => title,
"出演者/著者" => actor,
"メーカー" => maker,
"販売元" => company,
"枚数/サイズ" => size,
"発売日" => pubdate,
"価格" => price,
"解説" => desc,
"解説者" => writer,
"画像" => img,
"小画像" => imgS,
"メディア" => media,
"監督" => director,
"再生時間" => time,
"音声" => voice,
"音声仕様" => voice_spec,
"字幕" => caption,
"吹替え" => stand_in,
"スクリーンサイズ" => screen_size,
"スペック" => electro_spec,
"キー" => key,
"エディション" => edition,
"コード" => code_id
}
if /本|洋書/ =~ media then
makerStr = "出版社"
actorStr = "著者"
sizeStr = "サイズ"
sizeUnit = " cm"
else
if /CD/ =~ media then
makerStr = "アーティスト"
else
makerStr = "メーカー"
end
actorStr = "出演者"
sizeStr = "枚数"
sizeUnit = " 枚"
end
body = Array.new
if ! template.empty? then
template.tosjis.each{|line|
unless /^#/ =~ line then
line.gsub!(/(\[.+?\])/){
eval_str = $1
hash_key, before, after = eval eval_str
hash_item = info_hash[hash_key]
before + hash_item + after unless hash_item.to_s.empty?
}
line.gsub!(/<-makerStr>/,makerStr)
line.gsub!(/<-actorStr>/,actorStr)
line.gsub!(/<-sizeStr>/,sizeStr)
line.gsub!(/<-sizeUnit>/,sizeUnit)
line.chop!
body << line unless line.empty?
end
}
else
media = "#{edition}" unless edition.to_s.empty?
body << "
| " body << "\t\t\t#{img}" body << "\t\t | " body << "\t\t"
body << "\t\t\t『#{title}』"
body << "\t\t\t#{media}#{@diary.tag_br}"
body << "\t\t\t#{maker}#{@diary.tag_br}" unless maker.empty?
body << "\t\t\t#{company}#{@diary.tag_br}" unless company.to_s.empty?
body << "\t\t\t#{actorStr}:#{actor}#{@diary.tag_br}" unless actor.empty?
body << "\t\t\t監督:#{director}#{@diary.tag_br}" unless director.empty?
date_price_size_time = Array.new
date_price_size_time << "発売日:" + pubdate unless pubdate.to_s.empty?
date_price_size_time << "価格:" + price unless price.to_s.empty?
date_price_size_time << sizeStr + ":" + size + sizeUnit unless size.to_s.empty?
date_price_size_time << "時間:" + time unless time.to_s.empty?
dpst = date_price_size_time.join(", ")
body << "\t\t\t#{dpst}#{@diary.tag_br}#{@diary.tag_br}" unless dpst.empty?
body << "\t\t\t音声:#{voice}#{@diary.tag_br}" unless voice.empty?
body << "\t\t\t音声仕様:#{voice_spec}#{@diary.tag_br}" unless voice_spec.empty?
body << "\t\t\t字幕:#{caption}#{@diary.tag_br}" unless caption.empty?
body << "\t\t\t吹き替え:#{stand_in}#{@diary.tag_br}" unless stand_in.empty?
body << "\t\t\t画面サイズ:#{screen_size}#{@diary.tag_br}" unless screen_size.empty?
body << "\t\t\t
| "
body << "\t
" if template.empty? body << "" end body.join("\r\r").to_s.gsub(/&field/,"%26field").gsub(/^ +\n/m,"") } when :HTML str.gsub!("\r\r","\n") str.gsub!(/
\s*<\/p>/mi, '') end rescue puts "#{$!}" end end end =begin Local Variables: mode: ruby coding: japanese-shift-jis-dos End: =end