Audio-Scrobbler2
view release on metacpan or search on metacpan
lib/Audio/Scrobbler2.pm view on Meta::CPAN
package Audio::Scrobbler2;
use 5.026;
use strict;
use warnings;
use Carp qw(croak);
use Digest::MD5 qw(md5_hex);
use Encode qw(encode_utf8);
use HTTP::Tiny 0.084;
use JSON::PP qw(decode_json);
our $VERSION = '1.00';
my $API_URL = 'https://ws.audioscrobbler.com/2.0/';
sub new {
my ($class, $api_key, $api_secret) = @_;
_require_value($api_key, 'API key');
_require_value($api_secret, 'API secret');
my $self = bless {
api_key => $api_key,
api_secret => $api_secret,
api_url => $API_URL,
}, ref($class) || $class;
$self->{http} = $self->_build_http_client;
return $self;
}
sub _build_http_client {
return HTTP::Tiny->new(
agent => "Audio-Scrobbler2/$VERSION",
keep_alive => 1,
timeout => 30,
verify_SSL => 1,
);
}
sub _signature {
my ($self, $params) = @_;
my $signature = join '',
map { $_ . $params->{$_} }
sort grep { $_ ne 'api_sig' && $_ ne 'callback' && $_ ne 'format' }
keys %{$params};
return md5_hex(encode_utf8($signature . $self->{api_secret}));
}
sub _signed_params {
my ($self, $params) = @_;
my %signed_params = %{$params};
$signed_params{api_sig} = $self->_signature(\%signed_params);
return \%signed_params;
}
sub _request {
my ($self, $params, $method) = @_;
$method //= 'GET';
my %fields = (%{$params}, format => 'json');
my $response;
if ($method eq 'POST') {
$response = $self->{http}->post_form($self->{api_url}, \%fields);
}
elsif ($method eq 'GET') {
my $query = $self->{http}->www_form_urlencode(\%fields);
$response = $self->{http}->get("$self->{api_url}?$query");
}
else {
croak "Unsupported HTTP method: $method";
}
my $content = $response->{content} // '';
my ($data, $json_error);
if (length $content) {
local $@;
$data = eval { decode_json($content) };
$json_error = $@;
}
if (ref($data) eq 'HASH' && exists $data->{error}) {
my $message = $data->{message} // 'Unknown error';
croak "Last.fm API error $data->{error}: $message";
}
if (!$response->{success}) {
my $status = $response->{status} // 'unknown';
my $reason = $response->{reason} // 'Unknown error';
( run in 1.600 second using v1.01-cache-2.11-cpan-14f38c9f855 )