From 23ec0e3751848d5ff2313450243ac9cd6d0b50f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Mielcarek?= Date: Thu, 17 Nov 2022 00:33:07 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20et=20suppression=20dans=20la=20playlist?= =?UTF-8?q?.=20D=C3=A9but=20de=20l'ajout=20d'une=20image=20=C3=A0=20la=20p?= =?UTF-8?q?laylist.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/dafl_project_flutter/lib/api/api.dart | 80 +++++++++++++++++-- .../lib/api/in_app_browser.dart | 5 +- .../lib/controller/controller.dart | 4 + 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/Sources/dafl_project_flutter/lib/api/api.dart b/Sources/dafl_project_flutter/lib/api/api.dart index 6a3871a..bd35eee 100644 --- a/Sources/dafl_project_flutter/lib/api/api.dart +++ b/Sources/dafl_project_flutter/lib/api/api.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'dart:io'; import 'dart:math'; +import 'dart:typed_data'; import 'package:dafl_project_flutter/main.dart'; import 'package:http/http.dart' as http; import 'package:crypto/crypto.dart'; @@ -176,14 +178,41 @@ class Api { return info; } - addToPLaylist(String id) async { - dynamic res = await _getPlaylist(); - if (!res) { - res = await _createPlaylist(); + Future _isInPlaylist(String idTrack, String idPlaylist) async { + var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks', + {'limit': '50', 'fields': 'items(track(id))'}); + var token = await _getAccessToken(); + _setResponse(await _client.get(url, headers: { + 'Authorization': '$_tokenType $token', + 'Content-Type': 'application/json' + })); + var decodedResponse = jsonDecode(utf8.decode(_response.bodyBytes)) as Map; + var res = decodedResponse['items'] + .where((element) => element['track']['id'] == idTrack) + .toList(); + if (res.length >= 1) { + return true; } + return false; + } + + addToPLaylist(String idTrack) async { + var idPlaylist = await _getPlaylist(); + if (idPlaylist == null) { + idPlaylist = await _createPlaylist(); + } else { + if (await _isInPlaylist(idTrack, idPlaylist)) return; + } + var token = await _getAccessToken(); + var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks', + {'uris': 'spotify:track:$idTrack'}); + _setResponse(await _client.post(url, headers: { + 'Authorization': '$_tokenType $token', + 'Content-Type': 'application/json' + })); } - dynamic _getPlaylist() async { + Future _getPlaylist() async { var url = Uri.https('api.spotify.com', 'v1/me/playlists', {'limit': '50'}); var token = await _getAccessToken(); _setResponse(await _client.get(url, headers: { @@ -198,7 +227,7 @@ class Api { return daflplaylist[0]['uri'].substring( 17); //17 char because format is 'spotify:playlist:MYPLAYLISTID' } - return false; + return null; } _createPlaylist() async { @@ -218,7 +247,44 @@ class Api { 'public': 'true' }))); var decodedResponse = jsonDecode(utf8.decode(_response.bodyBytes)) as Map; - return decodedResponse['id']; + var idPlaylist = decodedResponse['id']; + url = Uri.https('api.spotify.com', 'v1/playlists/playlist_id/images'); + String imagePath = 'assets/images/icon_App.png'; + File imagefile = File(imagePath); + Uint8List imagebytes = await imagefile.readAsBytes(); + String base64string = base64.encode(imagebytes); + _setResponse(await _client.put(url, + headers: { + 'Accept': 'application/json', + 'Authorization': '$_tokenType $token', + 'Content-Type': 'application/json' + }, + body: base64string)); + decodedResponse = jsonDecode(utf8.decode(_response.bodyBytes)) as Map; + return idPlaylist; + } + + removeFromPlaylist(String idTrack) async { + var idPlaylist = await _getPlaylist(); + if (idPlaylist == null) { + return; + } + if (await _isInPlaylist(idTrack, idPlaylist)) { + var token = await _getAccessToken(); + var url = Uri.https('api.spotify.com', 'v1/playlists/$idPlaylist/tracks'); + var jsonVar = jsonEncode({ + "tracks": [ + {'uri': 'spotify:track:$idTrack'} + ] + }); + jsonEncode({'uri': 'spotify:track:$idTrack'}); + _setResponse(await _client.delete(url, + headers: { + 'Authorization': '$_tokenType $token', + 'Content-Type': 'application/json' + }, + body: jsonVar)); + } } Future getIdUser() async { diff --git a/Sources/dafl_project_flutter/lib/api/in_app_browser.dart b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart index edd6737..f7cccc5 100644 --- a/Sources/dafl_project_flutter/lib/api/in_app_browser.dart +++ b/Sources/dafl_project_flutter/lib/api/in_app_browser.dart @@ -27,9 +27,8 @@ class MyInAppBrowser extends InAppBrowser { if (url!.origin + url.path == MyApp.api.redirectUri) { try { await MyApp.api.requestUserAuthorization(url); - //TODO : finir d'implémenter : addToPlaylist - //var id = await MyApp.api.getCurrentlyPlayingTrack(); - //await MyApp.api.addToPLaylist(id); + /*var id = await MyApp.api.getCurrentlyPlayingTrack(); + await MyApp.api.addToPLaylist(id);*/ //TODO : end the adding of playlist image } on ApiException { // TODO : add notification to show that an error occured } finally { diff --git a/Sources/dafl_project_flutter/lib/controller/controller.dart b/Sources/dafl_project_flutter/lib/controller/controller.dart index 1f78ea5..6391931 100644 --- a/Sources/dafl_project_flutter/lib/controller/controller.dart +++ b/Sources/dafl_project_flutter/lib/controller/controller.dart @@ -15,6 +15,10 @@ class Controller { late User currentUser; + Controller() { + currentUser = User('', ''); //TODO : remove this line + } + void save(User userToSave) { saver.save(userToSave); }