manga-downloadr 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 46c5a3170b1ad7a8bb7b31e656d35246441268e4
4
- data.tar.gz: dcc2c96a192ae2afc9a58583fdae3990154d1699
3
+ metadata.gz: 0122407cb8382eb31f8b25dffe79e049b3ddef59
4
+ data.tar.gz: c9afad43701915f6b793049af828d27f7607014a
5
5
  SHA512:
6
- metadata.gz: 1d5e7caa9b3f595d7aff8068116ff5ba6006deabf23f78eeb73eeafe1588a517eb8437d4c419b0fd7ec76cb15df499156ffeaa7bd8ad56c486afe4461ac2d5b8
7
- data.tar.gz: 8ed2a881d0e49023524c66464fafc370f6d37c41a397df4ffc07473a569ff4f4c811ff4c7c41b91f50b72ce610a817842bcddc75a321835ba6de85ee1892bfcf
6
+ metadata.gz: 64a1017562b4b8fef387d5552d467bb7c542202baca577b1340f1d7f563a97c49b47af1e9de3039241d0258bded1eafbb35ae882aa84650c406ac86ea26315c4
7
+ data.tar.gz: 555996bb4fce50a1868b4e2660bd67f12e5d429ddca270d2d878849e0b810ab080deffb7fcdcb173bd1d5dfdb7c9c96db3489356b3178d143f098c7b8db8d887
data/bin/manga-downloadr CHANGED
@@ -36,7 +36,7 @@ rescue OptionParser::ParseError
36
36
  end
37
37
 
38
38
  require 'manga-downloadr'
39
- generator = MangaDownloadr::Workflow.create(options[:url], options[:name], manga_root: options[:directory])
39
+ generator = MangaDownloadr::Workflow.create(options[:url], options[:name], options[:directory])
40
40
  unless generator.state?(:chapter_urls)
41
41
  puts "Massive parallel scanning of all chapters "
42
42
  generator.fetch_chapter_urls!
@@ -10,6 +10,14 @@ require 'fastimage'
10
10
  require 'open-uri'
11
11
  require 'yaml'
12
12
 
13
+ if ENV['RUBY_ENV'].nil?
14
+ require 'retryable_typhoeus'
15
+ Typhoeus::Request.send(:include, RetryableTyphoeus::RequestExtension)
16
+ Typhoeus::Hydra.send(:include, RetryableTyphoeus::HydraExtension)
17
+ else
18
+ Typhoeus::Hydra.send(:alias_method, :queue_with_retry, :queue)
19
+ end
20
+
13
21
  module MangaDownloadr
14
22
  ImageData = Struct.new(:folder, :filename, :url)
15
23
 
@@ -18,6 +26,7 @@ module MangaDownloadr
18
26
  attr_accessor :chapter_list, :chapter_pages, :chapter_images, :download_links, :chapter_pages_count
19
27
  attr_accessor :manga_title, :pages_per_volume, :page_size
20
28
  attr_accessor :processing_state
29
+ attr_accessor :fetch_page_urls_errors, :fetch_image_urls_errors, :fetch_images_errors
21
30
 
22
31
  def initialize(root_url = nil, manga_name = nil, manga_root = nil, options = {})
23
32
  root_url or raise ArgumentError.new("URL is required")
@@ -37,7 +46,10 @@ module MangaDownloadr
37
46
  self.pages_per_volume = options[:pages_per_volume] || 250
38
47
  self.page_size = options[:page_size] || [600, 800]
39
48
 
40
- self.processing_state = []
49
+ self.processing_state = []
50
+ self.fetch_page_urls_errors = []
51
+ self.fetch_image_urls_errors = []
52
+ self.fetch_images_errors = []
41
53
  end
42
54
 
43
55
  def fetch_chapter_urls!
@@ -55,17 +67,26 @@ module MangaDownloadr
55
67
  begin
56
68
  request = Typhoeus::Request.new "http://www.mangareader.net#{chapter_link}"
57
69
  request.on_complete do |response|
