# ★ RGSS3_ニコ新着チェッカー Ver1.0
#==============================================================================
=begin
作者:tomoaky
webサイト:ひきも記は閉鎖しました。([url]http://hikimoki.sakura.ne.jp/[/url])
このスクリプトを導入すると、通常のゲーム処理と並行して
ニコニコ動画の新着動画情報を受信し、画面上部に表示することができます。
F8キーを押すことで、表示中の動画をブラウザで視聴することもできます。
動作には WHITE-FLUTE Web ([url]http://www.whiteflute.org/[/url]) 様にて配布されている
『NET-EX ネット通信スクリプト VXAce版』が必要です、利用規約をよく読み
同意したうえで正しく導入してください。
RGSS3_ニコニコ動画 は tomoaky が作成したプラグインスクリプトです。
このスクリプトのサポートを WHITE-FLUTE Web 様へ求めるようなことは
絶対にしないでください。
2014.02.13 Ver1.0
公開
=end
#==============================================================================
# □ 設定項目
#==============================================================================
module TMNICONEW
TIMEOUT_SECOND = 10 # タイムアウトまでの時間(秒)
INTERVAL_SECOND = 300 # データ取得間隔(秒)
OUTPUT_SECOND = 15 # 動画情報の表示時間(秒)
BROWSE_KEY = :F8 # ブラウザ視聴に利用するキー
GUIDE_TEXT = "F8:ブラウザで視聴"
# 動画リストの取得先アドレス
LIST_URI = "http://www.nicovideo.jp/newarrival?rss=2.0"
# 動画リストを取得するための正規表現(順番変更不可)
# タイトル, 動画アドレス, サムネアドレス, 再生時間
RSS_TAGS = [
/<title>(.+?)<\/title>/,
/<link>(.+?)<\/link>/,
/<img\salt\=\".+?\"\ssrc\=\"(.+?)\"\swidth/,
/<strong\sclass\=\"nico\-info\-length\">(.+?)<\/strong>/,
]
end
#==============================================================================
# □ ネット通信のセットアップ
#------------------------------------------------------------------------------
# 解放処理は共通実行スクリプトで必ず実行するようにしてください。
#==============================================================================
unless WFNet.http
WFNet.setup
WFNet.http_setup
end
#==============================================================================
# ◆ WFNet
#==============================================================================
module WFNet
module_function
#--------------------------------------------------------------------------
# ◇ サムネイルの破損チェック
#--------------------------------------------------------------------------
def img_valid?(file_name)
result = true
f = File.open(file_name, "rb")
begin
header = f.read(8)
f.seek(-12, IO::SEEK_END)
footer = f.read(12)
rescue
return false
end
if header[0,2].unpack("H*") == [ "ffd8" ]
result = false unless footer[-2,2].unpack("H*") == [ "ffd9" ]
else
result = false
end
f.close
result
end
#--------------------------------------------------------------------------
# ◇ 特殊文字の変換
#--------------------------------------------------------------------------
def convert_ex_characters(text)
return unless text
text.gsub!(/\&\;/) {|s| "&" }
text.gsub!(/\&\;/) {|s| "&" }
text.gsub!(/\ \;/) {|s| " " }
text.gsub!(/\&apos\;/) {|s| "'" }
text.gsub!(/\"\;/) {|s| '"' }
text.gsub!(/\<\;/) {|s| "<" }
text.gsub!(/\>\;/) {|s| ">" }
text
end
end
#==============================================================================
# □ Game_NicoNew
#------------------------------------------------------------------------------
# ニコニコ動画の新着動画をチェックするクラスオブジェクトです。このクラスのイン
# スタンスは $game_niconew で参照されます。
#==============================================================================
class Game_NicoNew
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :use_thum # サムネイル利用可能フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@state = 0
@use_thum = false
@data = nil
@log = []
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
case @state
when 0; update_get_data
when 1; update_wait_data
when 2; update_get_img
when 3; update_wait_img
when 4; update_output
end
end
#--------------------------------------------------------------------------
# ● フレーム更新(動画情報のリクエスト)
#--------------------------------------------------------------------------
def update_get_data
return if @last_get && Time.now - @last_get > TMNICONEW::INTERVAL_SECOND
uri = TMNICONEW::LIST_URI
file_name = "System/nico_list.tom"
if WFNet.uri_open(uri, file_name)
@state = 1
@start_second = Time.now
end
end
#--------------------------------------------------------------------------
# ● フレーム更新(動画情報の受信待ち)
#--------------------------------------------------------------------------
def update_wait_data
file_name = "System/nico_list.tom"
if WFNet.is_http_finish?
@data_list = []
a = nil
file = File::open(file_name)
file.each do |line|
a = [] if /<item>/ =~ line
if a
TMNICONEW::RSS_TAGS.each_with_index {|s, i| a[i] = $1 if s =~ line }
end
end
file.close
@state = 2
elsif Time.now - @start_second > TMNICONEW::TIMEOUT_SECOND
@state = 0
@last_get = nil
end
end
#--------------------------------------------------------------------------
# ● フレーム更新(サムネイルのリクエスト)
#--------------------------------------------------------------------------
def update_get_img
if @data_list.empty?
@state = 0
else
@data = @data_list.shift
@log.push(@data[2])
if WFNet.uri_open(@data[2], "System/nico_thumnail.jpg")
@state = 3
@start_second = Time.now
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新(サムネイルの受信待ち)
#--------------------------------------------------------------------------
def update_wait_img
if WFNet.is_http_finish?
@use_thum = WFNet.img_valid?("System/nico_thumnail.jpg")
elsif Time.now - @start_second > TMNICONEW::TIMEOUT_SECOND
@use_thum = false
else
return
end
@state = 4
@wait_count = TMNICONEW::OUTPUT_SECOND * Graphics.frame_rate
end
#--------------------------------------------------------------------------
# ● フレーム更新(動画情報の表示中)
#--------------------------------------------------------------------------
def update_output
@wait_count -= 1
@state = 2 if @wait_count == 0
end
#--------------------------------------------------------------------------
# ● 動画のタイトルを返す
#--------------------------------------------------------------------------
def nico_title
return nil unless @data
return nil if @state < 4
WFNet.convert_ex_characters(@data[0])
end
#--------------------------------------------------------------------------
# ● 動画のアドレスを返す
#--------------------------------------------------------------------------
def nico_uri
return nil unless @data
return nil if @state < 4
@data[1]
end
#--------------------------------------------------------------------------
# ● 動画の長さを返す
#--------------------------------------------------------------------------
def nico_length
return nil unless @data
return nil if @state < 4
@data[3]
end
end
#==============================================================================
# □ Sprite_NicoNew
#==============================================================================
class Sprite_NicoNew < Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil)
super(viewport)
self.bitmap = Bitmap.new(Graphics.width, 54)
self.z = 9999
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
super
self.bitmap.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @uri != $game_niconew.nico_uri
@uri = $game_niconew.nico_uri
refresh if @uri
end
self.y += 2 if self.y < 0
super
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.bitmap.clear
self.bitmap.font.size = 20
self.bitmap.gradient_fill_rect(bitmap.rect, Color.new(0, 0, 0, 192),
Color.new(0, 0, 0, 0), true)
if $game_niconew.use_thum
bitmap = Bitmap.new("System/nico_thumnail")
rect = Rect.new(2, 2, 65, 50)
self.bitmap.stretch_blt(rect, bitmap, bitmap.rect)
bitmap.dispose
else
self.bitmap.fill_rect(2, 2, 65, 50, Color.new(0, 0, 0))
self.bitmap.draw_text(2, 2, 65, 20, "No IMG")
end
self.bitmap.draw_text(69, 2, self.width - 69, 20, $game_niconew.nico_title)
self.bitmap.draw_text(2, 32, 65, 20, $game_niconew.nico_length, 2)
self.bitmap.font.size = 16
self.bitmap.draw_text(0, 24, self.width - 2, 16, TMNICONEW::GUIDE_TEXT, 2)
self.y = 0 - self.height
end
end
#==============================================================================
# ■ Scene_Base
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
alias tmniconew_scene_base_start start
def start
tmniconew_scene_base_start
$game_niconew = Game_NicoNew.new unless $game_niconew
@niconew_sprite = Sprite_NicoNew.new(nil)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias tmniconew_scene_base_update update
def update
tmniconew_scene_base_update
$game_niconew.update
@niconew_sprite.update
if Input.trigger?(TMNICONEW::BROWSE_KEY) && $game_niconew.nico_uri
a = Win32API.new("shell32","ShellExecuteA", %w(p p p p p i),"i")
a.call(0, "open", $game_niconew.nico_uri, 0, 0, 1)
end
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
alias tmniconew_scene_base_terminate terminate
def terminate
tmniconew_scene_base_terminate
@niconew_sprite.dispose
end
end