File Coverage

blib/lib/WebService/AcousticBrainz.pm
Criterion Covered Total %
statement 41 43 95.3
branch 7 8 87.5
condition n/a
subroutine 11 12 91.6
pod 1 1 100.0
total 60 64 93.7


line stmt bran cond sub pod time code
1             package WebService::AcousticBrainz;
2             our $AUTHORITY = 'cpan:GENE';
3              
4             # ABSTRACT: Access to the AcousticBrainz API
5              
6             our $VERSION = '0.0600';
7              
8 1     1   1246 use Moo;
  1         10776  
  1         5  
9 1     1   2009 use strictures 2;
  1         1638  
  1         39  
10 1     1   709 use namespace::clean;
  1         11918  
  1         7  
11              
12 1     1   278 use Carp;
  1         2  
  1         53  
13 1     1   6 use Mojo::UserAgent;
  1         2  
  1         16  
14 1     1   53 use Mojo::JSON qw( decode_json );
  1         2  
  1         42  
15 1     1   5 use Mojo::URL;
  1         2  
  1         12  
16 1     1   43 use Try::Tiny;
  1         2  
  1         472  
17              
18              
19             has base => (
20             is => 'rw',
21             default => sub { 'https://acousticbrainz.org' },
22             );
23              
24              
25             has ua => (
26             is => 'rw',
27             default => sub { Mojo::UserAgent->new() },
28             );
29              
30              
31             sub fetch {
32 4     4 1 27816 my ( $self, %args ) = @_;
33              
34 4 100       28 croak 'No mbid provided' unless $args{mbid};
35 3 100       17 croak 'No endpoint provided' unless $args{endpoint};
36 2 100       14 croak 'No query provided' unless $args{query};
37              
38             my $url = Mojo::URL->new($self->base)
39             ->path('/api/v1/' . $args{mbid} . '/'. $args{endpoint})
40 1         10 ->query(%{ $args{query} });
  1         353  
41              
42 1         120 my $tx = $self->ua->get($url);
43              
44 1         20924 my $data = _handle_response($tx);
45              
46 1         9 return $data;
47             }
48              
49             sub _handle_response {
50 1     1   4 my ($tx) = @_;
51              
52 1         2 my $data;
53              
54 1         7 my $res = $tx->result;
55              
56 1 50       31 if ( $res->is_success ) {
57 1         19 my $body = $res->body;
58             try {
59 1     1   130 $data = decode_json($body);
60             }
61             catch {
62 0     0   0 croak $body, "\n";
63 1         32 };
64             }
65             else {
66 0         0 croak "Connection error: ", $res->message;
67             }
68              
69 1         146 return $data;
70             }
71              
72             1;
73              
74             __END__