Class: KindleManager::BooksAdapter

Inherits:
BaseAdapter show all
Defined in:
lib/kindle_manager/adapters/books_adapter.rb

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

Constructor Details

This class inherits a constructor from KindleManager::BaseAdapter

Instance Method Details

#fetchObject



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_intervalObject



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_pageObject



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_myx')
    if session.first('.navHeader_myx')
      log "Page found '#{session.first('.navHeader_myx').text}'"
      break
    else
      
    end
  end
end

#has_more_button?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 76

def has_more_button?
  !!show_more_button
end

#loadObject



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_listObject



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

Returns:

  • (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_booksObject



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_offsetObject



72
73
74
# File 'lib/kindle_manager/adapters/books_adapter.rb', line 72

def page_scroll_offset
  session.evaluate_script('window.pageYOffset')
end

#show_more_buttonObject



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_pageObject



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