Class: IsbnDb
Overview
NOT recommended anymore, jrochkind has found IsbnDb to be pretty flaky, and hard to deal with. See book_finder.rb or all_books_dot_com.rb as alternatives.
Talks to the ISBNDb (isbndb.com) to get pricing info and links to pricing info for online sellers. There are potentially other services we could make use of there in the future too.
By default makes an API request in advance to check if book is available, and thus requires an API key. However, ISBNdb seems no longer as reliable as it once was there. You may not want to use ISBNdb at all, see AllBooksDotCom as an alternative (although with no pre-check for hits.)
jrochkind talked to the operators of isbndb and got a very high traffic limit (instead of the default free 500 requests/day), for free. You could try the same.
config params in services.yml:
access_key:  Your API access key from isbnDB.
display_text: (Optional) name of link.
timeout:  (Optional) seconds to wait for response
display_name: (Optional) what to call the service in display
Constant Summary
Constants inherited from Service
Service::LinkOutFilterTask, Service::StandardTask
Instance Attribute Summary
Attributes inherited from Service
#group, #name, #priority, #request, #service_id, #status, #task, #url
Instance Method Summary collapse
- #do_request(isbn) ⇒ Object
- 
  
    
      #get_prices_link(book_data)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Pass in nokogiri object representing the <BookData> element. 
- #handle(umlaut_request) ⇒ Object
- 
  
    
      #initialize(config)  ⇒ IsbnDb 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of IsbnDb. 
- #service_types_generated ⇒ Object
Methods inherited from Service
#credits, #display_name, #handle_wrapper, #link_out_filter, #preempted_by, required_config_params, #response_url, #translate
Constructor Details
#initialize(config) ⇒ IsbnDb
Returns a new instance of IsbnDb.
| 32 33 34 35 36 37 38 39 40 41 42 | # File 'app/service_adaptors/isbn_db.rb', line 32 def initialize(config) @timeout = 3 @display_text = "Compare online prices" @display_name = "ISBNdb.com" @credits = { "ISBNdb" => "http://isbndb.com/" } super(config) end | 
Instance Method Details
#do_request(isbn) ⇒ Object
| 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | # File 'app/service_adaptors/isbn_db.rb', line 70 def do_request(isbn) host = "isbndb.com" # including results=details will prime isbndb to refresh pricing, Andrew tells me. path = "/api/books.xml?access_key=#{@access_key}&results=details,prices&index1=isbn&value1=#{isbn}" http = Net::HTTP.new( host ) http.open_timeout = @timeout http.read_timeout = @timeout response = http.get( path ) # raise if not 200 OK response response.value return response end | 
#get_prices_link(book_data) ⇒ Object
Pass in nokogiri object representing the <BookData> element. passes back string url of isbndb prices/availability page
| 88 89 90 91 92 | # File 'app/service_adaptors/isbn_db.rb', line 88 def get_prices_link( book_data ) book_id = book_data.attributes['book_id'] return (book_id) ? "http://isbndb.com/d/book/#{book_id}/prices.html" : nil end | 
#handle(umlaut_request) ⇒ Object
| 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # File 'app/service_adaptors/isbn_db.rb', line 44 def handle(umlaut_request) isbn = umlaut_request.referent.['isbn'] # No isbn, nothing we can do. return umlaut_request.dispatched(self, true) if isbn.blank? response = do_request(isbn) xml = Nokogiri::XML( response.body ) book_xml = xml.at('ISBNdb/BookList/BookData') # No hits? return umlaut_request.dispatched(self, true) if book_xml.blank? prices_link = get_prices_link( book_xml ) umlaut_request.add_service_response( :service=>self, :url=> prices_link, :display_text=> @display_text, :service_type_value => ServiceTypeValue[:highlighted_link] ) return umlaut_request.dispatched(self, true) end | 
#service_types_generated ⇒ Object
| 28 29 30 | # File 'app/service_adaptors/isbn_db.rb', line 28 def service_types_generated return [ServiceTypeValue['highlighted_link']] end |