|
|
@ -28,8 +28,7 @@ class MusicViewModel {
|
|
|
|
|
|
|
|
|
|
|
|
return _getMusicFromResponse(responseData);
|
|
|
|
return _getMusicFromResponse(responseData);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error retrieving music information : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error retrieving music information : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -49,13 +48,10 @@ class MusicViewModel {
|
|
|
|
artists);
|
|
|
|
artists);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Music>> getMusicsWithName(String name,
|
|
|
|
Future<List<Music>> getMusicsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
{int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http.get(
|
|
|
|
var response = await http
|
|
|
|
Uri.parse(
|
|
|
|
.get(Uri.parse('$API_URL/search?q=track%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: {
|
|
|
|
'$API_URL/search?q=track%3A$name&type=track&market=fr&limit=$limit&offset=$offset'),
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@ -65,18 +61,15 @@ class MusicViewModel {
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Music>> getMusicsWithArtistName(String name,
|
|
|
|
Future<List<Music>> getMusicsWithArtistName(String name,
|
|
|
|
{int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
{int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http.get(
|
|
|
|
var response = await http
|
|
|
|
Uri.parse(
|
|
|
|
.get(Uri.parse('$API_URL/search?q=artist%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: {
|
|
|
|
'$API_URL/search?q=artist%3A$name&type=track&market=fr&limit=$limit&offset=$offset'),
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@ -86,24 +79,19 @@ class MusicViewModel {
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<Artist> getArtistWithName(String name, {String market = "FR"}) async {
|
|
|
|
Future<Artist> getArtistWithName(String name, {String market = "FR"}) async {
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http.get(
|
|
|
|
var response = await http.get(Uri.parse('$API_URL/search?q=artist%3A$name&type=artist&market=$market'), headers: {
|
|
|
|
Uri.parse(
|
|
|
|
|
|
|
|
'$API_URL/search?q=artist%3A$name&type=artist&market=$market'),
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
final responseData = jsonDecode(response.body);
|
|
|
|
final responseData = jsonDecode(response.body);
|
|
|
|
List<Artist> artists =
|
|
|
|
List<Artist> artists = List<Artist>.from(responseData['artists']['items'].map((artist) {
|
|
|
|
List<Artist>.from(responseData['artists']['items'].map((artist) {
|
|
|
|
|
|
|
|
String image = '';
|
|
|
|
String image = '';
|
|
|
|
if (!artist['images'].isEmpty) {
|
|
|
|
if (!artist['images'].isEmpty) {
|
|
|
|
image = artist['images'][0]['url'];
|
|
|
|
image = artist['images'][0]['url'];
|
|
|
@ -119,25 +107,21 @@ class MusicViewModel {
|
|
|
|
|
|
|
|
|
|
|
|
throw Exception('Artist not found : ${name}');
|
|
|
|
throw Exception('Artist not found : ${name}');
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error retrieving artist information : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error retrieving artist information : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Artist>> getArtistsWithName(String name,
|
|
|
|
Future<List<Artist>> getArtistsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
{int limit = 20, int offset = 0, String market = "FR"}) async {
|
|
|
|
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http.get(
|
|
|
|
var response = await http.get(
|
|
|
|
Uri.parse(
|
|
|
|
Uri.parse('$API_URL/search?q=artist%3A$name&type=artist&market=$market&limit=$limit&offset=$offset'),
|
|
|
|
'$API_URL/search?q=artist%3A$name&type=artist&market=$market&limit=$limit&offset=$offset'),
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
headers: {
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
if (response.statusCode == 200) {
|
|
|
|
final responseData = jsonDecode(response.body);
|
|
|
|
final responseData = jsonDecode(response.body);
|
|
|
|
List<Artist> artists =
|
|
|
|
List<Artist> artists = List<Artist>.from(responseData['artists']['items'].map((artist) {
|
|
|
|
List<Artist>.from(responseData['artists']['items'].map((artist) {
|
|
|
|
|
|
|
|
String image = '';
|
|
|
|
String image = '';
|
|
|
|
if (!artist['images'].isEmpty) {
|
|
|
|
if (!artist['images'].isEmpty) {
|
|
|
|
image = artist['images'][0]['url'];
|
|
|
|
image = artist['images'][0]['url'];
|
|
|
@ -147,17 +131,13 @@ class MusicViewModel {
|
|
|
|
|
|
|
|
|
|
|
|
return artists;
|
|
|
|
return artists;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving artist : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving artist : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Music>> getTopMusicsWithArtistId(String id,
|
|
|
|
Future<List<Music>> getTopMusicsWithArtistId(String id, {String market = "FR"}) async {
|
|
|
|
{String market = "FR"}) async {
|
|
|
|
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http.get(
|
|
|
|
var response = await http.get(Uri.parse('$API_URL/artists/$id/top-tracks?market=$market'), headers: {
|
|
|
|
Uri.parse('$API_URL/artists/$id/top-tracks?market=$market'),
|
|
|
|
|
|
|
|
headers: {
|
|
|
|
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@ -167,16 +147,13 @@ class MusicViewModel {
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Music>> getMusicsWithPlaylistId(String id,
|
|
|
|
Future<List<Music>> getMusicsWithPlaylistId(String id, {String market = "FR"}) async {
|
|
|
|
{String market = "FR"}) async {
|
|
|
|
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var response = await http
|
|
|
|
var response = await http.get(Uri.parse('$API_URL/playlists/$id?market=$market'), headers: {
|
|
|
|
.get(Uri.parse('$API_URL/playlists/$id?market=$market'), headers: {
|
|
|
|
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
'Authorization': 'Bearer $accessToken',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@ -192,13 +169,11 @@ class MusicViewModel {
|
|
|
|
|
|
|
|
|
|
|
|
return musics;
|
|
|
|
return musics;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Music>> getMusicsWithIds(List<String> ids,
|
|
|
|
Future<List<Music>> getMusicsWithIds(List<String> ids, {String market = "FR"}) async {
|
|
|
|
{String market = "FR"}) async {
|
|
|
|
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
var accessToken = await _token.getAccessToken();
|
|
|
|
String url = API_URL + '/tracks?market=$market&ids=';
|
|
|
|
String url = API_URL + '/tracks?market=$market&ids=';
|
|
|
|
|
|
|
|
|
|
|
@ -216,8 +191,7 @@ class MusicViewModel {
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
return _getMusicFromResponse(track);
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw Exception(
|
|
|
|
throw Exception('Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -227,12 +201,10 @@ class MusicViewModel {
|
|
|
|
List<Music> musics = [];
|
|
|
|
List<Music> musics = [];
|
|
|
|
Artist artist = await getArtistWithName(name, market: market);
|
|
|
|
Artist artist = await getArtistWithName(name, market: market);
|
|
|
|
musics.addAll(await getTopMusicsWithArtistId(artist.id));
|
|
|
|
musics.addAll(await getTopMusicsWithArtistId(artist.id));
|
|
|
|
musics.addAll(await getMusicsWithName(name,
|
|
|
|
musics.addAll(await getMusicsWithName(name, limit: limit, offset: offset, market: market));
|
|
|
|
limit: limit, offset: offset, market: market));
|
|
|
|
|
|
|
|
return musics;
|
|
|
|
return musics;
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
return await getMusicsWithName(name,
|
|
|
|
return await getMusicsWithName(name, limit: limit, offset: offset, market: market);
|
|
|
|
limit: limit, offset: offset, market: market);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -255,21 +227,18 @@ class MusicViewModel {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<List<Tuple2<String, Music>>> getHistoryCapsulesMonthWhitIdUser(
|
|
|
|
Future<List<Tuple2<int, Music>>> getHistoryCapsulesMonthWhitIdUser(String idUser, int month, int year) async {
|
|
|
|
String idUser, int month, int year) async {
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
List<Tuple2<String, Music>> capsules = [];
|
|
|
|
List<Tuple2<int, Music>> capsules = [];
|
|
|
|
var capsulesData = await _musicService.getHistoryCapsulesMonthWhitIdUser(
|
|
|
|
var capsulesData = await _musicService.getHistoryCapsulesMonthWhitIdUser(idUser, month, year);
|
|
|
|
idUser, month, year);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var musics = await getMusicsWithIds(
|
|
|
|
var musics = await getMusicsWithIds(capsulesData.map((capsule) => capsule.item2).toList());
|
|
|
|
capsulesData.map((capsule) => capsule.item2).toList());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var capsule in capsulesData) {
|
|
|
|
for (var capsule in capsulesData) {
|
|
|
|
var music = musics.firstWhere((music) => music.id == capsule.item2);
|
|
|
|
var music = musics.firstWhere((music) => music.id == capsule.item2);
|
|
|
|
|
|
|
|
print(capsule.item1);
|
|
|
|
capsules.add(Tuple2(capsule.item1, music));
|
|
|
|
capsules.add(Tuple2(capsule.item1, music));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return capsules;
|
|
|
|
return capsules;
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
print(e);
|
|
|
|
print(e);
|
|
|
|