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 )