Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

[ruby] AV女優一覧を取得するスクリプト

普段わたくしはエロビデオとか全く見ない人なのですが、ちょっと前、見たくないけど暇だからエロサイトを見て回ってたんですね。そしたら、おおーーこれは!!!という子をみつけました。あいだゆあ、っていう女優さんなんですが。

で、エロビデオについて大変造詣の深い某友人に、「あいだゆあってかわいいよね!!!」と興奮気味に話をしたところ、「もう引退してるよ、古い」とあしらわれ「もっと最近のAV見た方がいいよ」とまで言われました。

なにげにむかついたので、効率的なエロビデオ情報収集方法を模索していたところ、ゆーすけべーさんのこのエントリを見つけました。おぉー、このスクリプト使ってみたいなあ、、、と思ったものの、perl はよくわかりません。そんなわけで ruby で書いてみました。

#!/usr/bin/env ruby -Ku
#-*- coding: utf-8 -*-

require 'open-uri'
require 'pstore'
require 'date'

class Actress
  PATH_TO_CACHE = 'avactress.dump'
  EXPIRE = 7 # days
  
  def name(name)
    @avactress.select {|actress| /#{name}/ =~ actress[:name] }
  end
  
  def yomi(yomi)
    @avactress.select {|actress| /#{yomi}/ =~ actress[:yomi].gsub(/\s| /,"") if actress[:yomi] }
  end
  
  def debut(year)
    @avactress.select {|actress| year == actress[:debut] }
  end
  
  def alias(name)
    results = []
    @avactress.each do |actress|
      next unless actress[:alias] 
      if actress[:alias].include?(name)
        results << actress
      end
    end
    results
  end
  
  private
  def initialize
    if not File::exist?(PATH_TO_CACHE)
      get_wikipedia
      write_cache
    else
      s = File::stat(PATH_TO_CACHE)
      modified = s.mtime.strftime("%Y/%m/%d").split("/").map {|x| x.to_i}
      expire = Date.new(*modified) + EXPIRE
      if Date.today > expire
        get_wikipedia
        write_cache
      else
        read_cache
      end
    end
  end
  
  def get_wikipedia
    url = 'http://ja.wikipedia.org/wiki/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7'
    dat = open(url).read
    
    dat = dat.gsub(/\n/, "").gsub("\&amp\;", "")
    lines = dat.scan(/<li><a.*?>(.*?)<\/a>(.*?)<\/li>/)
    
    @avactress = []
    lines.each do |line| 
      h = Hash.new
      if // =~ line[1]
        h[:name] = line[0]
        tmp = line[1].gsub(/<.*?>/,"").split(/|\(/)
        items = []
        tmp.each {|item| items += item.split(/|\)/).map{|x| x.strip}}
        
        items.each do |item|
          h[:yomi] = item if /^[ぁ-んー\s &]*$/ =~ item
          h[:debut] = $1.to_i if /([0-9]{4})/ =~ item
          h[:alias] = $1.split(/|/).map {|x| x.gsub(/\s| /,"")} if /^(.*)/ =~ item
        end        
      end
      @avactress << h unless h == {}
    end
    @avactress
  end
  
  def read_cache
    db = PStore.new(PATH_TO_CACHE)
    db.transaction(true) do
      @avactress = db[:cache]
    end
  end
  
  def write_cache
    db = PStore.new(PATH_TO_CACHE)
    db.transaction do
      db[:cache] = @avactress
    end
  end
end

こんな感じ↓で使えます。

a = Actress.new
p a.name("あいだゆあ") # => [{:yomi=>"あいだ ゆあ", :name=>"あいだゆあ", :debut=>2004}]
p a.debut(1981).first # => {:yomi=>"あいぞめ きょうこ", :name=>"愛染恭子", :debut=>1981}
p a.alias("萩原さやか") # => [{:yomi=>"おぎわら さやか", :name=>"荻原さやか", :debut=>2001, :alias=>["萩原さやか"]}]
p a.yomi("^い").first # => {:yomi=>"いいじま あい", :name=>"飯島愛", :debut=>1992}

どーぞご利用ください。