Class: EroGetter::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/ero_getter/base.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url, direction = :none) ⇒ Base

Returns a new instance of Base.



9
10
11
12
13
# File 'lib/ero_getter/base.rb', line 9

def initialize(url, direction = :none)
  raise unless url.match url_regex
  @url = url
  @direction = direction
end

Class Method Details

.connection(css, &block) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/ero_getter/base.rb', line 137

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(&block) ⇒ Object



151
152
153
154
155
# File 'lib/ero_getter/base.rb', line 151

def filename(&block)
  define_method(:_filename) do |attr|
    yield(attr)
  end
end

.name(site_name) ⇒ Object



100
101
102
103
104
105
106
107
# File 'lib/ero_getter/base.rb', line 100

def name(site_name)
  define_method(:name) do
    site_name
  end
  define_singleton_method(:site_name) do
    site_name
  end
end

.sub_directory(&block) ⇒ Object



128
129
130
131
132
133
134
135
# File 'lib/ero_getter/base.rb', line 128

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, &block) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
# File 'lib/ero_getter/base.rb', line 116

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) ⇒ Object



109
110
111
112
113
114
# File 'lib/ero_getter/base.rb', line 109

def url(regex)
  define_method(:url_regex) do
    regex
  end
  EroGetter.add_mapping(regex, self)
end

Instance Method Details

#base_dirObject



15
16
17
# File 'lib/ero_getter/base.rb', line 15

def base_dir
  self.class.to_s.underscore
end

#directionObject



35
36
37
# File 'lib/ero_getter/base.rb', line 35

def direction
  @direction
end

#directoryObject



19
20
21
22
23
24
25
# File 'lib/ero_getter/base.rb', line 19

def directory
  unless @dir
    @dir = File.join(EroGetter.directory, base_dir, sub_directory)
    FileUtils.mkdir_p(@dir)
  end
  @dir
end

#documentObject



43
44
45
# File 'lib/ero_getter/base.rb', line 43

def document
  @document ||= Nokogiri::HTML(html, nil, NKF.guess(html).to_s)
end

#get_target(target, count = 0) ⇒ Object



63
64
65
66
67
68
69
70
71
# File 'lib/ero_getter/base.rb', line 63

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

#htmlObject



39
40
41
# File 'lib/ero_getter/base.rb', line 39

def html
  @html ||= open(url).read
end

#http_clientObject



27
28
29
# File 'lib/ero_getter/base.rb', line 27

def http_client
  @http_client ||= HTTPClient.new
end

#runObject



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/ero_getter/base.rb', line 51

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

#save_image(target_url, index) ⇒ Object



73
74
75
76
77
# File 'lib/ero_getter/base.rb', line 73

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) ⇒ Object



79
80
81
82
83
84
# File 'lib/ero_getter/base.rb', line 79

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

#titleObject



47
48
49
# File 'lib/ero_getter/base.rb', line 47

def title
  @title ||= document.title.strip
end

#unzip(zip_data) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/ero_getter/base.rb', line 86

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

#urlObject



31
32
33
# File 'lib/ero_getter/base.rb', line 31

def url
  @url
end