From 1cd9633c7232e85a88cfba0c089302573c193e42 Mon Sep 17 00:00:00 2001 From: Jaswinder Singh Date: Wed, 25 Jul 2018 16:43:11 -0400 Subject: [PATCH] LP#1772680: Resolved multiple issues Signed-off-by: Jaswinder Singh Signed-off-by: Galen Charlton --- .../src/perlmods/live_t/101-ebookapi-rbdigital.t | 419 +++++++ .../opac/ebook_api/rbdigital/parts/item_parser.tt2 | 35 +- .../ebook_api/rbdigital/parts/result/table.tt2 | 62 +- .../opac/ebook_api/rbdigital/parts/searchbar.tt2 | 2 + .../src/templates/opac/parts/ebook_api/base_js.tt2 | 4 +- Open-ILS/src/templates/opac/parts/vendor_tabs.tt2 | 2 +- Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js | 2 + title-7-2.txt | 1284 ++++++++++++++++++++ 8 files changed, 1739 insertions(+), 71 deletions(-) create mode 100755 Open-ILS/src/perlmods/live_t/101-ebookapi-rbdigital.t create mode 100644 title-7-2.txt diff --git a/Open-ILS/src/perlmods/live_t/101-ebookapi-rbdigital.t b/Open-ILS/src/perlmods/live_t/101-ebookapi-rbdigital.t new file mode 100755 index 0000000000..0681d63132 --- /dev/null +++ b/Open-ILS/src/perlmods/live_t/101-ebookapi-rbdigital.t @@ -0,0 +1,419 @@ +#!perl + +use Test::More tests => 8; + +diag("Tests Ebook API: RBDigital Books"); + +use strict; use warnings; + +use OpenILS::Application::EbookAPI; +use OpenSRF::AppSession; +use OpenILS::Utils::CStoreEditor qw/:funcs/; +use OpenILS::Utils::TestUtils; +use Scalar::Util 'blessed'; +use Data::Dumper; +use JSON; + +# ------------------------------------------------------------ +# 1. Set up test environment. +# ------------------------------------------------------------ + +use constant EBOOK_API_VENDOR => 'rbdigital'; +use constant EBOOK_API_OU => 1; + +# Patrons. +use constant EBOOK_API_PATRON_USERNAME => 'egadmin'; +use constant EBOOK_API_PATRON_PASSWORD => 'password'; +use constant BARCODE => 'e29bc74e9d13243c861c1d209e9a2e20'; + +my $script = OpenILS::Utils::TestUtils->new(); +$script->bootstrap; + +# Authenticate the user +$script->authenticate({ + username => EBOOK_API_PATRON_USERNAME, + password => EBOOK_API_PATRON_PASSWORD, + type => 'opac'}); + +my $authtoken = $script->authtoken; + +my $editor = $script->editor(authtoken=>$script->authtoken); +$editor->xact_begin; + +ok( + $authtoken, + 'Have an authtoken' +); + +print "User Authenticated: Auth Token: $authtoken\n"; + +is( + $script->authtime, + #14400, + 420, + 'Default authtime for staff login is 7200 seconds. 14400 seconds are equal to 4 hours' +); + +my $cached_obj = $script->cache()->get_cache("oils_auth_$authtoken"); + +ok( + ref $cached_obj, + 'Can retrieve authtoken from memcached' +); + +# Create an instance of EbookAPI +my $ebook_api = $script->session('open-ils.ebook_api'); + +# ------------------------------------------------------------ +# 2. Sessions. +# ------------------------------------------------------------ + +# Initiate a new EbookAPI session and get a session ID. +# Returns undef unless a new session was created. +my $session_id_req = $ebook_api->request( + 'open-ils.ebook_api.start_session', EBOOK_API_VENDOR, EBOOK_API_OU); +my $session_id = $session_id_req->recv->content; +ok($session_id, 'Initiated an EbookAPI session: '.$session_id); + +# Check that an EbookAPI session exists matching our session ID. +my $ck_session_id_req = $ebook_api->request( + 'open-ils.ebook_api.check_session', $session_id, EBOOK_API_VENDOR, EBOOK_API_OU); +my $ck_session_id = $ck_session_id_req->recv->content; +ok($ck_session_id eq $session_id, 'Validated existing EbookAPI session'); +my $isbn = '9781508252573'; + +# my $get_details_req = $ebook_api->request('open-ils.ebook_api.title.details', $session_id, $isbn); +# print Dumper($get_details_req->recv->content); + +# my $register_patron_req = $ebook_api->request('open-ils.ebook_api.register_patron', +# $authtoken, $session_id); + +# print Dumper($register_patron_req->recv); + +my $pcrud = OpenSRF::AppSession->create('open-ils.pcrud'); +$pcrud->connect(); + +# my $evergreen_textsearch_field_req = $pcrud->request('open-ils.pcrud.search.cmc.atomic',"ANONYMOUS", +# { +# name => {'!=' => undef} +# }, +# { +# flesh => 1, +# flesh_fields => { cmc => ['name','label']}, +# order_by => { cmc => 'name ASC' } +# } +# )->recv(); + +# print Dumper($evergreen_textsearch_field_req->content); + + +#CStore example +# my $cstore = OpenSRF::AppSession->create( 'open-ils.cstore' ); +# my $evergreen_textsearch_field_req = $cstore->request('open-ils.cstore.direct.config.metabib_class.search.atomic', +# { name => { "!=" => undef } }, +# { +# order_by => { cmc => 'name ASC' } +# } +# )->recv(); + +# print Dumper($evergreen_textsearch_field_req->content); + +#Save a record + my $xact; + +eval { + $xact = $pcrud->request( + 'open-ils.pcrud.transaction.begin', + $authtoken + )->gather(1); +}; + +if ($@) { + undef($xact); +} +# The rest depends on there being a transaction. +if ($xact) { + my $tmpl_rec = Fieldmapper::rbdigital::search_fields->new; + $tmpl_rec->digital_services_id(1); + $tmpl_rec->evergreen_field('mobile1'); + $tmpl_rec->digital_services_field('mobile2'); + + $pcrud->request('open-ils.pcrud.create.ebook_rsf', $authtoken, $tmpl_rec )->gather(1); + + $xact = $pcrud->request( + 'open-ils.pcrud.transaction.commit', + $authtoken + )->gather(1); + + print Dumper($xact); +} + +# my $mapped_search_field_req = $pcrud->request('open-ils.pcrud.search.ebook_rsf.atomic', "ANONYMOUS", +# { +# digital_services_id => 1 +# } +# )->recv(); + + +# my $vendor_key = 'rbdigital'; +# $pcrud = OpenSRF::AppSession->create('open-ils.pcrud'); +# $pcrud->connect(); + +# my $ctype = 'audience'; +# my $ccvm_req = $pcrud->request('open-ils.pcrud.search.ccvm.atomic', "ANONYMOUS", +# { +# opac_visible => 't', +# ctype => $ctype +# } + +# )->recv(); + +# print Dumper($ccvm_req->content); + +# my $eg_search_field = 'audience'; +# my $ds_search_field = 'audience'; +# my $ebook_rsf_req = $pcrud->request('open-ils.pcrud.search.ebook_rsf.atomic', "ANONYMOUS", +# { +# evergreen_field => $eg_search_field, +# digital_services_field => $ds_search_field +# } +# )->recv(); + +# # print Dumper($ebook_rsf_req->content->[0]->evergreen_field); +# if ($ebook_rsf_req && defined($ebook_rsf_req->content->[0]) ) { +# print "Duplicate entry found! Please try selecting different values"; +# } + +# Get Digital Services record based on vendo_key='rbdigital' +# my $digital_services_req = $pcrud->request('open-ils.pcrud.search.ebook_rds.atomic', "ANONYMOUS", +# { vendor_key => $vendor_key } +# )->recv(); +# if ($digital_services_req) { +# print Dumper($digital_services_req->content->[0]->id); +# } + +# Get RBDigital mapped field values bashed on search field id +# my $search_fields_mapping_req = $pcrud->request('open-ils.pcrud.search.ebook_rsfm.atomic', "ANONYMOUS", +# { +# search_fields_id => 1 +# } +# )->recv(); + + +# print Dumper($search_fields_mapping_req->content); + +# print scalar(@ {$search_fields_mapping_req->content}); + +# my $json = encode_json (\@{$search_fields_mapping_req->content}); +# print "$json"; + +# my @contents = $search_fields_mapping_req->content; + +# my @search_field_values = (); +# # Iterate over list of values and build an array for JS +# foreach my $value (@ {$search_fields_mapping_req->content}) { +# push @search_field_values, [$value->id, $value->search_fields_id, $value->evergreen_field_value, $value->digital_services_field_value]; +# } +# print Dumper([@search_field_values]); +# my $search_fields_id = 7; +# $pcrud->request('open-ils.pcrud.transaction.begin',$authtoken)->gather(1); + +# my $search_fields_req = $pcrud->request('open-ils.pcrud.delete.ebook_rsf', $authtoken, $search_fields_id)->recv(1); + +# $pcrud->request('open-ils.pcrud.transaction.commit',$authtoken)->gather(1); + +# print Dumper($digital_services_req->content); + +# my $user_card_req = $pcrud->request('open-ils.cstore.direct.actor.card.search', +# { barcode => BARCODE } +# )->gather(); + +# if ($user_card_req && defined ($user_card_req->usr)) { +# my $user_req = $pcrud->request('open-ils.cstore.direct.actor.user.search', +# { id => $user_card_req->usr } +# )->gather(); + +# print "User Registration: ". $user_req->email; +# } + + +# ------------------------------------------------------------ +# 3. Call Recorded Books API to fetch patron_id +# ------------------------------------------------------------ +my $get_patron_id_req = $ebook_api->request( + 'open-ils.ebook_api.get_patron_id', $authtoken, $session_id, 1); +my $patronid = $get_patron_id_req->recv->content; + +ok( + $patronid, + 'Patron ID Received: '.$patronid +); + +# ------------------------------------------------------------ +# 4. Check if the User is authrorized to rbdigital library +# ------------------------------------------------------------ + +# my $is_authorized_patron_req = $ebook_api->request( +# 'open-ils.ebook_api.is_authorized_patron', $authtoken, $session_id); + +# my $is_authorized_results = $is_authorized_patron_req->recv; +# print Dumper($is_authorized_results); + + +# ok( +# $is_authorized_results, +# 'Authorized Result: ' +# ); + +# my $pcrud = OpenSRF::AppSession->create('open-ils.pcrud'); +# $pcrud->connect(); + +# my $ebook_rdsa_req = $pcrud->request('open-ils.pcrud.search.ebook_rdsa.atomic', "ANONYMOUS", +# { +# #id => {">" => 0}, +# "+ebook_rl" => { +# home_ou => 1 +# }, +# "+ebook_rds" => { +# is_enabled => 't' +# } +# }, +# { +# flesh => 1, +# flesh_fields => { ebook_rdsa => ['digital_services_id']}, +# order_by => { ebook_rds => 'display_order ASC' }, +# join => { +# ebook_rds => {}, +# ebook_rl => {} +# } +# } +# )->gather(); +# print Dumper($ebook_rdsa_req); + +# my $ebook_rds_req = $pcrud->request('open-ils.pcrud.search.ebook_rds.atomic', "ANONYMOUS", +# { +# is_enabled => 't', +# "+ebook_rl" => { +# home_ou => 1 +# } +# }, +# { +# flesh => 1, +# flesh_fields => { ebook_rds => ['id']}, +# order_by => { ebook_rds => 'display_order ASC' }, +# join => { +# ebook_rdsa => {}, +# ebook_rdsa => { +# join => { +# ebook_rl => {} +# } +# } +# } +# } +# )->gather(); + +# print Dumper($ebook_rds_req); + +# Get vendor list +# my $patron_id = 1; +# my $get_vendors = $ebook_api->request( +# 'open-ils.ebook_api.get_vendors', $authtoken, $session_id); +# my $library_id_results = $get_vendors->recv->content; + +# foreach my $vendor (@$library_id_results) { +# foreach my $items (@$vendor) { +# print $items.' '; +# } +# print "\n"; +# print @$vendor[0]; +# } + + +#my $barcode = 'e29bc74e9d13243c861c1d209e9a2e20'; +# my $usr = OpenILS::Application::AppUtils->simplereq('open-ils.storage', "open-ils.storage.biblio.record_entry.retrieve_by_barcode", $barcode); +#my $usr = OpenILS::Application::AppUtils->simplereq('open-ils.actor', 'open-ils.actor.user.fleshed.retrieve_by_barcode', "$authtoken", $barcode); + +# my $new_user = 'jwiggins'; +# # Authenticate the user +# $script->authenticate({ +# username => $new_user, +# password => EBOOK_API_PATRON_PASSWORD, +# type => 'staff'}); + +# my $new_authtoken = $script->authtoken; +# $editor = $script->editor(authtoken=>$new_authtoken); +# $editor->xact_begin; +# $pcrud = OpenSRF::AppSession->create('open-ils.cstore'); +# $pcrud->connect(); + +# my $username = 'jwiggins'; +# my $postal_code = ''; +# print "EbookAPI: Checking if a user is found from db.\n"; +# my $user_req = $pcrud->request('open-ils.cstore.direct.actor.user.search', +# { usrname => $username } +# )->gather(); + +# print Dumper($user_req); + +# print "EbookAPI: User found on db.\n"; +# # Second, get the user postal_code information (if any) +# if ($user_req && defined ($user_req->mailing_address) ) { +# print "EbookAPI: Calling CStore to retreive user mailing address postal code: " . $user_req->mailing_address."\n"; +# #Get the mailing address id to retrieve postal code +# my $user_mailing_address_req = $pcrud->request('open-ils.cstore.direct.actor.user_address.search', +# { id => $user_req->mailing_address } +# )->gather(); + +# if ( $user_mailing_address_req && defined($user_mailing_address_req->post_code) ) { +# $postal_code = $user_mailing_address_req->post_code; +# print "EbookAPI: Postal code received: $postal_code\n"; +# } +# } else { +# #Log user not found, this should not happen since the user is already authenticated +# print "EbookAPI: Postal code not found in db for patron registration.\n"; +# } + + +# print "EbookAPI: Building a request for patron registration"; +# my $is_active = true; +# my $library_id = 3925; + +# my $request_content = { +# firstName => $user_req->first_given_name, +# lastName => $user_req->family_name, +# userName => $user_req->usrname, +# password => $user_req->usrname . _get_current_year(), +# email => $user_req->email, +# postalCode => $postal_code, +# isActive => $is_active, +# libraryId => $library_id +# }; + +# my $req = { +# method => 'POST', +# uri => "$base_uri/rpc/libraries/$library_id/patrons", +# content => OpenSRF::Utils::JSON->perl2JSON($request_content), +# headers => { +# 'Authorization' => 'Basic ' . $self->{basic_token}, +# 'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8' +# } +# }; + +# $logger->info("EbookAPI: Calling an API to registering Patron: $username"); +# my $res = $self->request($req, $session_id); +# if (defined ($res)) { +# if ($res->{content}->{patronId}) { +# $logger->info("EbookAPI: User $username successfully registered with RBDigital portal."); +# return $res->{content}->{patronId}; +# } else { +# $logger->error("EbookAPI: Registration for $username to RBDigital failed!"); +# } +# } + +$script->logout(); + +$cached_obj = $script->cache()->get_cache("oils_auth_$authtoken"); +ok( + ! $cached_obj, + 'Authtoken is removed from memcached after logout' +); \ No newline at end of file diff --git a/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/item_parser.tt2 b/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/item_parser.tt2 index 690e096041..09074c83e2 100755 --- a/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/item_parser.tt2 +++ b/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/item_parser.tt2 @@ -6,7 +6,7 @@ vendor_search_uri = '/ebook_api/rbdigital/results'; vendor_record_uri = '/ebook_api/rbdigital/record/'; - vendor_record_url = mkurl(ctx.opac_root _ vendor_record_uri _ ebook_record_item.isbn,{},['expand','summaryplus','recommendations']); + vendor_record_url = mkurl(ctx.opac_root _ vendor_record_uri _ ebook_record_item.isbn,{},[ 'detail_record_view', 'expand','summaryplus','recommendations']); ebook_item.title = ebook_record_item.title; ebook_item.isbn = ebook_record_item.isbn; @@ -14,6 +14,7 @@ ebook_item.shortDescription = ebook_record_item.shortDescription; ebook_item.language = ebook_record_item.language; ebook_item.authors = ""; + ebook_item.authors_name = ""; ebook_item.narrators = ""; ebook_item.genres = ""; ebook_item.series = ""; @@ -26,6 +27,7 @@ ebook_item.image_xxl_url = ''; ebook_item.mediaType = ''; ebook_item.authors_detail = ''; + ebook_item.narrators_detail = ""; # Check title is available for Checkout Service ebook_item.isAvailable = ebook_record_item.interest.isAvailable; @@ -34,13 +36,22 @@ FOREACH item IN ebook_record_item.authors; IF item.text != ''; author_search_url = ctx.opac_root _ vendor_search_uri _ '?' _ 'qtype=author&query=' _ item.text; + + ebook_item.authors = ebook_item.authors _ + '' _ item.text _ ''; + + #Keep author's name into a variable to be displayed on summary page + ebook_item.authors_name = ebook_item.authors_name _ item.text; + ebook_item.authors_detail = ebook_item.authors_detail _ - ''_ item.text _ ' (Author). '; - ebook_item.authors = ebook_item.authors _ item.text; + ''_ item.text _ ' (Author). '; + IF !loop.last(); ebook_item.authors = ebook_item.authors _ ", "; + ebook_item.authors_name = ebook_item.authors_name _ ", "; + #the detail is used inside a record (summary.tt2) ebook_item.authors_detail = ebook_item.authors_detail _ ", "; END; END; @@ -48,14 +59,18 @@ # Loop over Narrators array FOREACH item IN ebook_record_item.narrators; - author_search_url = ctx.opac_root _ vendor_search_uri _ '?' _ 'qtype=author&query=' _ item.text; - ebook_item.authors_detail = ebook_item.authors_detail _ + narrator_search_url = ctx.opac_root _ vendor_search_uri _ '?' _ 'qtype=narrator&query=' _ item.text; + ebook_item.narrators = ebook_item.narrators _ + '' _ item.text _ ''; + + ebook_item.narrators_detail = ebook_item.narrators_detail _ ''_ item.text _ ' (Narrator). '; - ebook_item.narrators = ebook_item.narrators _ item.text; + IF !loop.last(); ebook_item.narrators = ebook_item.narrators _ ", "; + ebook_item.narrators_detail = ebook_item.narrators_detail _ ", "; END; END; @@ -98,7 +113,7 @@ # Get Extended Authors information ebook_item.authors_extended = ''; IF ebook_item.authors != ''; - ebook_item.authors_extended = ' / ' _ ebook_item.authors_extended _ ebook_item.authors; + ebook_item.authors_extended = ' / ' _ ebook_item.authors_extended _ ebook_item.authors_name; END; # Get Extended Title information diff --git a/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/result/table.tt2 b/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/result/table.tt2 index 19aa9e9d84..1390ed919f 100755 --- a/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/result/table.tt2 +++ b/Open-ILS/src/templates/opac/ebook_api/rbdigital/parts/result/table.tt2 @@ -70,63 +70,13 @@ [% html_text_attr('title', l('Display record details for "[_1]"', ebook_item.title)) %]> [% ebook_item.title | html %] - [% IF rec.mr_constituent_count.defined && rec.mr_constituent_count > 1 %] - - ([% rec.mr_constituent_count %]) - - [% END %] - -[%- -FOR entry IN ebook_item.graphic_titles; - FOR alt IN entry.graphic; - diratt = ""; - IF alt.dir; - diratt = ' dir="' _ alt.dir _ '"'; - END; --%] -
- [% alt.value | html %] -
-[%- - END; -END; --%] -
- 'author', query => authorquery}, - general_search_parms.merge(expert_search_parms, browse_search_parms, facet_search_parms)) - -%]" rel="nofollow" vocab="">[% ebook_item.authors | html %] -[%- -FOR entry IN ebook_item.graphic_authors; - FOR alt IN entry.graphic; - diratt = ""; - IF alt.dir; - diratt = ' dir="' _ alt.dir _ '"'; - END; --%] -
- [% alt.value | html %] -
-[%- - END; -END; --%] - + [% IF ebook_item.narrators != ''; %] [% END; %]
@@ -151,11 +101,7 @@ END; END -%]
- [% IF rec.popularity > 0.0 %] -
- [% l('Popularity:') %] [% rec.popularity %] / 5.0 -
- [% END %] + + + Clear [% IF ctx.bookbag %]
diff --git a/Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2 b/Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2 index 6247bc03e2..7910c7ed4e 100755 --- a/Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2 +++ b/Open-ILS/src/templates/opac/parts/ebook_api/base_js.tt2 @@ -90,10 +90,10 @@ dojo.addOnLoad(function() { [%- IF ctx.user %] - + - + [%- END %] diff --git a/Open-ILS/src/templates/opac/parts/vendor_tabs.tt2 b/Open-ILS/src/templates/opac/parts/vendor_tabs.tt2 index 1dd7e3be8d..48c0875415 100755 --- a/Open-ILS/src/templates/opac/parts/vendor_tabs.tt2 +++ b/Open-ILS/src/templates/opac/parts/vendor_tabs.tt2 @@ -15,7 +15,7 @@ vendor_tab_class = "acct-tab-off"; END; %] [% vendor.name %] + href="[% ctx.opac_root _ vendor.search_uri; %]" class="[% vendor_tab_class %]">[% vendor.name %] [% END; %]
diff --git a/Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js b/Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js index f13a17309d..6a432741aa 100755 --- a/Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js +++ b/Open-ILS/web/js/ui/default/opac/ebook_api/ebook.js @@ -117,6 +117,8 @@ Ebook.prototype.checkin = function(authtoken, patron_id, callback) { var resp = r.recv(); if (resp) { console.log('checkout response: ' + resp.content()); + //Clear dojo cache + dojo.cookie('ebook_xact_cache', '' , {path: '/'}); return callback(resp.content()); } } diff --git a/title-7-2.txt b/title-7-2.txt new file mode 100644 index 0000000000..03c5e486d6 --- /dev/null +++ b/title-7-2.txt @@ -0,0 +1,1284 @@ +{ + "scopeId": 3925, + "pageIndex": 0, + "pageSize": 10, + "pageCount": 1, + "resultSetCount": 5, + "sort": "title", + "isSortByDesc": false, + "filters": [ + { + "tokenLabel": "mediatype", + "tokenValue": "eaudio", + "count": 2, + "isSelected": false + }, + { + "tokenLabel": "mediatype", + "tokenValue": "ebook", + "count": 3, + "isSelected": false + }, + { + "tokenLabel": "hasdrm", + "tokenValue": "false", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "hasdrm", + "tokenValue": "true", + "count": 5, + "isSelected": false + }, + { + "tokenLabel": "isfiction", + "tokenValue": "false", + "count": 2, + "isSelected": false + }, + { + "tokenLabel": "isfiction", + "tokenValue": "true", + "count": 3, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "african-american-interest", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "arts-entertainment", + "count": 2, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "biography-autobiography-memoir", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "business-economics", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "classics", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "comics-graphic-novels", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "cooking", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "drama", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "fantasy", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "foreign-language-study", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "general-fiction", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "general-nonfiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "historical-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "history", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "home-garden", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "horror", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "humor", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "humorous-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "inspirational-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "inspirational-nonfiction", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "juvenile-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "juvenile-nonfiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "language-arts", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "lgbt-interest", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "literary-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "mystery", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "non-classifiable", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "poetry", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "politics-and-current-events", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "politics-current-events", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "religion", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "romance", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "science", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "sci-fi", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "self-help", + "count": 2, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "short-stories", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "social-science", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "sports", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "suspense-thriller", + "count": 2, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "travel", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "true-crime", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "urban-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "western", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "genre", + "tokenValue": "womens-fiction", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "dutch-flemish", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "english", + "count": 5, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "french", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "german", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "irish", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "italian", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "norwegian", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "portuguese", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "spanish", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "language", + "tokenValue": "turkish", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "audience", + "tokenValue": "adult", + "count": 5, + "isSelected": false + }, + { + "tokenLabel": "audience", + "tokenValue": "beginning-reader", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "audience", + "tokenValue": "childrens", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "audience", + "tokenValue": "young-adult", + "count": 0, + "isSelected": false + }, + { + "tokenLabel": "availability", + "tokenValue": "available", + "count": 1, + "isSelected": false + }, + { + "tokenLabel": "availability", + "tokenValue": "unavailable", + "count": 4, + "isSelected": false + } + ], + "acceptMediaType": "complete", + "items": [ + { + "interest": { + "stateId": 3, + "isOwned": true, + "isAvailable": false, + "name": "library" + }, + "item": { + "authors": [ + { + "facet": "author", + "text": "Stephen King", + "token": "stephen-king", + "order": 0 + }, + { + "facet": "author", + "text": "Richard Chizmar", + "token": "richard-chizmar", + "order": 0 + } + ], + "narrators": [ + { + "facet": "narrator", + "text": "Maggie Siff", + "token": "maggie-siff", + "order": 0 + } + ], + "images": [ + { + "name": "medium", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100123506/Z100123506_image_95x140.jpg" + }, + { + "name": "large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100123506/Z100123506_image_128x192.jpg" + }, + { + "name": "x-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100123506/Z100123506_image_148x230.jpg" + }, + { + "name": "xx-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100123506/Z100123506_image_512x512_iTunes.png" + } + ], + "id": "5b3dd0cc19bf353454a0d387", + "isbn": "9781508242062", + "subtitle": "Includes Bonus Story \"The Music Room\"", + "publisher": { + "facet": "publisher", + "text": "Simon & Schuster Audio", + "token": "simon-and-schuster-audio", + "order": 0 + }, + "genres": [ + { + "facet": "genre", + "text": "General Fiction", + "token": "general-fiction", + "order": 0 + } + ], + "language": "English", + "audience": "Adult", + "mediaType": "eAudio", + "releasedDate": "2017-05-16T04:00:00Z", + "fileSize": "58655088", + "duration": "02:42:42", + "bookTitle": { + "facet": "title", + "text": "Gwendy's Button Box", + "token": "gwendys-button-box", + "order": 0 + }, + "title": "Gwendy's Button Box", + "isFiction": true, + "hasSubtitle": true, + "hasAttachments": false, + "hasDrm": true, + "preReleaseOn": "2017-03-23T04:00:00Z", + "scheduledReleaseOn": "2017-05-16T04:00:00Z", + "isPreRelease": false, + "shortDescription": "Set in the fictional town of Castle Rock, Maine INCLUDES A CONVERSATION BETWEEN STEPHEN KING & RICHARD CHIZMAR! Stephen King teams up with long-time friend and award-winning...", + "sortAuthor": "king stephen", + "sortTitle": "gwendys-button-box", + "sortNarrator": "siff maggie", + "audioFiles": [ + { + "id": 3226981, + "display": "Introduction", + "filename": "Z100123506_0001_IN.mp3", + "minutes": 1.03, + "size": 372056, + "duration": "00:01:01" + }, + { + "id": 3226982, + "display": "Chapter 1", + "filename": "Z100123506_0002_C0001.mp3", + "minutes": 23.55, + "size": 8481776, + "duration": "00:23:33" + }, + { + "id": 3226983, + "display": "Chapter 2", + "filename": "Z100123506_0003_C0002.mp3", + "minutes": 8.50, + "size": 3061904, + "duration": "00:08:30" + }, + { + "id": 3226984, + "display": "Chapter 3", + "filename": "Z100123506_0004_C0003.mp3", + "minutes": 1.91, + "size": 693680, + "duration": "00:01:54" + }, + { + "id": 3226985, + "display": "Chapter 4", + "filename": "Z100123506_0005_C0004.mp3", + "minutes": 5.96, + "size": 2150168, + "duration": "00:05:57" + }, + { + "id": 3226986, + "display": "Chapter 5", + "filename": "Z100123506_0006_C0005.mp3", + "minutes": 1.58, + "size": 572072, + "duration": "00:01:34" + }, + { + "id": 3226987, + "display": "Chapter 6", + "filename": "Z100123506_0007_C0006.mp3", + "minutes": 5.80, + "size": 2091200, + "duration": "00:05:48" + }, + { + "id": 3226988, + "display": "Chapter 7", + "filename": "Z100123506_0008_C0007.mp3", + "minutes": 5.33, + "size": 1923584, + "duration": "00:05:19" + }, + { + "id": 3228882, + "display": "Chapter 8", + "filename": "Z100123506_0009_C0008.mp3", + "minutes": 4.83, + "size": 1741280, + "duration": "00:04:49" + }, + { + "id": 3228883, + "display": "Chapter 9", + "filename": "Z100123506_0010_C0009.mp3", + "minutes": 1.68, + "size": 609224, + "duration": "00:01:40" + }, + { + "id": 3228884, + "display": "Chapter 10", + "filename": "Z100123506_0011_C0010.mp3", + "minutes": 6.55, + "size": 2359904, + "duration": "00:06:33" + }, + { + "id": 3228885, + "display": "Chapter 11", + "filename": "Z100123506_0012_C0011.mp3", + "minutes": 1.80, + "size": 647672, + "duration": "00:01:48" + }, + { + "id": 3228886, + "display": "Chapter 12", + "filename": "Z100123506_0013_C0012.mp3", + "minutes": 3.35, + "size": 1209056, + "duration": "00:03:21" + }, + { + "id": 3228887, + "display": "Chapter 13", + "filename": "Z100123506_0014_C0013.mp3", + "minutes": 2.10, + "size": 759992, + "duration": "00:02:06" + }, + { + "id": 3228888, + "display": "Chapter 14", + "filename": "Z100123506_0015_C0014.mp3", + "minutes": 5.16, + "size": 1862240, + "duration": "00:05:09" + }, + { + "id": 3228889, + "display": "Chapter 15", + "filename": "Z100123506_0016_C0015.mp3", + "minutes": 2.06, + "size": 747248, + "duration": "00:02:03" + }, + { + "id": 3228890, + "display": "Chapter 16", + "filename": "Z100123506_0017_C0016.mp3", + "minutes": 8.31, + "size": 2997968, + "duration": "00:08:18" + }, + { + "id": 3228891, + "display": "Chapter 17", + "filename": "Z100123506_0018_C0017.mp3", + "minutes": 2.81, + "size": 1016168, + "duration": "00:02:48" + }, + { + "id": 3228892, + "display": "Chapter 18", + "filename": "Z100123506_0019_C0018.mp3", + "minutes": 3.30, + "size": 1187240, + "duration": "00:03:18" + }, + { + "id": 3228893, + "display": "Chapter 19", + "filename": "Z100123506_0020_C0019.mp3", + "minutes": 3.43, + "size": 1238000, + "duration": "00:03:25" + }, + { + "id": 3228894, + "display": "Chapter 20", + "filename": "Z100123506_0021_C0020.mp3", + "minutes": 1.35, + "size": 490640, + "duration": "00:01:21" + }, + { + "id": 3228895, + "display": "Chapter 21", + "filename": "Z100123506_0022_C0021.mp3", + "minutes": 2.36, + "size": 852008, + "duration": "00:02:21" + }, + { + "id": 3228896, + "display": "Chapter 22", + "filename": "Z100123506_0023_C0022.mp3", + "minutes": 1.25, + "size": 451328, + "duration": "00:01:15" + }, + { + "id": 3228897, + "display": "Chapter 23", + "filename": "Z100123506_0024_C0023.mp3", + "minutes": 4.40, + "size": 1587056, + "duration": "00:04:24" + }, + { + "id": 3228898, + "display": "Chapter 24", + "filename": "Z100123506_0025_C0024.mp3", + "minutes": 1.33, + "size": 482000, + "duration": "00:01:19" + }, + { + "id": 3228899, + "display": "Chapter 25", + "filename": "Z100123506_0026_C0025.mp3", + "minutes": 3.55, + "size": 1281848, + "duration": "00:03:33" + }, + { + "id": 3228900, + "display": "Chapter 26", + "filename": "Z100123506_0027_C0026.mp3", + "minutes": 1.05, + "size": 381560, + "duration": "00:01:03" + }, + { + "id": 3228901, + "display": "Chapter 27", + "filename": "Z100123506_0028_C0027.mp3", + "minutes": 1.73, + "size": 625424, + "duration": "00:01:43" + }, + { + "id": 3228902, + "display": "Chapter 28", + "filename": "Z100123506_0029_C0028.mp3", + "minutes": 3.25, + "size": 1173416, + "duration": "00:03:15" + }, + { + "id": 3228903, + "display": "Chapter 29", + "filename": "Z100123506_0030_C0029.mp3", + "minutes": 8.81, + "size": 3177248, + "duration": "00:08:48" + }, + { + "id": 3228904, + "display": "Chapter 30", + "filename": "Z100123506_0031_C0030.mp3", + "minutes": 1.61, + "size": 586112, + "duration": "00:01:36" + }, + { + "id": 3228905, + "display": "Chapter 31", + "filename": "Z100123506_0032_C0031.mp3", + "minutes": 12.38, + "size": 4457264, + "duration": "00:12:22" + }, + { + "id": 3228906, + "display": "Chapter 32", + "filename": "Z100123506_0033_C0032.mp3", + "minutes": 1.71, + "size": 618512, + "duration": "00:01:42" + }, + { + "id": 3228907, + "display": "Chapter 33", + "filename": "Z100123506_0034_C0033.mp3", + "minutes": 11.48, + "size": 4135856, + "duration": "00:11:28" + }, + { + "id": 3228908, + "display": "Chapter 34", + "filename": "Z100123506_0035_C0034.mp3", + "minutes": 1.23, + "size": 445712, + "duration": "00:01:13" + }, + { + "id": 3228909, + "display": "Chapter 35", + "filename": "Z100123506_0036_C0035.mp3", + "minutes": 6.06, + "size": 2186672, + "duration": "00:06:03" + } + ], + "seriesPosition": "0", + "ratingCount": "0", + "hasFixedFormat": false + } + }, + { + "interest": { + "stateId": 3, + "isOwned": true, + "isAvailable": false, + "name": "library" + }, + "item": { + "authors": [ + { + "facet": "author", + "text": "Michael Connelly", + "token": "michael-connelly", + "order": 0 + } + ], + "images": [ + { + "name": "medium", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00276551/EB00276551_image_95x140.jpg" + }, + { + "name": "large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00276551/EB00276551_image_128x192.jpg" + }, + { + "name": "x-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00276551/EB00276551_image_148x230.jpg" + }, + { + "name": "xx-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00276551/EB00276551_image_512x512_iTunes.png" + } + ], + "id": "5b3dd11819bf353454a31ad5", + "isbn": "9780316136167", + "subtitle": "Volume 2: The Last Coyote, Trunk Music, Angels Flight", + "publisher": { + "facet": "publisher", + "text": "Little, Brown and Company", + "token": "little-brown-and-company", + "order": 0 + }, + "genres": [ + { + "facet": "genre", + "text": "Suspense Thriller", + "token": "suspense-thriller", + "order": 0 + } + ], + "language": "English", + "audience": "Adult", + "mediaType": "eBook", + "releasedDate": "2014-04-16T04:00:00Z", + "series": { + "count": 0, + "facet": "series", + "text": "Harry Bosch", + "token": "harry-bosch", + "order": 0 + }, + "bookTitle": { + "facet": "title", + "text": "The Harry Bosch Novels", + "token": "the-harry-bosch-novels", + "order": 0 + }, + "title": "The Harry Bosch Novels", + "isFiction": true, + "hasSubtitle": true, + "hasAttachments": false, + "hasDrm": true, + "preReleaseOn": "2014-04-04T04:00:00Z", + "scheduledReleaseOn": "2014-04-10T04:00:00Z", + "isPreRelease": false, + "shortDescription": "The Last Coyote: LAPD homicide detective Harry Bosch is suspended from the force for attacking his commanding officer. Unable to remain idle, he investigates the...", + "sortAuthor": "connelly michael", + "sortTitle": "harry-bosch-novels", + "seriesPosition": "21", + "ratingCount": "0", + "hasFixedFormat": false + } + }, + { + "interest": { + "stateId": 3, + "isOwned": true, + "isAvailable": false, + "name": "library" + }, + "item": { + "authors": [ + { + "facet": "author", + "text": "Victor L. Wooten", + "token": "victor-l-wooten", + "order": 0 + } + ], + "narrators": [ + { + "facet": "narrator", + "text": "Victor L. Wooten", + "token": "victor-l-wooten", + "order": 0 + } + ], + "images": [ + { + "name": "medium", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100031458/Z100031458_image_95x140.jpg" + }, + { + "name": "large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100031458/Z100031458_image_128x192.jpg" + }, + { + "name": "x-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100031458/Z100031458_image_148x230.jpg" + }, + { + "name": "xx-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/Z100031458/Z100031458_image_512x512_iTunes.png" + } + ], + "id": "5b3dd0d619bf353454a13d88", + "isbn": "9781400198177", + "subtitle": "A Spiritual Search For Growth Through Music", + "publisher": { + "facet": "publisher", + "text": "Tantor Media, Inc", + "token": "tantor-media-inc", + "order": 0 + }, + "genres": [ + { + "facet": "genre", + "text": "Arts Entertainment", + "token": "arts-entertainment", + "order": 0 + }, + { + "facet": "genre", + "text": "Social Science", + "token": "social-science", + "order": 0 + }, + { + "facet": "genre", + "text": "Religion", + "token": "religion", + "order": 0 + }, + { + "facet": "genre", + "text": "Self Help", + "token": "self-help", + "order": 0 + }, + { + "facet": "genre", + "text": "Inspirational Nonfiction", + "token": "inspirational-nonfiction", + "order": 0 + } + ], + "language": "English", + "audience": "Adult", + "mediaType": "eAudio", + "releasedDate": "2012-11-28T05:00:00Z", + "fileSize": "160653072", + "duration": "07:26:07", + "bookTitle": { + "facet": "title", + "text": "The Music Lesson", + "token": "the-music-lesson", + "order": 0 + }, + "title": "The Music Lesson", + "isFiction": false, + "hasSubtitle": true, + "hasAttachments": false, + "hasDrm": true, + "preReleaseOn": "2010-06-07T04:00:00Z", + "scheduledReleaseOn": "2010-06-07T04:00:00Z", + "isPreRelease": false, + "shortDescription": "\"Boy, do I have a lot to learn!\" Anyone who's ever picked up a musical instrument of any kind-from the first caveman banging rocks to that little kid at the guitar...", + "sortAuthor": "wooten l", + "sortTitle": "music-lesson", + "sortNarrator": "wooten l", + "audioFiles": [ + { + "id": 93299, + "display": "Introduction", + "filename": "Z100031458_001_IN.mp3", + "minutes": 15.56, + "size": 5607248, + "duration": "00:15:33" + }, + { + "id": 93300, + "display": "Chapter 1", + "filename": "Z100031458_002_C001.mp3", + "minutes": 32.60, + "size": 11740784, + "duration": "00:32:36" + }, + { + "id": 93301, + "display": "Chapter 2", + "filename": "Z100031458_003_C002.mp3", + "minutes": 22.81, + "size": 8214152, + "duration": "00:22:48" + }, + { + "id": 93302, + "display": "Chapter 3", + "filename": "Z100031458_004_C003.mp3", + "minutes": 39.10, + "size": 14079416, + "duration": "00:39:06" + }, + { + "id": 93303, + "display": "Chapter 4", + "filename": "Z100031458_005_C004.mp3", + "minutes": 36.76, + "size": 13236368, + "duration": "00:36:45" + }, + { + "id": 93304, + "display": "Chapter 5", + "filename": "Z100031458_006_C005.mp3", + "minutes": 35.75, + "size": 12875216, + "duration": "00:35:45" + }, + { + "id": 93305, + "display": "Chapter 6", + "filename": "Z100031458_007_C006.mp3", + "minutes": 45.28, + "size": 16306592, + "duration": "00:45:16" + }, + { + "id": 93306, + "display": "Chapter 7", + "filename": "Z100031458_008_C007.mp3", + "minutes": 24.11, + "size": 8682224, + "duration": "00:24:06" + }, + { + "id": 93307, + "display": "Chapter 8", + "filename": "Z100031458_009_C008.mp3", + "minutes": 29.10, + "size": 10480640, + "duration": "00:29:06" + }, + { + "id": 93308, + "display": "Chapter 9", + "filename": "Z100031458_010_C009.mp3", + "minutes": 28.45, + "size": 10245848, + "duration": "00:28:27" + }, + { + "id": 93309, + "display": "Chapter 10", + "filename": "Z100031458_011_C010.mp3", + "minutes": 32.06, + "size": 11547680, + "duration": "00:32:03" + }, + { + "id": 93310, + "display": "Chapter 11", + "filename": "Z100031458_012_C011.mp3", + "minutes": 33.41, + "size": 12031952, + "duration": "00:33:24" + }, + { + "id": 93311, + "display": "Chapter 12", + "filename": "Z100031458_013_C012.mp3", + "minutes": 20.96, + "size": 7549088, + "duration": "00:20:57" + }, + { + "id": 93312, + "display": "Chapter 13", + "filename": "Z100031458_014_C013.mp3", + "minutes": 23.05, + "size": 8301848, + "duration": "00:23:03" + }, + { + "id": 93313, + "display": "Chapter 14", + "filename": "Z100031458_015_C014.mp3", + "minutes": 27.08, + "size": 9754016, + "duration": "00:27:04" + } + ], + "seriesPosition": "0", + "ratingCount": "0", + "hasFixedFormat": false + } + }, + { + "interest": { + "stateId": 3, + "isOwned": true, + "isAvailable": true, + "name": "library" + }, + "item": { + "authors": [ + { + "facet": "author", + "text": "Victor L. Wooten", + "token": "victor-l-wooten", + "order": 0 + } + ], + "images": [ + { + "name": "medium", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00400981/EB00400981_image_95x140.jpg" + }, + { + "name": "large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00400981/EB00400981_image_128x192.jpg" + }, + { + "name": "x-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00400981/EB00400981_image_148x230.jpg" + }, + { + "name": "xx-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00400981/EB00400981_image_512x512_iTunes.png" + } + ], + "id": "5b3dd12119bf353454a37f75", + "isbn": "9781440637698", + "subtitle": "A Spiritual Search For Growth Through Music", + "publisher": { + "facet": "publisher", + "text": "Berkley", + "token": "berkley", + "order": 0 + }, + "genres": [ + { + "facet": "genre", + "text": "Arts Entertainment", + "token": "arts-entertainment", + "order": 0 + }, + { + "facet": "genre", + "text": "Self Help", + "token": "self-help", + "order": 0 + } + ], + "language": "English", + "audience": "Adult", + "mediaType": "eBook", + "releasedDate": "2014-06-11T04:00:00Z", + "bookTitle": { + "facet": "title", + "text": "The Music Lesson", + "token": "the-music-lesson", + "order": 0 + }, + "title": "The Music Lesson", + "isFiction": false, + "hasSubtitle": true, + "hasAttachments": false, + "hasDrm": true, + "preReleaseOn": "2014-06-04T04:00:00Z", + "scheduledReleaseOn": "2014-06-05T04:00:00Z", + "isPreRelease": false, + "shortDescription": "From Grammy-winning musical icon and legendary bassist Victor L. Wooten comes The Music Lesson, the story of a struggling young musician who wanted music to be his...", + "sortAuthor": "wooten l", + "sortTitle": "music-lesson", + "seriesPosition": "0", + "ratingCount": "0", + "hasFixedFormat": false + } + }, + { + "interest": { + "stateId": 3, + "isOwned": true, + "isAvailable": false, + "name": "library" + }, + "item": { + "authors": [ + { + "facet": "author", + "text": "Michael Connelly", + "token": "michael-connelly", + "order": 0 + } + ], + "images": [ + { + "name": "medium", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00283788/EB00283788_image_95x140.jpg" + }, + { + "name": "large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00283788/EB00283788_image_128x192.jpg" + }, + { + "name": "x-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00283788/EB00283788_image_148x230.jpg" + }, + { + "name": "xx-large", + "url": "https://d2cv0ie6dlin9h.cloudfront.net/EB00283788/EB00283788_image_512x512_iTunes.png" + } + ], + "id": "5b3dd11a19bf353454a32b95", + "isbn": "9780316135870", + "publisher": { + "facet": "publisher", + "text": "Little, Brown and Company", + "token": "little-brown-and-company", + "order": 0 + }, + "genres": [ + { + "facet": "genre", + "text": "Mystery", + "token": "mystery", + "order": 0 + }, + { + "facet": "genre", + "text": "Suspense Thriller", + "token": "suspense-thriller", + "order": 0 + } + ], + "language": "English", + "audience": "Adult", + "mediaType": "eBook", + "releasedDate": "2014-05-01T04:00:00Z", + "series": { + "count": 0, + "facet": "series", + "text": "Harry Bosch", + "token": "harry-bosch", + "order": 0 + }, + "bookTitle": { + "facet": "title", + "text": "Trunk Music", + "token": "trunk-music", + "order": 0 + }, + "title": "Trunk Music", + "isFiction": true, + "hasSubtitle": false, + "hasAttachments": false, + "hasDrm": true, + "preReleaseOn": "2014-04-09T04:00:00Z", + "scheduledReleaseOn": "2014-04-15T04:00:00Z", + "isPreRelease": false, + "shortDescription": "Back on the job after an involuntary leave of absence, LAPD homicide detective Harry Bosch is ready for a challenge. But his first case is a little more than he...", + "sortAuthor": "connelly michael", + "sortTitle": "trunk-music", + "seriesPosition": "21", + "ratingCount": "0", + "hasFixedFormat": false + } + } + ] +} \ No newline at end of file -- 2.11.0