Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 85 additions & 20 deletions API.pm
Original file line number Diff line number Diff line change
Expand Up @@ -359,16 +359,9 @@ sub checkPurchase {
}

sub getUserFavorites {
my ($self, $cb, $force) = @_;

$self->_pagingGet('favorite/getUserFavorites', sub {
my ($favorites) = @_;

$favorites->{albums}->{items} = _precacheAlbum($favorites->{albums}->{items}) if $favorites->{albums};
$favorites->{tracks}->{items} = _precacheTracks($favorites->{tracks}->{items}) if $favorites->{tracks};
my ($self, $cb, $args) = @_;

$cb->($favorites);
},{
my $params = {
limit => QOBUZ_USERDATA_LIMIT,
_extractor => sub {
my ($favorites) = @_;
Expand Down Expand Up @@ -396,32 +389,99 @@ sub getUserFavorites {
},
_ttl => QOBUZ_USER_DATA_EXPIRY,
_use_token => 1,
_wipecache => $force,
});
};
foreach (keys %$args) {
$params->{$_} = $args->{$_};
}

$self->_pagingGet('favorite/getUserFavorites', sub {
my ($favorites) = @_;

$favorites->{albums}->{items} = _precacheAlbum($favorites->{albums}->{items}) if $favorites->{albums};
$favorites->{tracks}->{items} = _precacheTracks($favorites->{tracks}->{items}) if $favorites->{tracks};

$cb->($favorites);
}, $params);
}

sub getUserFavoriteIds {
my ($self, $cb, $args) = @_;

my $params = {
_ttl => QOBUZ_USER_DATA_EXPIRY,
_user_cache => 1,
_use_token => 1,
};
foreach (keys %$args) {
$params->{$_} = $args->{$_};
}

$self->_get('favorite/getUserFavoriteIds', sub {
my ($favoriteIds) = @_;

$cb->($favoriteIds);
}, $params);
}

sub getUserFavoriteStatus {
my ($self, $cb, $args) = @_;

my $params = {
_ttl => QOBUZ_USER_DATA_EXPIRY,
_user_cache => 1,
_use_token => 1,
};
foreach (keys %$args) {
$params->{$_} = $args->{$_};
}

$self->_get('favorite/status', sub {
my ($favoriteStatus) = @_;

$cb->($favoriteStatus);
}, $params);
}

sub createFavorite {
my ($self, $cb, $args) = @_;

$args->{_use_token} = 1;
$args->{_nocache} = 1;
my $params = {
_user_cache => 1,
_nocache => 1,
};
foreach (keys %$args) {
$params->{$_} = $args->{$_};
}

$self->_get('favorite/create', sub {
$cb->(shift);
$self->getUserFavorites(sub{}, 'refresh')
}, $args);
$self->getUserFavorites( sub{}, { _cacheAction => QOBUZ_DELETE_CACHE } );
$self->getUserFavoriteIds( sub{}, { _cacheAction => QOBUZ_DELETE_CACHE } );
$self->getUserFavoriteStatus( sub{}, { type => 'album', item_id => $args->{album_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{album_ids};
$self->getUserFavoriteStatus( sub{}, { type => 'artist', item_id => $args->{artist_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{artist_ids};
$self->getUserFavoriteStatus( sub{}, { type => 'track', item_id => $args->{track_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{track_ids};
}, $params);
}

sub deleteFavorite {
my ($self, $cb, $args) = @_;

$args->{_use_token} = 1;
$args->{_nocache} = 1;
my $params = {
_user_cache => 1,
_nocache => 1,
};
foreach (keys %$args) {
$params->{$_} = $args->{$_};
}

$self->_get('favorite/delete', sub {
$cb->(shift);
$self->getUserFavorites(sub{}, 'refresh')
}, $args);
$self->getUserFavorites( sub{}, { _cacheAction => QOBUZ_DELETE_CACHE } );
$self->getUserFavoriteIds( sub{}, { _cacheAction => QOBUZ_DELETE_CACHE } );
$self->getUserFavoriteStatus( sub{}, { type => 'album', item_id => $args->{album_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{album_ids};
$self->getUserFavoriteStatus( sub{}, { type => 'artist', item_id => $args->{artist_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{artist_ids};
$self->getUserFavoriteStatus( sub{}, { type => 'track', item_id => $args->{track_ids}, _cacheAction => QOBUZ_DELETE_CACHE } ) if $args->{track_ids};
}, $params);
}

sub getUserPlaylists {
Expand Down Expand Up @@ -716,10 +776,15 @@ sub _get {

my $cacheKey = $url . ($params->{_user_cache} ? $self->userId : '');

if ($params->{_wipecache}) {
if ($params->{_cacheAction}) {
$cache->remove($cacheKey);
if ( $params->{_cacheAction} != QOBUZ_REFRESH_CACHE ) {
$cb->();
return;
}
}


if (!$params->{_nocache} && (my $cached = $cache->get($cacheKey))) {
if ( main::DEBUGLOG && $log->is_debug ) {
$log->debug("found cached response: " . Data::Dump::dump($cached));
Expand Down
4 changes: 3 additions & 1 deletion API/Common.pm
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use Exporter::Lite;

our @EXPORT = qw(
QOBUZ_BASE_URL QOBUZ_DEFAULT_EXPIRY QOBUZ_USER_DATA_EXPIRY QOBUZ_EDITORIAL_EXPIRY QOBUZ_DEFAULT_LIMIT QOBUZ_LIMIT QOBUZ_USERDATA_LIMIT
QOBUZ_STREAMING_MP3 QOBUZ_STREAMING_FLAC QOBUZ_STREAMING_FLAC_HIRES QOBUZ_STREAMING_FLAC_HIRES2
QOBUZ_STREAMING_MP3 QOBUZ_STREAMING_FLAC QOBUZ_STREAMING_FLAC_HIRES QOBUZ_STREAMING_FLAC_HIRES2 QOBUZ_DELETE_CACHE QOBUZ_REFRESH_CACHE
_precacheAlbum _precacheTracks precacheTrack isClassique
);

Expand All @@ -27,6 +27,8 @@ use constant QOBUZ_STREAMING_MP3 => 5;
use constant QOBUZ_STREAMING_FLAC => 6;
use constant QOBUZ_STREAMING_FLAC_HIRES => 7;
use constant QOBUZ_STREAMING_FLAC_HIRES2 => 27;
use constant QOBUZ_DELETE_CACHE => 1;
use constant QOBUZ_REFRESH_CACHE => 2;

my $cache;
my $prefs = preferences('plugin.qobuz');
Expand Down
37 changes: 21 additions & 16 deletions Plugin.pm
Original file line number Diff line number Diff line change
Expand Up @@ -754,10 +754,8 @@ sub QobuzArtist {
}],
};

$api->getUserFavorites(sub {
my $favorites = shift;
my $artistId = $artist->{id};
my $isFavorite = ($favorites && $favorites->{artists}) ? grep { $_->{id} eq $artistId } @{$favorites->{artists}->{items}} : 0;
$api->getUserFavoriteStatus(sub {
my $isFavorite = shift->{status};

push @$items, {
name => cstring($client, $isFavorite ? 'PLUGIN_QOBUZ_REMOVE_FAVORITE_ARTIST' : 'PLUGIN_QOBUZ_ADD_FAVORITE_ARTIST', $artist->{name}),
Expand All @@ -772,6 +770,9 @@ sub QobuzArtist {
$cb->({
items => $items
});
}, {
type => 'artist',
item_id => $artist->{id},
});
}, $args->{artistId});
}
Expand Down Expand Up @@ -992,13 +993,13 @@ sub QobuzUserFavorites {
sub QobuzManageFavorites {
my ($client, $cb, $params, $args) = @_;

getAPIHandler($client)->getUserFavorites(sub {
getAPIHandler($client)->getUserFavoriteIds(sub {
my $favorites = shift;

my $items = [];

if ( (my $artist = $args->{artist}) && (my $artistId = $args->{artistId}) ) {
my $isFavorite = grep { $_->{id} eq $artistId } @{$favorites->{artists}->{items}};
my $isFavorite = grep { $_ eq $artistId } @{$favorites->{artists}};

push @$items, {
name => cstring($client, $isFavorite ? 'PLUGIN_QOBUZ_REMOVE_FAVORITE_ARTIST' : 'PLUGIN_QOBUZ_ADD_FAVORITE_ARTIST', $artist),
Expand All @@ -1011,7 +1012,7 @@ sub QobuzManageFavorites {
}

if ( (my $album = $args->{album}) && (my $albumId = $args->{albumId}) ) {
my $isFavorite = grep { $_->{id} eq $albumId } @{$favorites->{albums}->{items}};
my $isFavorite = grep { $_ eq $albumId } @{$favorites->{albums}};

push @$items, {
name => cstring($client, $isFavorite ? 'PLUGIN_QOBUZ_REMOVE_FAVORITE_RELEASE' : 'PLUGIN_QOBUZ_ADD_FAVORITE_RELEASE', $album),
Expand All @@ -1024,7 +1025,7 @@ sub QobuzManageFavorites {
}

if ( (my $title = $args->{title}) && (my $trackId = $args->{trackId}) ) {
my $isFavorite = grep { $_->{id} eq $trackId } @{$favorites->{tracks}->{items}};
my $isFavorite = grep { $_ eq $trackId } @{$favorites->{tracks}};

push @$items, {
name => cstring($client, $isFavorite ? 'PLUGIN_QOBUZ_REMOVE_FAVORITE_TRACK' : 'PLUGIN_QOBUZ_ADD_FAVORITE_TRACK', $title),
Expand All @@ -1039,7 +1040,7 @@ sub QobuzManageFavorites {
$cb->( {
items => $items
} );
}, 'refresh');
}, { _cacheAction => QOBUZ_REFRESH_CACHE } );
}

sub QobuzAddFavorite {
Expand Down Expand Up @@ -1172,9 +1173,8 @@ sub QobuzGetTracks {

if (!$album) { # the album does not exist in the Qobuz library
$log->warn("Get album ($albumId) failed");
$api->getUserFavorites(sub {
my $favorites = shift;
my $isFavorite = ($favorites && $favorites->{albums}) ? grep { $_->{id} eq $albumId } @{$favorites->{albums}->{items}} : 0;
$api->getUserFavoriteStatus(sub {
my $isFavorite = shift->{status};

push @$items, {
name => cstring($client, 'PLUGIN_QOBUZ_ALBUM_NOT_FOUND'),
Expand All @@ -1196,7 +1196,10 @@ sub QobuzGetTracks {
$cb->({
items => $items,
}, @_ );
});
}, {
type => 'album',
item_id => $albumId,
});
return;

} elsif (!$album->{streamable} && !$prefs->get('playSamples')) { # the album is not streamable
Expand Down Expand Up @@ -1448,9 +1451,8 @@ sub QobuzGetTracks {
}
}

$api->getUserFavorites(sub {
my $favorites = shift;
my $isFavorite = ($favorites && $favorites->{albums}) ? grep { $_->{id} eq $albumId } @{$favorites->{albums}->{items}} : 0;
$api->getUserFavoriteStatus(sub {
my $isFavorite = shift->{status};

push @$items, {
name => cstring($client, $isFavorite ? 'PLUGIN_QOBUZ_REMOVE_FAVORITE_RELEASE' : 'PLUGIN_QOBUZ_ADD_FAVORITE_RELEASE', $album->{title}),
Expand Down Expand Up @@ -1549,6 +1551,9 @@ sub QobuzGetTracks {
$cb->({
items => $items,
}, @_ );
}, {
type => 'album',
item_id => $albumId,
});
}, $albumId);
}
Expand Down