class EroGetter::Base

Public Class Methods

base_dir() click to toggle source
# File lib/ero_getter/base.rb, line 16
def self.base_dir
  self.to_s.underscore
end
connection(css, &block) click to toggle source
# File lib/ero_getter/base.rb, line 138
def connection(css, &block)
  [:prev, :next].each_with_index do |method_name, index|
    var_name = "@#{method_name}".to_sym
    define_method(method_name) do
      unless instance_variable_defined?(var_name)
        tag = document.css(css[index]).first
        instance_variable_set(var_name,
          tag && instance_exec(tag, &block) ? tag[:href] : nil)
      end
      instance_variable_get(var_name)
    end
  end
end
filename() { |attr| ... } click to toggle source
# File lib/ero_getter/base.rb, line 152
def filename(&block)
  define_method(:_filename) do |attr|
    yield(attr)
  end
end
name(site_name) click to toggle source
# File lib/ero_getter/base.rb, line 101
def name(site_name)
  define_method(:name) do
    site_name
  end
  define_singleton_method(:site_name) do
    site_name
  end
end
new(url, direction = :none) click to toggle source
# File lib/ero_getter/base.rb, line 10
def initialize(url, direction = :none)
  raise unless url.match url_regex
  @url = url
  @direction = direction
end
sub_directory(&block) click to toggle source
# File lib/ero_getter/base.rb, line 129
def sub_directory(&block)
  define_method(:sub_directory) do
    unless instance_variable_defined?(:@sub_directory)
      instance_variable_set(:@sub_directory, self.instance_eval(&block))
    end
    instance_variable_get(:@sub_directory)
  end
end
target(css_selector) { |elm| ... } click to toggle source
# File lib/ero_getter/base.rb, line 117
def target(css_selector, &block)
  define_method(:targets) do
    unless instance_variable_defined?(:@targets)
      items = document.css(css_selector).map do |elm|
        yield(elm)
      end
      instance_variable_set(:@targets, items.compact)
    end
    instance_variable_get(:@targets)
  end
end
url(regex) click to toggle source
# File lib/ero_getter/base.rb, line 110
def url(regex)
  define_method(:url_regex) do
    regex
  end
  EroGetter.add_mapping(regex, self)
end

Public Instance Methods

direction() click to toggle source
# File lib/ero_getter/base.rb, line 36
def direction
  @direction
end
directory() click to toggle source
# File lib/ero_getter/base.rb, line 20
def directory
  unless @dir
    @dir = File.join(EroGetter.directory, self.class.base_dir, sub_directory)
    FileUtils.mkdir_p(@dir)
  end
  @dir
end
document() click to toggle source
# File lib/ero_getter/base.rb, line 44
def document
  @document ||= Nokogiri::HTML(html, nil, NKF.guess(html).to_s)
end
filename(basename, index) click to toggle source
# File lib/ero_getter/base.rb, line 167
def filename(basename, index)
  if respond_to?(:_filename)
    _filename(:index => index, :basename => basename, :ext => File.extname(basename))
  else
    basename
  end
end
get_target(target, count = 0) click to toggle source
# File lib/ero_getter/base.rb, line 64
def get_target(target, count = 0)
  response = http_client.get(target, :header => {:referer => url}, :follow_redirect => true)
  unless response.status == 200
    raise target unless count < 3
    sleep 2
    return get_target target, count + 1
  end
  response
end
html() click to toggle source
# File lib/ero_getter/base.rb, line 40
def html
  @html ||= open(url).read
end
http_client() click to toggle source
# File lib/ero_getter/base.rb, line 28
def http_client
  @http_client ||= HTTPClient.new
end
run() click to toggle source
# File lib/ero_getter/base.rb, line 52
def run
  targets.each_with_index do |target_url, index|
    if target_url =~ /.*\.zip$/
      save_zip(target_url, index)
    else
      save_image(target_url, index)
    end
  end
  self.class.new(self.prev, :prev).run if run_prev?
  self.class.new(self.next, :next).run if run_next?
end
run_next?() click to toggle source
# File lib/ero_getter/base.rb, line 159
def run_next?
  direction != :prev && respond_to?(:next) && self.next != nil
end
run_prev?() click to toggle source
# File lib/ero_getter/base.rb, line 163
def run_prev?
  direction != :next && respond_to?(:prev) && self.prev != nil
end
save_image(target_url, index) click to toggle source
# File lib/ero_getter/base.rb, line 74
def save_image(target_url, index)
  _filename = filename(File.basename(target_url), index)
  response = get_target(target_url)
  File.open(File.join(directory, _filename), "wb") {|f| f.write response.body }
end
save_zip(target_url, index) click to toggle source
# File lib/ero_getter/base.rb, line 80
def save_zip(target_url, index)
  response = get_target(target_url)
  unzip(response.body).each do |_filename, data|
    File.open(File.join(directory, _filename), "wb") {|f| f.write data }
  end
end
title() click to toggle source
# File lib/ero_getter/base.rb, line 48
def title
  @title ||= document.title.strip
end
unzip(zip_data) click to toggle source
# File lib/ero_getter/base.rb, line 87
def unzip(zip_data)
  result = []
  Zip::Archive.open_buffer(zip_data) do |archive|
    archive.num_files.times do |i|
      entry_name = archive.get_name(i)
      archive.fopen(entry_name) do |f|
        result << [f.name, f.read]
      end
    end
  end
  result
end
url() click to toggle source
# File lib/ero_getter/base.rb, line 32
def url
  @url
end