require "nori"
module NicoQuery
module ObjectMapper
class MylistRSS
attr_reader :meta, :items
def initialize(xml)
@parser = Nori.new
@parsed_xml = @parser.parse xml
entire = @parsed_xml['rss']['channel']
@meta = Meta.new entire, title_prefix
if entire['item'].is_a? Array
@items = entire['item'].map { |item| Item.new item }
elsif entire['item'].nil?
@items = []
else
# noriは子要素が複数の場合は配列に変換するが、1つの場合には配列にしない。
# しかし、MylistRSSはitemsが配列であること前提にしているので、item要素が
# 1つだけの場合にも配列に変換する必要がある。
@items = [ Item.new(entire['item']) ]
end
end
def title_prefix
"マイリスト"
end
class Meta
def initialize(parsed_xml, title_prefix)
@title_prefix = title_prefix
@hash = parsed_xml
end
def title
@hash['title'].scan(/(?<=#{@title_prefix}\s).+(?=\‐ニコニコ動画)/)[0].split(' ')[0]
# .force_encoding('utf-8')
end
def url
link
end
def link
@hash['link'].presence
end
def mylist_id
return nil unless @hash['link'].present?
@hash['link'].scan(/(?<=mylist\/)\d{1,}/)[0].to_i
end
def description
return nil unless @hash['description'].present?
return nil if @hash['description'] == "このマイリストは非公開に設定されています。"
@hash['description']
end
def publish_date
return nil unless @hash['publish_date'].present?
Time.parse @hash['publish_date']
end
def last_build_date
return nil unless @hash['lastBuildDate'].present?
Time.parse @hash['lastBuildDate']
end
def creator
return nil unless @hash['dc:creator'].present?
@hash['dc:creator']
end
end
class Item
def initialize(parsed_xml)
@hash = parsed_xml
end
def title
return nil if @hash == nil
@hash['title']
end
def video_id
return nil if @hash == nil
(url.scan(/((sm|nm)\d{1,})/).map {|e| e[0]})[0]
end
def url
return nil if @hash == nil
@hash['link']
end
def thread_id
return nil if @hash == nil
@hash['guid'].scan(/(?<=watch\/)\d{1,}$/)[0].to_i
end
def publish_date
return nil if @hash == nil
Time.parse @hash['pubDate']
end
def thumbnail_url
return nil if @hash == nil
description.raw_text.scan(/(?<=src\=\").{1,}(?=\"\swidth)/)[0]
$&
end
def view_counter
return nil if @hash == nil
description.raw_text.scan(/(?<=nico-numbers-view\">)[0-9,]{1,}(?=\<\/strong)/)[0].delete(',').to_i
end
def comment_num
return nil if @hash == nil
description.raw_text.scan(/(?<=nico-numbers-res\">)[0-9,]{1,}(?=\<\/strong)/)[0].delete(',').to_i
end
def mylist_counter
return nil if @hash == nil
description.raw_text.scan(/(?<=nico-numbers-mylist\">)[0-9,]{1,}(?=\<\/strong)/)[0].delete(',').to_i
end
def description
return nil if @hash == nil
@_description ||= Description.new @hash['description']
end
def length
return nil if @hash == nil
description.raw_text.scan(/(?<=class\=\"nico\-info\-length\"\>)\d{1,}\:\d{1,2}(?=\<\/strong\>)/)
length_string = $&.to_s.split(':')
length_string[0].to_i * 60 + length_string[1].to_i
end
class Description
attr_reader :raw_text
def initialize(raw_text)
@raw_text = raw_text.to_s
end
def text
@raw_text.scan /(?<=class\=\"nico\-description\"\>).{1,}(?=\<\/p\>)/
$&
end
def movie_references
# is this the high road?
text.scan(/((sm|nm)\d{1,})/).map {|e| e[0]}
end
def mylist_references
text.scan(/(?<=mylist\/)\d{1,}/).map(&:to_i)
end
def community_references
text.scan /co\d{1,}/
end
def seiga_references
text.scan /im\d{1,}/
end
end
end
#
#
おまえら、みっくみくにしてやんよ。歌詞はhttp://ikamo.hp.infoseek.co.jp/mikumiku.txt(9/20 1:55修正)。上げている他のもの→mylist/1450136
1:38|2007年09月20日 01:22:02 投稿
]]> # #レッツゴー!陰陽師(フルコーラスバージョン)
5:19|2007年03月06日 00:33:00 投稿
]]>