1 package C4
::External
::OverDrive
;
3 # Copyright (c) 2013 ByWater
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
27 use HTTP
::Request
::Common
;
28 use LWP
::Authen
::Basic
;
33 our @ISA = qw( Exporter ) ;
42 my $ua = LWP
::UserAgent
->new( agent
=> "Koha " . $Koha::VERSION
);
46 $response = $ua->request( $request ) ;
49 warn "OverDrive request failed: $@";
58 C4::External::OverDrive - Retrieve OverDrive content availability information
62 This module provides content search for OverDrive,
66 =item IsOverDriveEnabled
68 Returns 1 if all of the necessary system preferences for OverDrive are set.
74 sub IsOverDriveEnabled
{
76 C4
::Context
->preference( 'OverDriveClientKey' ) &&
77 C4
::Context
->preference( 'OverDriveClientSecret' )
83 =item GetOverDriveToken
85 Fetches an OAuth2 auth token for the OverDrive API, reusing an existing token in
88 Returns the token ( as "bearer ..." ) or undef on failure.
94 sub GetOverDriveToken
{
95 my $key = C4
::Context
->preference( 'OverDriveClientKey' );
96 my $secret = C4
::Context
->preference( 'OverDriveClientSecret' );
98 return unless ( $key && $secret ) ;
102 eval { $cache = Koha
::Caches
->get_instance() };
105 $cache and $token = $cache->get_from_cache( "overdrive_token" ) and return $token;
107 my $request = HTTP
::Request
::Common
::POST
( 'https://oauth.overdrive.com/token', [
108 grant_type
=> 'client_credentials'
110 $request->header( Authorization
=> LWP
::Authen
::Basic
->auth_header( $key, $secret ) );
112 my $response = _request
( $request ) or return;
113 if ( $response->header('Content-Type') !~ m!application/json! ) {
114 warn "Could not connect to OverDrive: " . $response->message;
117 my $contents = from_json
( $response->decoded_content );
119 if ( !$response->is_success ) {
120 warn "Could not log into OverDrive: " . ( $contents ?
$contents->{'error_description'} : $response->decoded_content );
124 $token = $contents->{'token_type'} . ' ' . $contents->{'access_token'};
126 # Fudge factor to prevent spurious failures
128 and $cache->set_in_cache( 'overdrive_token', $token,
129 { expiry
=> $contents->{'expires_in'} - 5 } );
143 Jesse Weaver <pianohacker@gmail.com>