getArtistAlbums method
Future<List>
getArtistAlbums(
- String channelId,
- String params, {
- int? limit = 100,
- ArtistOrderType? order,
Get the full list of an artist's albums, singles or shows.
channelIdbrowseIdof the artist as returned by getArtist.paramsParams obtained by getArtist.limitNumber of albums to return.nullretrieves them all. (Default:100).orderOrder of albums to return. (Default: default order).
Returns List of albums in the format of getLibraryAlbums, except artists key is missing. // TODO getLibraryAlbums is currently missing
Implementation
Future<List> getArtistAlbums(
String channelId,
String params, {
int? limit = 100,
ArtistOrderType? order,
}) async {
const endpoint = 'browse';
final body = <String, dynamic>{'browseId': channelId, 'params': params};
var response = await sendRequest(endpoint, body);
Future<JsonMap> requestFunc(String additionalParams) =>
sendRequest(endpoint, body, additionalParams: additionalParams);
List parseFunc(List<JsonMap> contents) => parseAlbums(contents);
JsonMap results;
if (order != null) {
// pick the correct continuation from response depending on the order chosen
final sortOptions =
nav(response, [
...SINGLE_COLUMN_TAB,
...SECTION,
...HEADER_SIDE,
'endItems',
0,
'musicSortFilterButtonRenderer',
'menu',
'musicMultiSelectMenuRenderer',
'options',
])
as List;
final continuation =
sortOptions
.where(
(option) =>
(nav(option, [...MULTI_SELECT, ...TITLE_TEXT])
as String)
.toLowerCase() ==
order.value.toLowerCase(),
)
.map(
(option) => nav(option, [
...MULTI_SELECT,
'selectedCommand',
'commandExecutorCommand',
'commands',
-1,
'browseSectionListReloadEndpoint',
]),
)
.cast<dynamic>()
.firstWhere((result) => result != null, orElse: () => null)
as JsonMap?;
// if a valid order was provided, request continuation and replace original response
if (continuation != null) {
final additionalParams = getReloadableContinuationParams({
'continuations': [continuation['continuation']],
});
response = await requestFunc(additionalParams);
results =
nav(response, [...SECTION_LIST_CONTINUATION, ...CONTENT])
as JsonMap;
} else {
throw Exception('Invalid order parameter $order');
}
} else {
// just use the results from the first request
results =
nav(response, [...SINGLE_COLUMN_TAB, ...SECTION_LIST_ITEM])
as JsonMap;
}
final contents =
nav(results, GRID_ITEMS, nullIfAbsent: true) ??
nav(results, CAROUSEL_CONTENTS);
final albums = parseAlbums(List<JsonMap>.from(contents as List));
final remainingResults = nav(results, GRID, nullIfAbsent: true) as JsonMap;
if (remainingResults.containsKey('continuations')) {
final remainingLimit = limit == null ? null : limit - albums.length;
albums.addAll(
await getContinuations(
remainingResults,
'gridContinuation',
remainingLimit,
requestFunc,
parseFunc,
),
);
}
return albums;
}