epub_book 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/epub_book.gemspec +7 -6
- data/lib/epub_book/book.rb +37 -30
- data/lib/epub_book/loggable.rb +68 -0
- data/lib/epub_book/version.rb +1 -1
- data/lib/epub_book.rb +5 -1
- metadata +29 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a69bb745d60d25bdb4eeb2b6a6dcc2b0d115b4e
|
4
|
+
data.tar.gz: 86a99f95e8a35e0fa12163c784eb2cfe56aad574
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1d24a611b214d0f4a37d8f0c67bf0285095a1c8f51f87b6c747b019ae70345eba11189962b1e42300e0570fe96aa22c59fde873a8e10563fa7a23102c422518
|
7
|
+
data.tar.gz: 6a2f053ca97e68a5db5e83278d171a82bab14e2fb51a2399ae2889c1e45e95ac62f539858a4430640c9c9d04ccbe74fd105b6b559fcdb8efb83b695e37b5937d
|
data/epub_book.gemspec
CHANGED
@@ -27,15 +27,16 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
|
30
|
-
spec.add_dependency '
|
31
|
-
spec.add_dependency '
|
32
|
-
spec.add_dependency '
|
33
|
-
spec.add_dependency '
|
30
|
+
spec.add_dependency 'http','~> 0'
|
31
|
+
spec.add_dependency 'nokogiri','~> 0'
|
32
|
+
spec.add_dependency 'eeepub','~> 0'
|
33
|
+
spec.add_dependency 'zip-zip','~> 0'
|
34
|
+
spec.add_dependency 'mail','~> 0'
|
34
35
|
|
35
36
|
|
36
37
|
spec.add_development_dependency "bundler", "~> 1.12"
|
37
38
|
spec.add_development_dependency "rake", "~> 10.0"
|
38
39
|
spec.add_development_dependency "rspec", "~> 3.0"
|
39
|
-
spec.add_development_dependency "pry"
|
40
|
-
spec.add_development_dependency "pry-doc"
|
40
|
+
spec.add_development_dependency "pry",'~> 0'
|
41
|
+
spec.add_development_dependency "pry-doc",'~> 0'
|
41
42
|
end
|
data/lib/epub_book/book.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'http'
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'eeepub'
|
4
4
|
require 'base64'
|
@@ -21,8 +21,7 @@ module EpubBook
|
|
21
21
|
class Book
|
22
22
|
UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36"
|
23
23
|
Referer = "http://www.baidu.com/"
|
24
|
-
attr_accessor :title_css, :index_item_css, :body_css, :limit, :item_attr, :page_css, :page_attr,:cover
|
25
|
-
attr_accessor :cover_css, :description_css,:path,:user_agent,:referer,:creator,:mail_to
|
24
|
+
attr_accessor :title_css, :index_item_css, :body_css, :limit, :item_attr, :page_css, :page_attr,:cover,:cover_css, :description_css,:path,:user_agent,:referer,:creator,:mail_to, :folder_name,:des_url
|
26
25
|
|
27
26
|
|
28
27
|
Reg = /<script.*?>.*?<\/script>/m
|
@@ -40,21 +39,24 @@ module EpubBook
|
|
40
39
|
@body_css = '.articlebody'
|
41
40
|
@item_attr = "href"
|
42
41
|
yield self if block_given?
|
43
|
-
@book_path = File.join((@path || `pwd`.strip), @folder_name)
|
44
42
|
end
|
45
43
|
|
44
|
+
def book_path
|
45
|
+
@book_path ||= File.join((@path || `pwd`.strip), @folder_name)
|
46
|
+
end
|
46
47
|
|
47
48
|
def link_host
|
48
49
|
@link_host ||= @index_url[/\A(http:\/\/.*?)\/\w+/,1]
|
49
50
|
end
|
50
51
|
|
51
52
|
def book
|
52
|
-
|
53
|
-
|
53
|
+
return @book if @book
|
54
|
+
Dir.mkdir(book_path) unless test(?d,book_path)
|
55
|
+
@book = test(?s,File.join(book_path,'index.yml')) ? YAML.load(File.open(File.join(book_path,'index.yml'))) : {files: []}
|
54
56
|
end
|
55
57
|
|
56
58
|
def save_book
|
57
|
-
File.open(File.join(
|
59
|
+
File.open(File.join(book_path,'index.yml' ),'w') do |f|
|
58
60
|
f.write(@book.to_yaml)
|
59
61
|
end
|
60
62
|
end
|
@@ -66,7 +68,7 @@ module EpubBook
|
|
66
68
|
fetch_book
|
67
69
|
if !@cover_css && @cover
|
68
70
|
generate_cover = <<-eof
|
69
|
-
convert #{File.expand_path("../../../#{@cover}",__FILE__)} -font tsxc.ttf -gravity center -fill red -pointsize 16 -draw "text 0,0 '#{book[:title]}'" #{File.join(
|
71
|
+
convert #{File.expand_path("../../../#{@cover}",__FILE__)} -font tsxc.ttf -gravity center -fill red -pointsize 16 -draw "text 0,0 '#{book[:title]}'" #{File.join(book_path,@cover)}
|
70
72
|
eof
|
71
73
|
system(generate_cover)
|
72
74
|
end
|
@@ -84,47 +86,53 @@ module EpubBook
|
|
84
86
|
epub.description book[:description] if book[:description]
|
85
87
|
|
86
88
|
book[:files] = book[:files][0...limit] if limit
|
89
|
+
_files = []
|
90
|
+
book[:files].collect! do |item|
|
91
|
+
_file = File.join(book_path,item[:content])
|
92
|
+
if test(?f, _file)
|
93
|
+
_files.push(_file)
|
94
|
+
item
|
95
|
+
end
|
96
|
+
end
|
97
|
+
book[:files].compact!
|
87
98
|
|
88
|
-
epub.files
|
99
|
+
epub.files _files.push(File.join(book_path,@cover))
|
89
100
|
epub.nav book[:files]
|
90
101
|
|
102
|
+
book[:epub_file] = File.join(book_path,"#{book_name || @folder_name}.epub")
|
91
103
|
|
92
|
-
|
104
|
+
yield self if block_given?
|
93
105
|
|
94
|
-
epub.save(epub_file)
|
106
|
+
epub.save(book[:epub_file])
|
95
107
|
|
96
108
|
#send mail
|
97
|
-
|
109
|
+
|
98
110
|
if mail_to
|
99
111
|
mailer = Mailer.new
|
100
112
|
mailer.to = mail_to
|
101
|
-
mailer.add_file epub_file
|
113
|
+
mailer.add_file book[:epub_file]
|
102
114
|
mailer.body = "您创建的电子书[#{book[:title]}]见附件\n"
|
103
|
-
|
104
115
|
mailer.send_mail
|
105
116
|
end
|
106
117
|
|
107
118
|
end
|
108
119
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
120
|
#得到书目索引
|
113
121
|
def fetch_index(url=nil)
|
122
|
+
book[:files] = []
|
114
123
|
url ||= @index_url
|
115
|
-
doc = Nokogiri::HTML(judge_encoding(
|
124
|
+
doc = Nokogiri::HTML(judge_encoding(HTTP.headers("User-Agent" => @user_agent ,'Referer'=> @referer).get(URI.encode(url)).to_s))
|
116
125
|
#generate index.yml
|
117
126
|
|
118
127
|
if !book[:title]
|
119
128
|
doc1 = if @des_url.nil?
|
120
129
|
doc
|
121
130
|
else
|
122
|
-
Nokogiri::HTML(judge_encoding(
|
131
|
+
Nokogiri::HTML(judge_encoding(HTTP.headers("User-Agent" => @user_agent ,'Referer'=> @referer).get(URI.encode(generate_abs_url(doc.css(@des_url).attr("href").to_s))).to_s))
|
123
132
|
end
|
124
133
|
get_des(doc1)
|
125
134
|
end
|
126
135
|
|
127
|
-
|
128
136
|
doc.css(@index_item_css).each do |item|
|
129
137
|
_href = URI.encode(item.attr(@item_attr).to_s)
|
130
138
|
next if _href.start_with?('javascript') || _href.start_with?('#')
|
@@ -151,28 +159,26 @@ module EpubBook
|
|
151
159
|
|
152
160
|
def fetch_book
|
153
161
|
#重新得到书目,如果不存在或重新索引的话
|
154
|
-
fetch_index if !test(?s,File.join(
|
162
|
+
fetch_index if !test(?s,File.join(book_path,'index.yml'))
|
163
|
+
EpubBook.logger.info "------Fetch book----------"
|
155
164
|
book[:files].each_with_index do |item,index|
|
156
165
|
break if limit && index >= limit
|
157
166
|
|
158
|
-
content_path = File.join(
|
167
|
+
content_path = File.join(book_path,item[:content])
|
159
168
|
|
160
169
|
#如果文件存在且长度不为0则获取下一个
|
161
170
|
next if test(?s,content_path)
|
162
171
|
|
163
172
|
begin
|
164
|
-
doc_file = Nokogiri::HTML(judge_encoding(
|
173
|
+
doc_file = Nokogiri::HTML(judge_encoding(HTTP.headers("User-Agent" => @user_agent,'Referer'=> @referer).get(item[:url]).to_s))
|
165
174
|
|
166
175
|
File.open(content_path,'w') do |f|
|
167
176
|
f.write("<h3>#{item[:label]}</h3>")
|
168
177
|
f.write(doc_file.css(@body_css).to_s.gsub(Reg,''))
|
169
178
|
end
|
170
|
-
|
171
|
-
puts item[:label]
|
172
|
-
|
173
179
|
rescue Exception => e
|
174
|
-
|
175
|
-
|
180
|
+
EpubBook.logger.info "Error:#{e.message},#{item.inspect}"
|
181
|
+
#EpubBook.logger.info e.backtrace
|
176
182
|
next
|
177
183
|
end
|
178
184
|
end
|
@@ -183,8 +189,9 @@ module EpubBook
|
|
183
189
|
private
|
184
190
|
#is valid encoding
|
185
191
|
def judge_encoding(str)
|
192
|
+
/<meta.*?charset\s*=[\s\"\']?utf-8/i =~ str ? str : str.force_encoding('gbk').encode('utf-8',invalid: :replace, undef: :replace)
|
186
193
|
str.scrub! unless str.valid_encoding?
|
187
|
-
|
194
|
+
str
|
188
195
|
end
|
189
196
|
|
190
197
|
#得到书名,介绍,及封面
|
@@ -193,7 +200,7 @@ module EpubBook
|
|
193
200
|
if @cover_css && !book[:cover]
|
194
201
|
cover_url = doc.css(@cover_css).attr("src").to_s
|
195
202
|
cover_url = generate_abs_url(cover_url) #link_host + cover_url unless cover_url.start_with?("http")
|
196
|
-
cover_path = File.join(
|
203
|
+
cover_path = File.join(book_path,@cover)
|
197
204
|
system("curl #{cover_url} -o #{cover_path} ")
|
198
205
|
book[:cover] = cover_path
|
199
206
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module EpubBook
|
2
|
+
|
3
|
+
# Contains logging behaviour.
|
4
|
+
module Loggable
|
5
|
+
|
6
|
+
# Get the logger.
|
7
|
+
#
|
8
|
+
# @note Will try to grab Rails' logger first before creating a new logger
|
9
|
+
# with stdout.
|
10
|
+
#
|
11
|
+
# @example Get the logger.
|
12
|
+
# Loggable.logger
|
13
|
+
#
|
14
|
+
# @return [ Logger ] The logger.
|
15
|
+
#
|
16
|
+
# @since 3.0.0
|
17
|
+
def logger
|
18
|
+
return @logger if defined?(@logger)
|
19
|
+
@logger = rails_logger || default_logger
|
20
|
+
end
|
21
|
+
|
22
|
+
# Set the logger.
|
23
|
+
#
|
24
|
+
# @example Set the logger.
|
25
|
+
# Loggable.logger = Logger.new($stdout)
|
26
|
+
#
|
27
|
+
# @param [ Logger ] The logger to set.
|
28
|
+
#
|
29
|
+
# @return [ Logger ] The new logger.
|
30
|
+
#
|
31
|
+
# @since 3.0.0
|
32
|
+
def logger=(logger)
|
33
|
+
@logger = logger
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Gets the default EpubBook logger - stdout.
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
# @example Get the default logger.
|
43
|
+
# Loggable.default_logger
|
44
|
+
#
|
45
|
+
# @return [ Logger ] The default logger.
|
46
|
+
#
|
47
|
+
# @since 3.0.0
|
48
|
+
def default_logger
|
49
|
+
logger = Logger.new($stdout)
|
50
|
+
logger.level = EpubBook.config.log_level
|
51
|
+
logger
|
52
|
+
end
|
53
|
+
|
54
|
+
# Get the Rails logger if it's defined.
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
# @example Get Rails' logger.
|
59
|
+
# Loggable.rails_logger
|
60
|
+
#
|
61
|
+
# @return [ Logger ] The Rails logger.
|
62
|
+
#
|
63
|
+
# @since 3.0.0
|
64
|
+
def rails_logger
|
65
|
+
defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/epub_book/version.rb
CHANGED
data/lib/epub_book.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "epub_book/version"
|
2
2
|
require 'epub_book/book'
|
3
|
+
require 'epub_book/loggable'
|
3
4
|
require 'mail'
|
4
5
|
|
5
6
|
module EpubBook
|
@@ -7,15 +8,18 @@ module EpubBook
|
|
7
8
|
autoload :Book, "epub_book/book"
|
8
9
|
autoload :Mailer, "epub_book/mailer"
|
9
10
|
|
10
|
-
Config = Struct.new(:setting_file,:mail_from,:mail_subject,:mail_body,:mail_address,:mail_port,:mail_user_name,:mail_password) do
|
11
|
+
Config = Struct.new(:setting_file,:mail_from,:mail_subject,:mail_body,:mail_address,:mail_port,:mail_user_name,:mail_password,:log_level) do
|
11
12
|
include Singleton
|
12
13
|
def initialize
|
13
14
|
self.mail_subject = 'epub 电子书'
|
14
15
|
#self.mail_body = "您创建的电子书见附件\n"
|
15
16
|
self.mail_port = 25
|
17
|
+
self.log_level = "info"
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
21
|
+
extend Loggable
|
22
|
+
|
19
23
|
#book initialize, and the block will prior the yml setting
|
20
24
|
def self.create_book(url,bookname=nil,des_url=nil)
|
21
25
|
|
metadata
CHANGED
@@ -1,69 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epub_book
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- qmliu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: http
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: nokogiri
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
33
|
+
version: '0'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: eeepub
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - "
|
45
|
+
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '0'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: zip-zip
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '0'
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: mail
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0'
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
@@ -112,28 +126,28 @@ dependencies:
|
|
112
126
|
name: pry
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- - "
|
129
|
+
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
131
|
version: '0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- - "
|
136
|
+
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: pry-doc
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
|
-
- - "
|
143
|
+
- - "~>"
|
130
144
|
- !ruby/object:Gem::Version
|
131
145
|
version: '0'
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
|
-
- - "
|
150
|
+
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
153
|
description: 'create epub from a book index url and mail to you. by setting a default_setting.yml
|
@@ -160,6 +174,7 @@ files:
|
|
160
174
|
- exe/create_book
|
161
175
|
- lib/epub_book.rb
|
162
176
|
- lib/epub_book/book.rb
|
177
|
+
- lib/epub_book/loggable.rb
|
163
178
|
- lib/epub_book/mailer.rb
|
164
179
|
- lib/epub_book/version.rb
|
165
180
|
- tsxc.ttf
|