アニメイトTVのATVニュース一覧を取得するPRaggerプラグイン

アニメイトTVRSSを配信してくれないのでニュース一覧を取得するプラグインを書いてみました.役に立つかどうかは不明です.需要ないだろうし.あと全文配信です.たぶん.
ニュース速報の方はまだ書いてないですけど正規表現パターン変えるだけで済むんでないかと思うのでそのうち.まーそれを言ったら他のニュースサイトもURLとパターン変えるだけなんですが.*1
以下ソースです.ファイル名は"atv_news.rb",文字コードUTF-8で保存してください.


(追記10/25):スーパーpre記法のバグ?の所為か,個別記事のURL(http://d.hatena.ne.jp/nana_mai2/20070923/1190553845)で見ると,ソース中の正規表現で使っているHTMLのコメント部分(<!-- 〜 -->)が見えなくなっています.(参考:http://i.hatena.ne.jp/idea/16978)
個別記事で見ている方は,次のURLで見てください:
http://d.hatena.ne.jp/nana_mai2/20070923

  • atv_news.rb
require 'open-uri'
require 'rss/maker'
require 'kconv'

class RSS::Maker::RSS10::Items::Item
  def get_description(url)
    capture = /<!-- ===== ニュース詳細 \/ メイン記事 ===== -->(.+?)<!-- ===== 拡張記事/通販枠部分 ===== -->/m
    if open(url).read.toutf8 =~ capture
      return $1.gsub(/src="(?:\.\.)?(.+?)"/){"src=\"http://www.animate.tv#{$1}\""}
    else
      nil
    end
  end

  def parse(split_text)
    if split_text =~ /<a href="(.+?)">/
      self.link = "http://www.animate.tv/news/"+$1
      self.description = get_description(self.link)
    end
    if split_text =~ /<a.+?>(.+?)<\/a>/m
      self.title = $1.gsub(/[\t\r\n]|(<.+?>)/,"")
    end
  end
end

def atv_news(config,data)
  url = 'http://www.animate.tv/news/index2.php?type=none'
  capture = /<!-- ########## ニュース ############################## -->(.+?)<!-- ########## ニュース一覧 ############################## -->/m
  split = /(<a href="detail\.php\?id=.+?">.+?<\/a>)/m
  rss = RSS::Maker.make("1.0") do |maker|
    maker.channel.about = "http://www.animate.tv/news/index.php"
    maker.channel.title = "ATVニュース"
    maker.channel.description = ""
    maker.channel.link = "http://www.animate.tv/news/index.php"
    body = ""
    if open(url).read.toutf8 =~ capture
      body = $1
    else
      return []
    end
    count = 0
    body.gsub(split) do
      break if config['size'] && count == config['size'].to_i
      count += 1
      maker.items.new_item.parse($1)
    end
  end
  return rss.items
end

続いてconfigのサンプル.
一覧ページの記事全部取ってくるとどえらい量(60本!)になるので,記事を何本取ってくるかsizeで指定しています.
sizeは省略可能で,省略したときは全部取ってきます.全部取ってくると結構時間かかります.

- module: Feed::atv_news
  config:
    size: 10
- module: RSS::save
  config:
    filename: ./hoge.rdf

*1:そのためのcustom_feed.rbなんでしょうが,あれはどうも使いづらくて・・・