# $Id: amazondvd.rb,v 2.5 2003-04-03 00:43:16+09 waka Exp waka $
# http://wakahiko.cool.ne.jp/
=begin
(@DVD:BCBA-0618) (@CD:AMCY-7125) みたいな
(@DVD:背表紙にある記号) (@CD:背表紙にある記号)
という形式の文字列があると
amazon からDVD,CDの情報やらジャケット画像やらを引っ張ってきて置き換えます。
他にも以下のハード・ソフトに対応しています。
・対応ハード・ソフト 書式
・PlayStation (@PS:背表紙にある記号)
・PlayStation2 (@PS2:背表紙にある記号)
・GAMECUBE (@GC:背表紙にある記号)
・Xbox (@XBOX:背表紙にある記号)
上記の方法で取得できない場合もままあります。
その時はあらかじめAmazonでASINを調べておいて以下のように
記述する方法があります。こちらが確実です。
(@ASIN:ASIN)
@@仕様----------------------------------------------------------
1行に1つずつ記述
連続して記述する際は空行をいれる(when :AFTER_Pなため)
@@キャッシュディレクトリ設定------------------------------------
ndiary.conf の LOG_DIRECTORY で指定したディレクトリに
amzcacheDVD
というディレクトリを作っておくと取得したデータをキャッシュしておくようになります。
キャッシュの有効期限もスクリプト内で指定しているので必要に応じて変更してください。
@@キャッシュ保持期間--------------------------------------------
キャッシュの有効期限を指定できます。
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='
'
@@ Special Thanx------------------------------------------------
== amazondvd.rb は以下の方の助力、影響、恩恵を受けています ==
- not (のとや) さん
-- http://www14.cds.ne.jp/~not/
-- nDiary本体とamazon.rbの作者
-- amazon.rb のソースに少し変更を加えたものが amazondvd.rb
- mas さん
-- http://home3.highway.ne.jp/mas/
-- バグ報告や動作確認、Amazonアソシエイト対応など
- Ace of Diamond さん
-- http://every.pobox.ne.jp/
-- Amazonアソシエイト対応コード不具合パッチなど
@@ 注意事項------------------------------------------------------
著作権がらみの情報を取得するため、
www.amazon.co.jpのアソシエイトプログラムを確認の上自己責任でご利用下さい。
=end
class Module
def attr_my_accessordvd( name )
module_eval %{
def #{name.id2name}()
get_dvddata
@#{name.id2name}
end
}
end
end
class Amazondvd
require 'net/http'
attr_accessor :dvdid
attr_accessor :cddvdps2
attr_accessor :skey
attr_my_accessordvd :title
attr_my_accessordvd :actor
attr_my_accessordvd :maker
attr_my_accessordvd :director
attr_my_accessordvd :size
attr_my_accessordvd :pubdate
attr_my_accessordvd :price
attr_my_accessordvd :desc
attr_my_accessordvd :writer
attr_my_accessordvd :image_url
attr_my_accessordvd :imageL_url
attr_my_accessordvd :image_width
attr_my_accessordvd :image_height
attr_my_accessordvd :media
attr_my_accessordvd :site
attr_my_accessordvd :time
attr_my_accessordvd :voice
attr_my_accessordvd :voice_spec
attr_my_accessordvd :caption
attr_my_accessordvd :stand_in
attr_my_accessordvd :screen_size
attr_reader :cache_dir
attr_accessor :expire
attr_accessor :proxy
def initialize
@expire = 0 # 0だと存在するキャッシュを必ず使用
@proxy = nil
end
def load_cache
if @flag or
(File::directory?(@cache_dir.to_s) and File::readable?(@cache_dir + @dvdid) and
File::mtime(@cache_dir + @dvdid) < Time::now.to_i - 3600 * 24 * @expire and
@expire != 0) then
return
end
@flag = true
read_cache
end
def read_cache
begin
open(@cache_dir + @dvdid){ |f|
@title, @actor, @maker, @size, @pubdate, @price, @desc, @writer, @image_url,@image_width, @image_height, @media, @director, @site, @cddvdps2, @imageL_url, @time, @voice, @voice_spec, @caption, @stand_in, @screen_size = f.read.split(/\t/)
}
rescue
@flag = nil
end
end
def save_cache
return unless File::directory?(@cache_dir.to_s)
begin
open(@cache_dir + @dvdid, 'w'){ |f|
f.write [ @title, @actor, @maker,@size, @pubdate, @price, @desc, @writer, @image_url,@image_width, @image_height, @media, @director, @site, @cddvdps2, @imageL_url, @time, @voice, @voice_spec, @caption, @stand_in, @screen_size ].join("\t")
}
rescue
#
end
end
def httpconnect(str)
if @proxy then
proxy, port = @proxy.split(':')
port = port.to_i
else
proxy = port = nil
end
Net::HTTP::Proxy(proxy, port).new( str.to_s, 80 )
end
def cache_dir=(dir)
dir << '/' unless dir[-1,1] == '/'
@cache_dir = dir
end
def media_get(str)
featured_system="(\w+)| =~ response.body then
keyword_trade = $1
if %r|
?.amazon.com/images/P/[^.]+.[0-9][0-9].[^T][^H][^U][^M][^B]Z+.jpg))
(?:.*
)+" =~ response.body.gsub(/\n/,'') then
@writer =$1
@desc = $2
end
end
#--------------------------------------------------
# Published Date
#--------------------------------------------------
#(2002/05/24)
:DVD,CD
#発売日:2002/03/28
:PS2
if %r"^(?:発売日:|\()([\d\/]+[\d])\)?
" =~ response.body then
@pubdate = $1
end
#--------------------------------------------------
# Size(ディスク枚数)
#--------------------------------------------------
if %r"(?:)?ディスク枚数:(?:)?(.+)
" =~ response.body then
@size = $1
end
#--------------------------------------------------
# CD,DVD or PS2?
#--------------------------------------------------
if %r|この(\w+)に\w+レビューを書| =~ response.body then
@media = $1
if %r|商品| =~ @media then
media_get(response.body)
end
end
if @title.nil? then
read_cache
else
save_cache
@flag = true
end
end
end
class Filter
def amazondvd(str, type)
tagend = (@diary.isXHTML ? ' />' : '>')
tag_br = "
No Image"
if @diary.respond_to?('config') then
proxy = @diary.config['PROXY']
amazon_id = @diary.config['BOOKSTORE_AMAZON_ID'].to_s
expire = @diary.config['AMAZON_CACHE_EXPIRE'].to_s
no_img = @diary.config['NO_IMAGE_FILE'].to_s unless @diary.config['NO_IMAGE_FILE'].to_s.empty?
end
case type
when :AFTER_P
str.gsub!(/
[\((][@@](CD|DVD|PS|PS2|GC|XBOX|ASIN)[::](.+)[\))]<\/p>/mi){
cddvdps2 = $1
tmp = $2.gsub(/^([A-Za-z]+)(\d+)$/, "\\1-\\2")
dvdid = tmp.gsub(/#.*/,"")
skey = tmp.gsub(/.*#/,"")
amzdvd = Amazondvd::new
amzdvd.cache_dir = @diary.logDirectory + 'amzcacheDVD'
amzdvd.dvdid = dvdid
amzdvd.cddvdps2 = cddvdps2
amzdvd.skey = skey
amzdvd.proxy = proxy
# キャッシュの有効日数
#amzdvd.expire = 0 # キャッシュの有効日数
if expire.empty? then
amzdvd.expire = 0
else
amzdvd.expire = expire.to_i
end
body = img = desc = media = maker = actor = director = size = writer = desc = site = largeimage = asin = titlewithasin = pubdate = price = date_price_size = time = voice_spec = voice = caption = stand_in = screen_size =''
title = "『#{amzdvd.title}』" unless amzdvd.title.to_s.empty?
unless amzdvd.title.nil?
if amzdvd.title =~ /Not Found/
then
print @diary.date.to_s
print "\tamazondvd error.#{amzdvd.title}\n"
break
end
if amazon_id.empty? then
title = "『#{amzdvd.title}』" unless amzdvd.title.to_s.empty?
else
if cddvdps2 == 'ASIN' then
title_with_id = "#{amzdvd.title.gsub(/#{dvdid}/,"#{dvdid}/ref=ase_#{amazon_id}/")}"
title = "『#{title_with_id.scan(/(]+)>/)[0]} title=\"この商品について\">#{title_with_id.scan(/(.*)<\/a>/)[0]}』" unless title_with_id.to_s.empty?
else
title_with_id = "#{amzdvd.title.gsub(/\/ref[^\">]+/,"/ref=ase_#{amazon_id}/")}"
# if amzdvd.site =~ /hmv/ then
# title = title_with_id
# else
title = "『#{title_with_id.scan(/(]+)>/)[0]} title=\"この商品について\">#{title_with_id.scan(/(.*)<\/a>/)[0]}』" unless title_with_id.to_s.empty?
# end
end
end
unless amzdvd.image_url.to_s.empty? then
unless amzdvd.imageL_url.to_s.empty? then
largeimage = amzdvd.imageL_url
img = "(.*)<\/a>/)[0]}\" class=\"amazonimg\"#{tagend}"
else
img = "
(.*)<\/a>/)[0]}\" class=\"amazonimg\"#{tagend}"
end
else
img = no_img
end
media = "#{amzdvd.media}#{tag_br}" unless amzdvd.media.to_s.empty?
maker = "#{amzdvd.maker.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")}#{tag_br}" unless amzdvd.maker.to_s.empty?
actor = "#{tag_br}出演者: #{amzdvd.actor.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")}" unless amzdvd.actor.to_s.empty?
director = "#{tag_br}監督: #{amzdvd.director.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")}" unless amzdvd.director.to_s.empty?
pubdate = "発売日: #{amzdvd.pubdate}" unless amzdvd.pubdate.to_s.empty?
price = "価格: #{amzdvd.price.gsub(/¥/,'\\')}" unless amzdvd.price.to_s.empty?
size = "枚数: #{amzdvd.size.gsub(/ /,'')}" unless amzdvd.size.to_s.empty?
time = "時間: #{amzdvd.time}" unless amzdvd.time.to_s.empty?
date_price_size_time = ""
date_price_size_time << "#{pubdate}" unless pubdate.to_s.empty?
date_price_size_time << ", #{price}" unless price.to_s.empty?
date_price_size_time << ", #{size}" unless size.to_s.empty?
date_price_size_time << ", #{time}" unless time.to_s.empty?
date_price_size_time = tag_br + date_price_size_time.gsub(/(^,\ )|(,\ $)/,"")
desc = "#{tag_br}#{tag_br}#{amzdvd.desc.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")}" unless amzdvd.desc.to_s.empty?
writer = "#{tag_br}#{tag_br}--#{amzdvd.writer}--" unless amzdvd.writer.to_s.empty?
site ="#{tag_br}#{amzdvd.site}" unless amzdvd.site.to_s.empty?
voice = "#{tag_br}音声: #{amzdvd.voice}" unless amzdvd.voice.to_s.empty?
voice_spec = "#{tag_br}音声仕様: #{amzdvd.voice_spec}" unless amzdvd.voice_spec.to_s.empty?
caption = "#{tag_br}字幕: #{amzdvd.caption}" unless amzdvd.caption.to_s.empty?
stand_in = "#{tag_br}吹き替え: #{amzdvd.stand_in}" unless amzdvd.stand_in.to_s.empty?
screen_size = "#{tag_br}画面サイズ: #{amzdvd.screen_size}" unless amzdvd.screen_size.to_s.empty?
body = "
| \n" # body << " #{img}\n" body << " #{img.gsub(/(\ +)?<\/title>/,"")}" body << " | \n" body << "\n" # body << " #{title}\n" body << " #{title.gsub(/(\ +)?<\/title>/,"")}" body << " #{media}\n" body << " #{maker}\n" body << " #{actor}\n" body << " #{director}\n" #body << " #{pubdate}" #body << " #{price}" #body << " #{size}" body << " #{date_price_size_time}\n" body << " #{voice}\n" body << " #{voice_spec}\n" body << " #{caption}\n" body << " #{stand_in}\n" body << " #{screen_size}\n" body << " #{writer}\n" body << " #{desc}\n" body << " \n" #body << " #{tag_br}#{dvdid}\n" #body << " #{site}\n" body << " | \n" body << "