| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package WebService::Spotify; |
|
2
|
1
|
|
|
1
|
|
128281
|
use Moo; |
|
|
1
|
|
|
|
|
31219
|
|
|
|
1
|
|
|
|
|
10
|
|
|
3
|
1
|
|
|
1
|
|
3156
|
use Method::Signatures; |
|
|
1
|
|
|
|
|
112350
|
|
|
|
1
|
|
|
|
|
13
|
|
|
4
|
1
|
|
|
1
|
|
1894
|
use LWP::UserAgent; |
|
|
1
|
|
|
|
|
185902
|
|
|
|
1
|
|
|
|
|
34
|
|
|
5
|
1
|
|
|
1
|
|
760
|
use URI::QueryParam; |
|
|
1
|
|
|
|
|
650
|
|
|
|
1
|
|
|
|
|
26
|
|
|
6
|
1
|
|
|
1
|
|
1011
|
use JSON; |
|
|
1
|
|
|
|
|
858085
|
|
|
|
1
|
|
|
|
|
11
|
|
|
7
|
1
|
|
|
1
|
|
265
|
use Data::Dumper; |
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
299
|
|
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
our $VERSION = '1.002'; |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
has 'prefix' => ( is => 'rw', default => 'https://api.spotify.com/v1/' ); |
|
12
|
|
|
|
|
|
|
has 'auth' => ( is => 'rw' ); |
|
13
|
|
|
|
|
|
|
has 'trace' => ( is => 'rw', default => 0 ); |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
has 'user_agent' => ( |
|
16
|
|
|
|
|
|
|
is => 'rw', |
|
17
|
|
|
|
|
|
|
default => sub { |
|
18
|
|
|
|
|
|
|
my $ua = LWP::UserAgent->new; |
|
19
|
|
|
|
|
|
|
$ua->agent("WebService::Spotify/$VERSION"); |
|
20
|
|
|
|
|
|
|
return $ua; |
|
21
|
|
|
|
|
|
|
} |
|
22
|
|
|
|
|
|
|
); |
|
23
|
|
|
|
|
|
|
|
|
24
|
1
|
50
|
|
1
|
|
550377
|
method get ($method, %args) { |
|
|
1
|
|
|
1
|
|
3
|
|
|
|
1
|
|
|
|
|
10
|
|
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
7
|
|
|
25
|
1
|
|
|
|
|
10
|
my $uri = $self->_uri( $method, %args ); |
|
26
|
1
|
|
|
|
|
7
|
my $headers = $self->_auth_headers; |
|
27
|
1
|
|
|
|
|
14
|
my $response = $self->user_agent->get( $uri->as_string, %$headers ); |
|
28
|
|
|
|
|
|
|
|
|
29
|
1
|
|
|
|
|
7080
|
$self->_log("GET", $uri->as_string); |
|
30
|
1
|
|
|
|
|
6
|
$self->_log("RESP", $response->content); |
|
31
|
|
|
|
|
|
|
|
|
32
|
1
|
50
|
|
|
|
4
|
return $response->content ? from_json($response->content) : undef; |
|
33
|
|
|
|
|
|
|
} |
|
34
|
|
|
|
|
|
|
|
|
35
|
1
|
0
|
|
1
|
|
3355
|
method post ($method, $payload, %args) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
36
|
0
|
|
|
|
|
0
|
my $uri = $self->_uri( $method, %args ); |
|
37
|
0
|
|
|
|
|
0
|
my $headers = $self->_auth_headers; |
|
38
|
0
|
|
|
|
|
0
|
$headers->{'Content-Type'} = 'application/json'; |
|
39
|
0
|
|
|
|
|
0
|
my $response = $self->user_agent->post( $uri->as_string, %$headers, Content => to_json($payload) ); |
|
40
|
|
|
|
|
|
|
|
|
41
|
0
|
|
|
|
|
0
|
$self->_log("POST", $uri->as_string); |
|
42
|
0
|
|
|
|
|
0
|
$self->_log("HEAD", Dumper $headers); |
|
43
|
0
|
|
|
|
|
0
|
$self->_log("DATA", Dumper $payload); |
|
44
|
0
|
|
|
|
|
0
|
$self->_log("RESP", $response->content); |
|
45
|
|
|
|
|
|
|
|
|
46
|
0
|
0
|
|
|
|
0
|
return $response->content ? from_json($response->content) : undef; |
|
47
|
|
|
|
|
|
|
} |
|
48
|
|
|
|
|
|
|
|
|
49
|
1
|
0
|
|
1
|
|
1830
|
method next ($result) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
50
|
0
|
0
|
|
|
|
0
|
return $self->get($result->{next}) if $result->{next}; |
|
51
|
|
|
|
|
|
|
} |
|
52
|
|
|
|
|
|
|
|
|
53
|
1
|
0
|
|
1
|
|
1904
|
method previous ($result) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
54
|
0
|
0
|
|
|
|
0
|
return $self->get($result->{previous}) if $result->{previous}; |
|
55
|
|
|
|
|
|
|
} |
|
56
|
|
|
|
|
|
|
|
|
57
|
1
|
0
|
|
1
|
|
1686
|
method track ($track) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
58
|
0
|
|
|
|
|
0
|
my $track_id = $self->_get_id('track', $track); |
|
59
|
0
|
|
|
|
|
0
|
return $self->get("tracks/$track_id"); |
|
60
|
|
|
|
|
|
|
} |
|
61
|
|
|
|
|
|
|
|
|
62
|
1
|
0
|
|
1
|
|
1579
|
method tracks ($tracks) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
63
|
0
|
|
|
|
|
0
|
my @track_ids = map { $self->_get_id('track', $_) } @$tracks; |
|
|
0
|
|
|
|
|
0
|
|
|
64
|
0
|
|
|
|
|
0
|
return $self->get('tracks/?ids=' . join(',', @track_ids)); |
|
65
|
|
|
|
|
|
|
} |
|
66
|
|
|
|
|
|
|
|
|
67
|
1
|
50
|
|
1
|
|
2200
|
method artist ($artist) { |
|
|
1
|
50
|
|
1
|
|
1092
|
|
|
|
1
|
|
|
|
|
8
|
|
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
6
|
|
|
68
|
1
|
|
|
|
|
7
|
my $artist_id = $self->_get_id('artist', $artist); |
|
69
|
1
|
|
|
|
|
10
|
return $self->get("artists/$artist_id"); |
|
70
|
|
|
|
|
|
|
} |
|
71
|
|
|
|
|
|
|
|
|
72
|
1
|
0
|
|
1
|
|
1732
|
method artists ($artists) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
73
|
0
|
|
|
|
|
0
|
my @artist_ids = map { $self->_get_id('artist', $_) } @$artists; |
|
|
0
|
|
|
|
|
0
|
|
|
74
|
0
|
|
|
|
|
0
|
return $self->get('artists/?ids=' . join(',', @artist_ids)); |
|
75
|
|
|
|
|
|
|
} |
|
76
|
|
|
|
|
|
|
|
|
77
|
1
|
0
|
|
1
|
|
9221
|
method artist_albums ($artist, :$album_type, :$country, :$limit = 20, :$offset = 0) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
78
|
0
|
|
|
|
|
0
|
my $artist_id = $self->_get_id('artist', $artist); |
|
79
|
0
|
|
|
|
|
0
|
my %options; |
|
80
|
0
|
0
|
|
|
|
0
|
$options{album_type} = $album_type if $album_type; |
|
81
|
0
|
0
|
|
|
|
0
|
$options{country} = $country if $country; |
|
82
|
0
|
|
|
|
|
0
|
return $self->get("artists/$artist_id/albums", %options, limit => $limit, offset => $offset); |
|
83
|
|
|
|
|
|
|
} |
|
84
|
|
|
|
|
|
|
|
|
85
|
1
|
0
|
|
1
|
|
6420
|
method artist_top_tracks ($artist, :$country = 'US') { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
86
|
0
|
|
|
|
|
0
|
my $artist_id = $self->_get_id('artist', $artist); |
|
87
|
0
|
|
|
|
|
0
|
return $self->get("artists/$artist_id/top-tracks", country => $country); |
|
88
|
|
|
|
|
|
|
} |
|
89
|
|
|
|
|
|
|
|
|
90
|
1
|
0
|
|
1
|
|
1978
|
method album ($album) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
91
|
0
|
|
|
|
|
0
|
my $album_id = $self->_get_id('album', $album); |
|
92
|
0
|
|
|
|
|
0
|
return $self->get("albums/$album_id"); |
|
93
|
|
|
|
|
|
|
} |
|
94
|
|
|
|
|
|
|
|
|
95
|
1
|
0
|
|
1
|
|
1930
|
method album_tracks ($album) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
96
|
0
|
|
|
|
|
0
|
my $album_id = $self->_get_id('album', $album); |
|
97
|
0
|
|
|
|
|
0
|
return $self->get("albums/$album_id/tracks"); |
|
98
|
|
|
|
|
|
|
} |
|
99
|
|
|
|
|
|
|
|
|
100
|
1
|
0
|
|
1
|
|
1929
|
method albums ($albums) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
101
|
0
|
|
|
|
|
0
|
my @album_ids = map { $self->_get_id('album', $_) } @$albums; |
|
|
0
|
|
|
|
|
0
|
|
|
102
|
0
|
|
|
|
|
0
|
return $self->get('albums/?ids=' . join(',', @album_ids)); |
|
103
|
|
|
|
|
|
|
} |
|
104
|
|
|
|
|
|
|
|
|
105
|
1
|
0
|
|
1
|
|
9536
|
method search ($q, :$limit = 10, :$offset = 0, :$type = 'track') { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
106
|
0
|
|
|
|
|
0
|
return $self->get('search', q => $q, limit => $limit, offset => $offset, type => $type); |
|
107
|
|
|
|
|
|
|
} |
|
108
|
|
|
|
|
|
|
|
|
109
|
1
|
0
|
|
1
|
|
1874
|
method user ($user_id) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
110
|
0
|
|
|
|
|
0
|
return $self->get("users/$user_id"); |
|
111
|
|
|
|
|
|
|
} |
|
112
|
|
|
|
|
|
|
|
|
113
|
1
|
0
|
|
1
|
|
1862
|
method user_playlists ($user_id) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
114
|
0
|
|
|
|
|
0
|
return $self->get("users/$user_id/playlists"); |
|
115
|
|
|
|
|
|
|
} |
|
116
|
|
|
|
|
|
|
|
|
117
|
1
|
0
|
|
1
|
|
4057
|
method user_playlist ($user_id, :$playlist_id, :$fields) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
118
|
0
|
0
|
|
|
|
0
|
my $method = $playlist_id ? "playlists/$playlist_id" : "starred"; |
|
119
|
0
|
|
|
|
|
0
|
return $self->get("users/$user_id/$method", $fields => $fields); |
|
120
|
|
|
|
|
|
|
} |
|
121
|
|
|
|
|
|
|
|
|
122
|
1
|
0
|
|
1
|
|
5394
|
method user_playlist_create ($user_id, $name, :$public = 1) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
123
|
0
|
|
|
|
|
0
|
my $data = { 'name' => $name, 'public' => $public }; |
|
124
|
0
|
|
|
|
|
0
|
return $self->post("users/$user_id/playlists", $data); |
|
125
|
|
|
|
|
|
|
} |
|
126
|
|
|
|
|
|
|
|
|
127
|
1
|
0
|
|
1
|
|
3597
|
method user_playlist_add_tracks ($user_id, $playlist_id, $tracks, :$position) { |
|
|
0
|
0
|
|
0
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
0
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
128
|
0
|
|
|
|
|
0
|
my %options; |
|
129
|
0
|
0
|
|
|
|
0
|
$options{position} = $position if $position; |
|
130
|
0
|
|
|
|
|
0
|
return $self->post("users/$user_id/playlists/$playlist_id/tracks", $tracks, %options); |
|
131
|
|
|
|
|
|
|
} |
|
132
|
|
|
|
|
|
|
|
|
133
|
1
|
0
|
|
1
|
|
611
|
method me { |
|
|
0
|
|
|
0
|
|
0
|
|
|
|
0
|
|
|
|
|
0
|
|
|
134
|
0
|
|
|
|
|
0
|
return $self->get('me/'); |
|
135
|
|
|
|
|
|
|
} |
|
136
|
|
|
|
|
|
|
|
|
137
|
1
|
|
|
1
|
|
1649
|
method _log (@strings) { |
|
|
2
|
|
|
2
|
|
20
|
|
|
|
2
|
|
|
|
|
7
|
|
|
138
|
2
|
50
|
|
|
|
25
|
print join(' ', @strings) . "\n" if $self->trace; |
|
139
|
|
|
|
|
|
|
} |
|
140
|
|
|
|
|
|
|
|
|
141
|
1
|
50
|
|
1
|
|
481
|
method _auth_headers { |
|
|
1
|
|
|
1
|
|
2
|
|
|
|
1
|
|
|
|
|
6
|
|
|
142
|
1
|
50
|
|
|
|
8
|
return $self->auth ? { 'Authorization' => 'Bearer ' . $self->auth } : undef; |
|
143
|
|
|
|
|
|
|
} |
|
144
|
|
|
|
|
|
|
|
|
145
|
1
|
50
|
|
1
|
|
2098
|
method _uri ($method, %args) { |
|
|
1
|
|
|
1
|
|
2
|
|
|
|
1
|
|
|
|
|
6
|
|
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
4
|
|
|
146
|
1
|
50
|
|
|
|
27
|
my $base_uri = $method =~ /^http/ ? $method : $self->prefix . $method; |
|
147
|
|
|
|
|
|
|
|
|
148
|
1
|
|
|
|
|
12
|
my $uri = URI->new( $base_uri ); |
|
149
|
1
|
|
|
|
|
11915
|
$uri->query_param( $_, $args{$_} ) for keys %args; |
|
150
|
|
|
|
|
|
|
|
|
151
|
1
|
|
|
|
|
6
|
return $uri; |
|
152
|
|
|
|
|
|
|
} |
|
153
|
|
|
|
|
|
|
|
|
154
|
1
|
50
|
|
1
|
|
2154
|
method _get_id ($type, $id) { |
|
|
1
|
50
|
|
1
|
|
3
|
|
|
|
1
|
50
|
|
|
|
5
|
|
|
|
1
|
|
|
|
|
4
|
|
|
|
1
|
|
|
|
|
5
|
|
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
5
|
|
|
155
|
1
|
|
|
|
|
7
|
my @fields = split /:/, $id; |
|
156
|
1
|
50
|
|
|
|
5
|
if (@fields == 3) { |
|
157
|
1
|
50
|
|
|
|
5
|
warn "expected id of type $type but found type $fields[2] id" if $type ne $fields[1]; |
|
158
|
1
|
|
|
|
|
5
|
return $fields[2]; |
|
159
|
|
|
|
|
|
|
} |
|
160
|
|
|
|
|
|
|
|
|
161
|
0
|
|
|
|
|
|
@fields = split /\//, $id; |
|
162
|
0
|
0
|
|
|
|
|
if (@fields >= 3) { |
|
163
|
0
|
0
|
|
|
|
|
warn "expected id of type $type but found type $fields[-2] id" if $type ne $fields[-2]; |
|
164
|
0
|
|
|
|
|
|
return $fields[-1]; |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
|
|
167
|
0
|
|
|
|
|
|
return $id; |
|
168
|
|
|
|
|
|
|
} |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
1; |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
=head1 NAME |
|
173
|
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
WebService::Spotify - A simple interface to the L<Spotify Web API|https://developer.spotify.com/web-api/> |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
177
|
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
my $spotify = WebService::Spotify->new; |
|
179
|
|
|
|
|
|
|
my $results = $spotify->search('weezer', limit => 20); |
|
180
|
|
|
|
|
|
|
say $_->{name} for @{$results->{tracks}->{items}}; |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
More examples can be found in the /eg directory. |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
=head1 METHODS |
|
189
|
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
See L<Method::Signatures> for details of the parameter spec used below. |
|
191
|
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
Refer to the L<Spotify API documentation|https://developer.spotify.com/spotify-web-api/> for details on the methods and parameters. |
|
193
|
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
Methods that take item IDs (such as the track, album and artist methods) accept URN, URL or simple ID types. The following 3 ids are all acceptable IDs: |
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
http://open.spotify.com/track/3HfB5hBU0dmBt8T0iCmH42 |
|
197
|
|
|
|
|
|
|
spotify:track:3HfB5hBU0dmBt8T0iCmH42 |
|
198
|
|
|
|
|
|
|
3HfB5hBU0dmBt8T0iCmH42 |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
The following methods are supported: |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
=head2 album ($album_id) |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
returns a single album given the album's ID, URN or URL |
|
205
|
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
=head2 album_tracks ($album_id) |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
Get Spotify catalog information about an album's tracks |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
=head2 albums (\@albums) |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
returns a list of albums given the album IDs, URNs, or URLs |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
=head2 artist ($artist_id) |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
returns a single artist given the artist's ID, URN or URL |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
=head2 artist_albums ($artist, :$album_type, :$country, :$limit = 20, :$offset = 0) |
|
219
|
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
Get Spotify catalog information about an artistâs albums |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
=head2 artist_top_tracks ($artist, :$country = 'US') |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
Get Spotify catalog information about an artistâs top 10 tracks by country. |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
=head2 artists (\@artists) |
|
227
|
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
returns a list of artists given the artist IDs, URNs, or URLs |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
=head2 me() |
|
231
|
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
returns info about me |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head2 next ($result) |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
returns the next result given a result |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
=head2 previous ($result) |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
returns the previous result given a result |
|
241
|
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
=head2 search ($q, limit => 10, offset => 0, type => 'track') |
|
243
|
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
searches for an item |
|
245
|
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
=head2 track ($track_id) |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
returns a single track given the track's ID, URN or URL |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
=head2 tracks (\@track_ids) |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
returns a list of tracks given the track IDs, URNs, or URLs |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
=head2 user ($user_id) |
|
255
|
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
Gets basic profile information about a Spotify User |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
=head2 user_playlist ($user_id, :$playlist_id, :$fields) |
|
259
|
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
Gets playlist of a user |
|
261
|
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
=head2 user_playlist_add_tracks ($user_id, $playlist_id, $tracks, :$position) |
|
263
|
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
Adds tracks to a playlist |
|
265
|
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
=head2 user_playlist_create ($user_id, $name, :$public = 1) |
|
267
|
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
Creates a playlist for a user |
|
269
|
|
|
|
|
|
|
|
|
270
|
|
|
|
|
|
|
=head2 user_playlists ($user_id) |
|
271
|
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
Gets playlists of a user |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
=head1 AUTHOR |
|
276
|
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
Nick Langridge <nickl@cpan.org> |
|
278
|
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
=head1 CREDITS |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
This module was ported from L<Spotipy|https://github.com/plamere/spotipy>, a Python wrapper for the Spotify Web API |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
=head1 LICENSE |
|
284
|
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
This module is free software; you can redistribute it or |
|
286
|
|
|
|
|
|
|
modify it under the same terms as Perl itself. |
|
287
|
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
L<WebService::EchoNest> - wrapper for the EchoNest API which has some integration with the Spotify Web API |
|
291
|
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
L<Net::Spotify> - wrapper for the old Spotify metadata API |
|
293
|
|
|
|
|
|
|
|