58
- chapter_doc = Nokogiri::HTML(response.body)
59
- pages = chapter_doc.css('#selectpage #pageMenu option')
60
- chapter_pages.merge!(chapter_link => pages.map { |p| p['value'] })
61
- print '.'
70
+ begin
71
+ chapter_doc = Nokogiri::HTML(response.body)
72
+ pages = chapter_doc.css('#selectpage #pageMenu option')
73
+ chapter_pages.merge!(chapter_link => pages.map { |p| p['value'] })
74
+ print '.'
75
+ rescue => e
76
+ self.fetch_page_urls_errors << { url: chapter_link, error: e, body: response.body }
77
+ print 'x'
78
+ end
62
79
  end
63
- hydra.queue request
80
+ hydra.queue_with_retry request
64
81
  rescue => e
65
82
  puts e
66
83
  end
67
84
  end
68
85
  hydra.run
86
+ unless fetch_page_urls_errors.empty?
87
+ puts "\n Errors fetching page urls:"
88
+ puts fetch_page_urls_errors
89
+ end
69
90
 
70
91
  self.chapter_pages_count = chapter_pages.values.inject(0) { |total, list| total += list.size }
71
92
  current_state :page_urls
@@ -78,22 +99,31 @@ module MangaDownloadr
78
99
  begin
79
100
  request = Typhoeus::Request.new "http://www.mangareader.net#{page_link}"
80
101
  request.on_complete do |response|
81
- chapter_doc = Nokogiri::HTML(response.body)
82
- image = chapter_doc.css('#img').first
83
- tokens = image['alt'].match("^(.*?)\s\-\s(.*?)$")
84
- extension = File.extname(URI.parse(image['src']).path)
85
-
86
- chapter_images.merge!(chapter_key => []) if chapter_images[chapter_key].nil?
87
- chapter_images[chapter_key] << ImageData.new( tokens[1], "#{tokens[2]}#{extension}", image['src'] )
88
- print '.'
102
+ begin
103
+ chapter_doc = Nokogiri::HTML(response.body)
104
+ image = chapter_doc.css('#img').first
105
+ tokens = image['alt'].match("^(.*?)\s\-\s(.*?)$")
106
+ extension = File.extname(URI.parse(image['src']).path)
107
+
108
+ chapter_images.merge!(chapter_key => []) if chapter_images[chapter_key].nil?
109
+ chapter_images[chapter_key] << ImageData.new( tokens[1], "#{tokens[2]}#{extension}", image['src'] )
110
+ print '.'
111
+ rescue => e
112
+ self.fetch_image_urls_errors << { url: page_link, error: e }
113
+ print 'x'
114
+ end
89
115
  end
90
- hydra.queue request
116
+ hydra.queue_with_retry request
91
117
  rescue => e
92
118
  puts e
93
119
  end
94
120
  end
95
121
  end
96
122
  hydra.run
123
+ unless fetch_image_urls_errors.empty?
124
+ puts "\nErrors fetching image urls:"
125
+ puts fetch_image_urls_errors
126
+ end
97
127
 
98
128
  current_state :image_urls
99
129
  end
@@ -102,30 +132,35 @@ module MangaDownloadr
102
132
  hydra = Typhoeus::Hydra.new(max_concurrency: hydra_concurrency)
103
133
  chapter_list.each_with_index do |chapter_key, chapter_index|
104
134
  chapter_images[chapter_key].each do |file|
105
- begin
106
135
  downloaded_filename = File.join(manga_root_folder, file.folder, file.filename)
107
136
  next if File.exists?(downloaded_filename) # effectively resumes the download list without re-downloading everything
108
137
  request = Typhoeus::Request.new file.url
109
138
  request.on_complete do |response|
