Class: KindleManager::BooksAdapter
Constant Summary
collapse
- URL_FOR_KINDLE_CONTENTS =
'https://www.amazon.co.jp/gp/digital/fiona/manage?ie=UTF8&ref_=nav_youraccount_myk'
Instance Attribute Summary
Attributes inherited from BaseAdapter
#options, #session, #store
Instance Method Summary
collapse
Methods inherited from BaseAdapter
#initialize, #limit, #max_scroll_attempts
Instance Method Details
#fetch ⇒ Object
5
6
7
8
9
10
11
12
13
14
15
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 5
def fetch
go_to_kindle_management_page
begin
load_next_kindle_list
rescue => e
puts "[ERROR] #{e}"
puts e.backtrace
puts
puts "Retry manually -> client.adapter.load_next_kindle_list or client.session etc."
end
end
|
#fetching_interval ⇒ Object
105
106
107
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 105
def fetching_interval
@options.fetch(:fetching_interval, 3)
end
|
#go_to_kindle_management_page ⇒ Object
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 17
def go_to_kindle_management_page
log "Visiting kindle management page"
3.times do
session.visit URL_FOR_KINDLE_CONTENTS
wait_for_selector('.navHeader_title_myx')
if session.has_css?('.navHeader_title_myx')
log "Page found '#{session.first('.navHeader_title_myx').text}'"
break
else
submit_signin_form
end
end
end
|
76
77
78
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 76
def has_more_button?
!!show_more_button
end
|
#load ⇒ Object
63
64
65
66
67
68
69
70
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 63
def load
books = []
store.list_html_files.each do |file|
parser = KindleManager::BooksParser.new(file)
books += parser.parse
end
books.sort_by{|b| [-b.date.to_time.to_i, -b.fetched_at.to_i] }.uniq(&:asin)
end
|
#load_next_kindle_list ⇒ Object
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 31
def load_next_kindle_list
wait_for_selector('.contentCount_myx')
current_loop = 0
last_page_scroll_offset = page_scroll_offset
while current_loop <= max_scroll_attempts
break if limit && limit < number_of_fetched_books
if has_more_button?
snapshot_page
current_loop = 0
log "Clicking 'Show More'"
session.execute_script "window.scrollBy(0,-800)"
show_more_button.click
sleep fetching_interval
else
log "Loading books with scrolling #{current_loop+1}"
session.execute_script "window.scrollBy(0,10000)"
end
sleep fetching_interval
if last_page_scroll_offset == page_scroll_offset
log "Stopping loading because 'page_scroll_offset' didn't change after a loop"
break
else
debug "last_page_scroll_offset:#{last_page_scroll_offset} new page_scroll_offset:#{page_scroll_offset}"
end
last_page_scroll_offset = page_scroll_offset
current_loop += 1
end
log "Stopped loading. You may want to resume with 'client.adapter.load_next_kindle_list'"
snapshot_page
end
|
#loading? ⇒ Boolean
93
94
95
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 93
def loading?
session.first('.myx-popover-loading-wrapper').present?
end
|
#number_of_fetched_books ⇒ Object
84
85
86
87
88
89
90
91
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 84
def number_of_fetched_books
re = (AmazonInfo.domain =~ /\.jp\z/ ? /(\d+)〜(\d+)/ : /(\d+) - (\d+)/)
wait_for_selector('.contentCount_myx')
text = doc.css('.contentCount_myx').text
m = text.match(re)
return m[2].to_i if m.present?
raise("Couldn't get the number of fetched books [#{text}]")
end
|
#page_scroll_offset ⇒ Object
72
73
74
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 72
def page_scroll_offset
session.evaluate_script('window.pageYOffset')
end
|
80
81
82
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 80
def show_more_button
session.all('.contentTableShowMore_myx').find{|e| e['outerHTML'].match(/cnt_shw_more/) }
end
|
#snapshot_page ⇒ Object
97
98
99
100
101
102
103
|
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 97
def snapshot_page
if (text = doc.css('.contentCount_myx').try!(:text)).present?
log "Current page [#{text.to_s.gsub(/[[:space:]]+/, ' ').strip}]"
end
store.record_page
log "Saving page"
end
|