Sha256: 08960f3f72fd6d94367ff9eadb66b89b63fd055b346707caf3c56c462453f714

Contents?: true

Size: 1.58 KB

Versions: 2

Compression:

Stored size: 1.58 KB

Contents

module KindleHighlights
  class Book
    attr_accessor :asin, :author, :title

    def self.from_html_elements(html_element:, mechanize_agent:)
      new(
        mechanize_agent: mechanize_agent,
        asin: html_element.attributes["id"].value.squish,
        title: html_element.children.search("h2").first.text.squish,
        author: html_element.children.search("p").first.text.split(":").last.strip.squish
      )
    end

    def initialize(asin:, author:, title:, mechanize_agent: nil)
      @asin = asin
      @author = author
      @title = title
      @mechanize_agent = mechanize_agent
    end

    def to_s
      "#{title} by #{author}"
    end

    def inspect
      "<#{self.class}: #{inspectable_vars}>"
    end

    def highlights_from_amazon
      return [] unless mechanize_agent.present?

      @highlights ||= fetch_highlights_from_amazon
    end

    private

    attr_reader :mechanize_agent

    def fetch_highlights_from_amazon
      mechanize_agent
        .get("https://read.amazon.com/kp/notebook?captcha_verified=1&asin=#{asin}&contentLimitState=&")
        .search("div#kp-notebook-annotations")
        .children
        .select { |child| child.name == "div" }
        .select { |child| child.children.search("div.kp-notebook-highlight").first.present? }
        .map    { |html_elements| Highlight.from_html_elements(book: self, html_elements: html_elements) }
    end

    def inspectable_vars
      instance_variables
        .select { |ivar| ivar != :@mechanize_agent }
        .map    { |ivar| "#{ivar}=#{instance_variable_get(ivar).inspect}" }
        .join(", ")
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
kindle-highlights-2.0.1 lib/kindle_highlights/book.rb
kindle-highlights-2.0.0 lib/kindle_highlights/book.rb