110
- # download
111
- FileUtils.mkdir_p(File.join(manga_root_folder, file.folder))
112
- File.open(downloaded_filename, "wb+") { |f| f.write response.body }
113
-
114
- # resize
115
- image = Magick::Image.read( downloaded_filename ).first
116
- resized = image.resize_to_fit(600, 800)
117
- resized.write( downloaded_filename ) { self.quality = 50 }
118
-
119
- print '.'
120
- GC.start # to avoid a leak too big (ImageMagick is notorious for that, specially on resizes)
139
+ begin
140
+ # download
141
+ FileUtils.mkdir_p(File.join(manga_root_folder, file.folder))
142
+ File.open(downloaded_filename, "wb+") { |f| f.write response.body }
143
+
144
+ # resize
145
+ image = Magick::Image.read( downloaded_filename ).first
146
+ resized = image.resize_to_fit(600, 800)
147
+ resized.write( downloaded_filename ) { self.quality = 50 }
148
+
149
+ print '.'
150
+ GC.start # to avoid a leak too big (ImageMagick is notorious for that, specially on resizes)
151
+ rescue => e
152
+ self.fetch_images_errors << { url: file.url, error: e }
153
+ print '.'
154
+ end
121
155
  end
122
- hydra.queue request
123
- rescue => e
124
- puts e
125
- end
156
+ hydra.queue_with_retry request
126
157
  end
127
158
  end
128
159
  hydra.run
160
+ unless fetch_images_errors.empty?
161
+ puts "\nErrors downloading images:"
162
+ puts fetch_images_errors
163
+ end
129
164
 
130
165
  current_state :images
131
166
  end
@@ -171,10 +206,10 @@ module MangaDownloadr
171
206
  File.open("/tmp/#{obj.manga_name}.yaml", 'w') {|f| f.write(YAML::dump(obj)) }
172
207
  end
173
208
 
174
- def create(root_url, manga_name, options = {})
209
+ def create(root_url, manga_name, manga_root, options = {})
175
210
  dump_file_name = "/tmp/#{manga_name}.yaml"
176
211
  return YAML::load(File.read(dump_file_name)) if File.exists?(dump_file_name)
177
- MangaDownloadr::Workflow.new(root_url, manga_name, options)
212
+ MangaDownloadr::Workflow.new(root_url, manga_name, manga_root, options)
178
213
  end
179
214
  end
180
215
  end
@@ -1,3 +1,3 @@
1
1
  module MangaDownloadr
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.3"
3
3
  end
@@ -0,0 +1,40 @@
1
+ # original source: https://gist.github.com/kunalmodi/2939288
2
+ module RetryableTyphoeus
3
+ DEFAULT_RETRIES = 1
4
+
5
+ module RequestExtension
6
+ def original_on_complete=(proc)
7
+ @original_on_complete = proc
8
+ end
9
+
10
+ def original_on_complete
11
+ @original_on_complete
12
+ end
13
+
14
+ def retries=(retries)
15
+ @retries = retries
16
+ end
17
+
18
+ def retries
19
+ @retries ||= 0
20
+ end
21
+ end
22
+
23
+ module HydraExtension
24
+ def queue_with_retry(request, opts = {})
25
+ request.retries = (opts[:retries] || RetryableTyphoeus::DEFAULT_RETRIES).to_i
26
+ request.original_on_complete ||= request.on_complete
27
+ request.on_complete do |response|
28
+ if response.success? || response.request.retries <= 0
29
+ request.original_on_complete.map do |callback|
30
+ response.handled_response = callback.call(response)
31
+ end
32
+ else
33
+ response.request.retries -= 1
34
+ queue response.request
35
+ end
36
+ end
37
+ queue request
38
+ end
39
+ end
40
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manga-downloadr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - AkitaOnRails
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-19 00:00:00.000000000 Z
11
+ date: 2014-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -133,6 +133,7 @@ files:
133
133
  - bin/manga-downloadr
134
134
  - lib/manga-downloadr/version.rb
135
135
  - lib/manga-downloadr.rb
136
+ - lib/retryable_typhoeus.rb
136
137
  - README.md
137
138
  - LICENSE.txt
138
139
  homepage: http://github.com/akitaonrails/manga-downloadr