bookscan 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ Jeweler::Tasks.new do |gem|
16
16
  gem.homepage = "http://github.com/tumf/bookscan"
17
17
  gem.license = "MIT"
18
18
  gem.summary = %Q{BookScan Scraper}
19
- gem.description = %Q{This is a scraper of BookScan (http://www.bookscan.co.jp/) Service.This is *NOT* a official software of BookScan.}
19
+ gem.description = %Q{This is a scraper of Bookscan (http://www.bookscan.co.jp) Service.This is *NOT* a official software of Bookscan.}
20
20
  gem.email = "y.takahara@gmail.com"
21
21
  gem.authors = ["Yoshihiro TAKAHARA"]
22
22
  # Include your dependencies below. Runtime dependencies are required when using your gem,
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/bookscan.gemspec CHANGED
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bookscan}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Yoshihiro TAKAHARA"]
12
12
  s.date = %q{2011-01-18}
13
13
  s.default_executable = %q{bookscan}
14
- s.description = %q{This is a scraper of BookScan (http://www.bookscan.co.jp/) Service.This is *NOT* a official software of BookScan.}
14
+ s.description = %q{This is a scraper of Bookscan (http://www.bookscan.co.jp) Service.This is *NOT* a official software of Bookscan.}
15
15
  s.email = %q{y.takahara@gmail.com}
16
16
  s.executables = ["bookscan"]
17
17
  s.extra_rdoc_files = [
data/lib/bookscan.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  module Bookscan
3
3
  BSURL = "http://system.bookscan.co.jp"
4
- TUNE_TYPES = ["ipad","iphone","kindle3","kindledx","android","sonyreader","nook","jpg"]
5
- TUNED_PATTERN = /((iphone|ipad|kindle3|kindledx|android|sonyreader|nook|jpg)_([^>%]*\.pdf))/
4
+ TUNE_TYPES = ["ipad","iphone4","kindle3","kindledx","android","sonyreader","nook","jpg"]
5
+ TUNED_PATTERN = /((iphone4|ipad|kindle3|kindledx|android|sonyreader|nook|jpg)_([^>%]*\.pdf))/
6
6
  end
@@ -64,19 +64,35 @@ module Bookscan
64
64
  bs
65
65
  end
66
66
 
67
- def tune book,type
68
- getr(book.group_url)
69
- page.search("a[@class=downloading]").each do |u|
70
- if u.text == "変換" and
71
- /_#{book.isbn}/ =~ u.attributes["href"].value.to_s
72
- click(u)
73
- page.forms.first["optimize_type"] = type;
74
- page.forms.first["cover_flg"] = "1";
75
- page.forms.first.submit
76
- puts "tune %s " % [book.title]
77
- return true
78
- end
67
+ def tuning?(book,type)
68
+ @tuning = tuning unless @tuning
69
+ @tuning.each { |b|
70
+ return true if b.title == type+"_"+book.title
71
+ }
72
+ false
73
+ end
74
+
75
+ def tune(book,type,is_premium = true)
76
+ if is_premium
77
+ max_queue = 10
78
+ else
79
+ max_queue = 1
79
80
  end
81
+
82
+ @tuning = tuning unless @tuning
83
+ # チューニングいっぱい
84
+ raise "tune queue is full" if @tuning.length >= max_queue
85
+ # チューニング
86
+ return false if tuning?(book,type)
87
+ # tune
88
+ getr(book.tune_url)
89
+ page.forms.first["optimize_type"] = type;
90
+ page.forms.first["cover_flg"] = "1";
91
+ page.forms.first.submit
92
+ tuned = book.clone
93
+ tuned.title = type +"_"+book.title
94
+ @tuning << tuned
95
+ tuned
80
96
  end
81
97
 
82
98
  def groups
@@ -131,7 +147,7 @@ module Bookscan
131
147
  book.title = u.text.to_s
132
148
  book.url = u.attributes["href"].value.to_s
133
149
  book.group_url = url
134
- books[book.isbn] = book
150
+ books[book.book_id] = book
135
151
  end
136
152
  end
137
153
  books
data/lib/bookscan/book.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- coding: utf-8 -*-
3
3
  require 'digest/md5'
4
+ require 'uri'
4
5
  require 'rubygems'
5
6
  require 'mutter'
6
7
 
@@ -14,7 +15,7 @@ module Bookscan
14
15
  end
15
16
 
16
17
  each do |b|
17
- table << [b.id,b.title]
18
+ table << [b.book_id,b.title]
18
19
  end
19
20
  table.to_s if length > 0
20
21
  end
@@ -22,20 +23,20 @@ module Bookscan
22
23
  def ids
23
24
  a = Array.new
24
25
  each do |b|
25
- a << b.id
26
+ a << b.book_id
26
27
  end
27
28
  a
28
29
  end
29
30
 
30
31
  def by_id(book_id)
31
32
  each do |b|
32
- return b if b.id == book_id
33
+ return b if b.book_id == book_id
33
34
  end
34
35
  end
35
36
 
36
37
  def has?(book_id)
37
38
  each do |b|
38
- return true if b.id == book_id
39
+ return true if b.book_id == book_id
39
40
  end
40
41
  false
41
42
  end
@@ -43,6 +44,15 @@ module Bookscan
43
44
 
44
45
  class Book
45
46
  attr_accessor :url,:title,:group_url
47
+ def tune_url
48
+ "/bookoptimize.php?hash=%s&d=%s&filename=%s" % [hash,d,URI.encode(@title)]
49
+ end
50
+ def d
51
+ return $1 if /.*download.php\?d=([^&]+)/ =~ @url
52
+ end
53
+ def hash
54
+ return $1 if /.*bookdetail.php\?hash=(.*)/ =~ @group_url
55
+ end
46
56
 
47
57
  def to_s
48
58
  @title
@@ -51,7 +61,7 @@ module Bookscan
51
61
  def filename
52
62
  return @title if isbn
53
63
  if /(.*)\.pdf$/ =~ @title
54
- return $1 + "_" + id + ".pdf"
64
+ return $1 + "_" + book_id + ".pdf"
55
65
  end
56
66
  raise "Can't make filename"
57
67
  end
@@ -68,7 +78,7 @@ module Bookscan
68
78
  return $1 if /_([0-9a-zA-Z]+)\.pdf$/ =~ @title
69
79
  end
70
80
 
71
- def id
81
+ def book_id
72
82
  return isbn if isbn
73
83
  title = @title
74
84
  if TUNED_PATTERN =~ title
@@ -22,9 +22,21 @@ module Bookscan
22
22
  ts
23
23
  end
24
24
 
25
- def books(group)
26
- groups.each do |g|
27
- return g.books if g.hash == group.hash
25
+ def tuned?(book,type)
26
+ tuned.has?(book.book_id) and tuned.by_id(book.book_id).tune_type == type
27
+ end
28
+
29
+ def books(group = nil)
30
+ if group
31
+ groups.each do |g|
32
+ return g.books if g.hash == group.hash
33
+ end
34
+ else
35
+ bs = Books.new
36
+ groups.each do |g|
37
+ bs += g.books
38
+ end
39
+ bs
28
40
  end
29
41
  end
30
42
 
@@ -172,6 +172,7 @@ module Bookscan
172
172
  directory = "."
173
173
  hash = nil
174
174
  type = nil
175
+ dry_run = false
175
176
  opt.on('-d DIR','--directory=DIR', 'download directory') do |v|
176
177
  directory = v
177
178
  end
@@ -181,31 +182,59 @@ module Bookscan
181
182
  opt.on('-t TYPE','--tuned=TYPE', 'download tuned') do |v|
182
183
  type = v
183
184
  end
185
+ opt.on('--dry-run', 'dry-run mode') do |v|
186
+ dry_run = true
187
+ end
184
188
  opt.parse!(@command_options)
185
189
  book_id = @command_options.shift
186
- if type
187
- book = ask_tuned_book_id(book_id,type)
190
+
191
+ if book_id == "all"
192
+ if type
193
+ bs = @cache.tuned
194
+ else
195
+ bs = @cache.books
196
+ end
197
+ bs.each { |book|
198
+ if Dir.glob(directory + "/**/*" + book.book_id + "*.pdf").length == 0
199
+ path = directory + "/" +book.filename
200
+ puts "download: " + path
201
+ unless dry_run
202
+ start
203
+ @agent.download(book.url,path)
204
+ end
205
+ end
206
+ }
188
207
  else
189
- book = ask_book_id(book_id,hash)
208
+ if type
209
+ book = ask_tuned_book_id(book_id,type)
210
+ else
211
+ book = ask_book_id(book_id,hash)
212
+ end
213
+
214
+ # download
215
+ path = directory + "/" +book.filename
216
+ puts "download: " + path
217
+ unless dry_run
218
+ start
219
+ @agent.download(book.url,path)
220
+ end
190
221
  end
191
222
 
192
- # download
193
- start
194
- path = directory + "/" +book.filename
195
- puts "download: " + path
196
- @agent.download(book.url,path)
197
223
  end
198
224
 
199
225
  def tune
200
226
  opt = OptionParser.new
201
227
  hash = nil
228
+ dry_run = false
202
229
  opt.on('-g HASH','--group=HASH', 'group hash') do |v|
203
230
  hash = v
204
231
  end
232
+ opt.on('--dry-run', 'dry-run mode') do |v|
233
+ dry_run = true
234
+ end
205
235
  opt.parse!(@command_options)
206
236
  book_id = @command_options.shift
207
237
  type = @command_options.shift
208
- book = ask_book_id(book_id,hash)
209
238
  unless type
210
239
  type = ask('Enter tune type: ',TUNE_TYPES) do |q|
211
240
  q.validate = /\w+/
@@ -213,10 +242,27 @@ module Bookscan
213
242
  end
214
243
  end
215
244
 
216
- # tune
217
- start
218
- @agent.tuning
219
- @agent.tune(book,type)
245
+ if book_id == "all"
246
+ tuned = @cache.tuned
247
+ bs = @cache.books
248
+ bs.each { |book|
249
+ unless @cache.tuned?(book,type)
250
+ # tune
251
+ unless dry_run
252
+ start
253
+ end
254
+ puts "tune for %s: %s" % [type, book.title] if dry_run or @agent.tune(book,type)
255
+ end
256
+ }
257
+ else
258
+ book = ask_book_id(book_id,hash)
259
+ # tune
260
+ puts "tune for %s: %s" % [type, book.title]
261
+ unless dry_run
262
+ start
263
+ @agent.tune(book,type)
264
+ end
265
+ end
220
266
  end
221
267
 
222
268
  def tuning
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookscan
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 3
10
- version: 0.1.3
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Yoshihiro TAKAHARA
@@ -138,7 +138,7 @@ dependencies:
138
138
  requirement: *id008
139
139
  prerelease: false
140
140
  name: highline
141
- description: This is a scraper of BookScan (http://www.bookscan.co.jp/) Service.This is *NOT* a official software of BookScan.
141
+ description: This is a scraper of Bookscan (http://www.bookscan.co.jp) Service.This is *NOT* a official software of Bookscan.
142
142
  email: y.takahara@gmail.com
143
143
  executables:
144
144
  - bookscan