From 8f44cbc46fec766d8b61b8121b8dedd6bca6af54 Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Mon, 24 Jul 2023 14:15:29 +0200 Subject: [PATCH 1/4] add model :hammer: --- Sources/justMUSIC/lib/model/Comment.dart | 24 +++++++ Sources/justMUSIC/lib/model/Music.dart | 37 ++++++++++ Sources/justMUSIC/lib/model/Post.dart | 55 +++++++++++++++ Sources/justMUSIC/lib/model/User.dart | 38 ++++++++++ Sources/justMUSIC/pubspec.lock | 90 ++++++++++++++++-------- 5 files changed, 213 insertions(+), 31 deletions(-) create mode 100644 Sources/justMUSIC/lib/model/Comment.dart create mode 100644 Sources/justMUSIC/lib/model/Music.dart create mode 100644 Sources/justMUSIC/lib/model/Post.dart create mode 100644 Sources/justMUSIC/lib/model/User.dart diff --git a/Sources/justMUSIC/lib/model/Comment.dart b/Sources/justMUSIC/lib/model/Comment.dart new file mode 100644 index 0000000..4c8d269 --- /dev/null +++ b/Sources/justMUSIC/lib/model/Comment.dart @@ -0,0 +1,24 @@ +class Comment { + final int _id; + String _text; + DateTime _date; + List comments = []; + + // Constructor + Comment(this._id, this._text, this._date); + + // Getters and setters + int get id => _id; + + String get text => _text; + + set text(String value) { + _text = value; + } + + DateTime get date => _date; + + set date(DateTime value) { + _date = value; + } +} diff --git a/Sources/justMUSIC/lib/model/Music.dart b/Sources/justMUSIC/lib/model/Music.dart new file mode 100644 index 0000000..7b690d8 --- /dev/null +++ b/Sources/justMUSIC/lib/model/Music.dart @@ -0,0 +1,37 @@ +class Music { + final int _id; + String _title; + String _cover; + String _singer; + DateTime _date; + + // Constructor + Music(this._id, this._title, this._cover, this._singer, this._date); + + //Getters and setters + int get id => _id; + + String get title => _title; + + set title(String value) { + _title = value; + } + + String get cover => _cover; + + DateTime get date => _date; + + set date(DateTime value) { + _date = value; + } + + String get singer => _singer; + + set singer(String value) { + _singer = value; + } + + set cover(String value) { + _cover = value; + } +} diff --git a/Sources/justMUSIC/lib/model/Post.dart b/Sources/justMUSIC/lib/model/Post.dart new file mode 100644 index 0000000..c92f3fd --- /dev/null +++ b/Sources/justMUSIC/lib/model/Post.dart @@ -0,0 +1,55 @@ +class Post { + final int _id; + final int _idUser; + String? _description; + int _idMusic; + String _location; + int _nblikes; + String? _selfie; + DateTime _date; + + // Constructor + Post(this._id, this._idUser, this._description, this._idMusic, this._location, + this._nblikes, this._selfie, this._date); + + //Getters and setters + int get id => _id; + + int get idUser => _idUser; + + String? get description => _description; + + set description(String? value) { + _description = value; + } + + int get idMusic => _idMusic; + + set idMusic(int value) { + _idMusic = value; + } + + String get location => _location; + + set location(String value) { + _location = value; + } + + int get nblikes => _nblikes; + + set nblikes(int value) { + _nblikes = value; + } + + String? get selfie => _selfie; + + set selfie(String? value) { + _selfie = value; + } + + DateTime get date => _date; + + set date(DateTime value) { + _date = value; + } +} diff --git a/Sources/justMUSIC/lib/model/User.dart b/Sources/justMUSIC/lib/model/User.dart new file mode 100644 index 0000000..f9a7607 --- /dev/null +++ b/Sources/justMUSIC/lib/model/User.dart @@ -0,0 +1,38 @@ +class User { + final int _id; + String _pseudo; + String _country; + String _mail; + String _pp; + List friends = []; + + // Constructor + User(this._id, this._pseudo, this._country, this._mail, this._pp); + + //Getters and setters + int get id => _id; + + String get pseudo => _pseudo; + + set pseudo(String value) { + _pseudo = value; + } + + String get country => _country; + + set country(String value) { + _country = value; + } + + String get mail => _mail; + + set mail(String value) { + _mail = value; + } + + String get pp => _pp; + + set pp(String value) { + _pp = value; + } +} diff --git a/Sources/justMUSIC/pubspec.lock b/Sources/justMUSIC/pubspec.lock index 4fe9359..035d204 100644 --- a/Sources/justMUSIC/pubspec.lock +++ b/Sources/justMUSIC/pubspec.lock @@ -5,49 +5,56 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" flutter: @@ -59,7 +66,8 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" + url: "https://pub.dev" source: hosted version: "2.0.2" flutter_test: @@ -67,39 +75,52 @@ packages: description: flutter source: sdk version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted version: "2.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" sky_engine: @@ -111,50 +132,57 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: dart: ">=2.18.2 <3.0.0" From e40560aa7dcf8907f9376aae6e5e369d3c7acce2 Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Wed, 26 Jul 2023 13:45:09 +0200 Subject: [PATCH 2/4] add tokenSpotify class :white_check_mark: --- .../lib/view_model/CommentViewModel.dart | 10 +++++ .../lib/view_model/MusicViewModel.dart | 19 ++++++++ .../lib/view_model/PostViewModel.dart | 31 +++++++++++++ .../lib/view_model/TokenSpotify.dart | 44 +++++++++++++++++++ .../lib/view_model/UserViewModel.dart | 13 ++++++ Sources/justMUSIC/pubspec.lock | 26 ++++++++++- Sources/justMUSIC/pubspec.yaml | 1 + 7 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Sources/justMUSIC/lib/view_model/CommentViewModel.dart create mode 100644 Sources/justMUSIC/lib/view_model/MusicViewModel.dart create mode 100644 Sources/justMUSIC/lib/view_model/PostViewModel.dart create mode 100644 Sources/justMUSIC/lib/view_model/TokenSpotify.dart create mode 100644 Sources/justMUSIC/lib/view_model/UserViewModel.dart diff --git a/Sources/justMUSIC/lib/view_model/CommentViewModel.dart b/Sources/justMUSIC/lib/view_model/CommentViewModel.dart new file mode 100644 index 0000000..c4d591f --- /dev/null +++ b/Sources/justMUSIC/lib/view_model/CommentViewModel.dart @@ -0,0 +1,10 @@ +import '../model/Comment.dart'; + +class CommentViewModel { + + // Methods + List getCommentsPost(int idPost) { + throw new Error(); + } + +} \ No newline at end of file diff --git a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart new file mode 100644 index 0000000..f5f8b3b --- /dev/null +++ b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart @@ -0,0 +1,19 @@ +import '../model/Music.dart'; + +class MusicViewModel { + + final String API_URL = ""; + + // Methods + Music getMusic(int id) { + throw new Error(); + } + + Music getMusicWithName(String name) { + throw new Error(); + } + + List getMusics(String name) { + throw new Error(); + } +} \ No newline at end of file diff --git a/Sources/justMUSIC/lib/view_model/PostViewModel.dart b/Sources/justMUSIC/lib/view_model/PostViewModel.dart new file mode 100644 index 0000000..d1bcca3 --- /dev/null +++ b/Sources/justMUSIC/lib/view_model/PostViewModel.dart @@ -0,0 +1,31 @@ +import 'package:justmusic/model/Post.dart'; + +class PostViewModel { + List _postsFriends = []; + List _bestPosts = []; + + // Constructor + PostViewModel(); + + // Getters and setters + List get postsFriends => _postsFriends; + + List get bestPosts => _bestPosts; + + // Methods + List getPostsFriends() { + throw new Error(); + } + + List getMorePostsFriends() { + throw new Error(); + } + + List getBestPosts() { + throw new Error(); + } + + List getMoreBestPosts() { + throw new Error(); + } +} diff --git a/Sources/justMUSIC/lib/view_model/TokenSpotify.dart b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart new file mode 100644 index 0000000..b84d15c --- /dev/null +++ b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart @@ -0,0 +1,44 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +class TokenSpotify { + final String clientId = 'd9b82921bbdf43efa15d0c34c28c6f93'; + final String _clientSecret = 'ba01687f59ea4ab7ad00c769e89e44d8'; + late String _accessToken; + late DateTime _tokenEnd; + + TokenSpotify() { + _tokenEnd = DateTime.now().add(Duration(seconds: -1)); + } + + Future getAccessToken() async { + if (_isTokenExpired()) { + await _refreshToken(); + } + return _accessToken; + } + + _refreshToken() async { + final basicAuth = base64Encode(utf8.encode('$clientId:$_clientSecret')); + final response = await http.post( + Uri.parse('https://accounts.spotify.com/api/token'), + headers: { + 'Authorization': 'Basic $basicAuth', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: 'grant_type=client_credentials', + ); + + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + _accessToken = responseData['access_token']; + _tokenEnd = DateTime.now().add(Duration(seconds: responseData['expires_in'])); + } else { + print('Erreur lors de l\'actualisation du token : ${response.statusCode}'); + } + } + + bool _isTokenExpired() { + return DateTime.now().isAfter(_tokenEnd); + } +} diff --git a/Sources/justMUSIC/lib/view_model/UserViewModel.dart b/Sources/justMUSIC/lib/view_model/UserViewModel.dart new file mode 100644 index 0000000..bea7efd --- /dev/null +++ b/Sources/justMUSIC/lib/view_model/UserViewModel.dart @@ -0,0 +1,13 @@ +import '../model/User.dart'; + +class UserViewModel { + User? _userCurrent; + + // Constructor + UserViewModel(); + + // Methods + User getUser(int id) { + throw new Error(); + } +} diff --git a/Sources/justMUSIC/pubspec.lock b/Sources/justMUSIC/pubspec.lock index 035d204..f1937c2 100644 --- a/Sources/justMUSIC/pubspec.lock +++ b/Sources/justMUSIC/pubspec.lock @@ -75,6 +75,22 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" js: dependency: transitive description: @@ -176,6 +192,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.16" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" vector_math: dependency: transitive description: @@ -185,4 +209,4 @@ packages: source: hosted version: "2.1.4" sdks: - dart: ">=2.18.2 <3.0.0" + dart: ">=2.19.0 <3.0.0" diff --git a/Sources/justMUSIC/pubspec.yaml b/Sources/justMUSIC/pubspec.yaml index 03f3822..d54e0cf 100644 --- a/Sources/justMUSIC/pubspec.yaml +++ b/Sources/justMUSIC/pubspec.yaml @@ -31,6 +31,7 @@ environment: dependencies: flutter: sdk: flutter + http: ^0.13.5 # The following adds the Cupertino Icons font to your application. From a6e617e59c788e55bdd80c0368de48ca5ebe8fac Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Wed, 26 Jul 2023 17:28:00 +0200 Subject: [PATCH 3/4] Improvement of the model (addition of the class artist and modification of the class music) :art: and realization of the class MusicViewModel with test :white_check_mark: --- Sources/justMUSIC/lib/model/Artist.dart | 10 ++ Sources/justMUSIC/lib/model/Music.dart | 32 ++++--- Sources/justMUSIC/lib/model/Post.dart | 6 +- .../lib/view_model/CommentViewModel.dart | 4 +- .../lib/view_model/MusicViewModel.dart | 93 +++++++++++++++++-- .../lib/view_model/TokenSpotify.dart | 5 +- Sources/justMUSIC/test/Music_test.dart | 35 +++++++ 7 files changed, 158 insertions(+), 27 deletions(-) create mode 100644 Sources/justMUSIC/lib/model/Artist.dart create mode 100644 Sources/justMUSIC/test/Music_test.dart diff --git a/Sources/justMUSIC/lib/model/Artist.dart b/Sources/justMUSIC/lib/model/Artist.dart new file mode 100644 index 0000000..1a7ae04 --- /dev/null +++ b/Sources/justMUSIC/lib/model/Artist.dart @@ -0,0 +1,10 @@ +class Artist { + String _id; + String _name; + + Artist(this._id, this._name); + + String get id => _id; + + String get name => _name; +} diff --git a/Sources/justMUSIC/lib/model/Music.dart b/Sources/justMUSIC/lib/model/Music.dart index 7b690d8..e50223f 100644 --- a/Sources/justMUSIC/lib/model/Music.dart +++ b/Sources/justMUSIC/lib/model/Music.dart @@ -1,15 +1,19 @@ +import 'Artist.dart'; + class Music { - final int _id; + final String _id; String _title; String _cover; - String _singer; + String _previewUrl; DateTime _date; + List _artists; // Constructor - Music(this._id, this._title, this._cover, this._singer, this._date); + Music(this._id, this._title, this._cover, this._previewUrl, this._date, + this._artists); //Getters and setters - int get id => _id; + String get id => _id; String get title => _title; @@ -19,19 +23,25 @@ class Music { String get cover => _cover; + set cover(String value) { + _cover = value; + } + + String get previewUrl => _previewUrl; + + set previewUrl(String value) { + _previewUrl = value; + } + DateTime get date => _date; set date(DateTime value) { _date = value; } - String get singer => _singer; - - set singer(String value) { - _singer = value; - } + List get artists => _artists; - set cover(String value) { - _cover = value; + set artists(List value) { + _artists = value; } } diff --git a/Sources/justMUSIC/lib/model/Post.dart b/Sources/justMUSIC/lib/model/Post.dart index c92f3fd..0c248dd 100644 --- a/Sources/justMUSIC/lib/model/Post.dart +++ b/Sources/justMUSIC/lib/model/Post.dart @@ -2,7 +2,7 @@ class Post { final int _id; final int _idUser; String? _description; - int _idMusic; + String _idMusic; String _location; int _nblikes; String? _selfie; @@ -23,9 +23,9 @@ class Post { _description = value; } - int get idMusic => _idMusic; + String get idMusic => _idMusic; - set idMusic(int value) { + set idMusic(String value) { _idMusic = value; } diff --git a/Sources/justMUSIC/lib/view_model/CommentViewModel.dart b/Sources/justMUSIC/lib/view_model/CommentViewModel.dart index c4d591f..f4684e1 100644 --- a/Sources/justMUSIC/lib/view_model/CommentViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/CommentViewModel.dart @@ -1,10 +1,8 @@ import '../model/Comment.dart'; class CommentViewModel { - // Methods List getCommentsPost(int idPost) { throw new Error(); } - -} \ No newline at end of file +} diff --git a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart index f5f8b3b..5f789ee 100644 --- a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart @@ -1,19 +1,96 @@ +import 'dart:convert'; + +import 'package:justmusic/view_model/TokenSpotify.dart'; +import 'package:http/http.dart' as http; +import '../model/Artist.dart'; import '../model/Music.dart'; class MusicViewModel { + final String API_URL = "https://api.spotify.com/v1"; + late TokenSpotify _token; - final String API_URL = ""; + MusicViewModel() { + _token = new TokenSpotify(); + } // Methods - Music getMusic(int id) { - throw new Error(); + Future getMusic(String id) async { + var accessToken = await _token.getAccessToken(); + var response = await http.get(Uri.parse('$API_URL/tracks/$id'), headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + List artists = + List.from(responseData['artists'].map((artist) { + return Artist(artist['id'], artist['name']); + })); + + return Music( + responseData['id'], + responseData['name'], + responseData['album']['images'][0]['url'], + responseData['preview_url'], + DateTime.parse(responseData['album']['release_date']), + artists); + } else { + throw Exception( + 'Error retrieving music information : ${response.statusCode} ${response.reasonPhrase}'); + } } - Music getMusicWithName(String name) { - throw new Error(); + List _getMusicsFromResponse(Map responseData) { + List musics = []; + + List tracks = responseData['tracks']['items']; + for (var track in tracks) { + List artists = List.from(track['artists'].map((artist) { + return Artist(artist['id'], artist['name']); + })); + + musics.add(Music( + track['id'], + track['name'], + track['album']['images'][0]['url'], + track['preview_url'], + DateTime.now(), + artists)); + } + + return musics; } - List getMusics(String name) { - throw new Error(); + Future> getMusicsWithName(String name, {int limit = 20, int offset = 1}) async { + var accessToken = await _token.getAccessToken(); + var response = await http + .get(Uri.parse('$API_URL/search?q=track%3A$name&type=track&limit=$limit&offset=$offset'), headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + Map responseData = jsonDecode(response.body); + return _getMusicsFromResponse(responseData); + } else { + throw Exception( + 'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}'); + } + } + + Future> getMusicsWithArtistName(String name, {int limit = 20, int offset = 1}) async { + var accessToken = await _token.getAccessToken(); + var response = await http.get( + Uri.parse('$API_URL/search?q=artist%3A$name&type=track&limit=$limit&offset=$offset'), + headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + Map responseData = jsonDecode(response.body); + return _getMusicsFromResponse(responseData); + } else { + throw Exception( + 'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}'); + } } -} \ No newline at end of file +} diff --git a/Sources/justMUSIC/lib/view_model/TokenSpotify.dart b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart index b84d15c..fbdffac 100644 --- a/Sources/justMUSIC/lib/view_model/TokenSpotify.dart +++ b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart @@ -32,9 +32,10 @@ class TokenSpotify { if (response.statusCode == 200) { final responseData = jsonDecode(response.body); _accessToken = responseData['access_token']; - _tokenEnd = DateTime.now().add(Duration(seconds: responseData['expires_in'])); + _tokenEnd = + DateTime.now().add(Duration(seconds: responseData['expires_in'])); } else { - print('Erreur lors de l\'actualisation du token : ${response.statusCode}'); + print('Error refreshing token : ${response.statusCode}'); } } diff --git a/Sources/justMUSIC/test/Music_test.dart b/Sources/justMUSIC/test/Music_test.dart new file mode 100644 index 0000000..a5ef914 --- /dev/null +++ b/Sources/justMUSIC/test/Music_test.dart @@ -0,0 +1,35 @@ +import 'package:justmusic/model/Artist.dart'; +import 'package:justmusic/model/Music.dart'; +import 'package:justmusic/view_model/MusicViewModel.dart'; + +Future main() async { + MusicViewModel musicVM = new MusicViewModel(); + Music m = await musicVM.getMusic('295SxdR1DqunCNwd0U767w'); + print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); + print(m.date.toString() + " " + m.previewUrl); + for (Artist a in m.artists) { + print(a.id + ":" + a.name); + } + + print('\nMusics :'); + + List musics = await musicVM.getMusicsWithName('Onizuka'); + for (Music m in musics) { + print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); + print(m.date.toString() + " " + m.previewUrl); + for (Artist a in m.artists) { + print(a.id + ":" + a.name); + } + } + + print('\nMusics With Artist:'); + + List musics2 = await musicVM.getMusicsWithArtistName('PNL'); + for (Music m in musics2) { + print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); + print(m.date.toString() + " " + m.previewUrl); + for (Artist a in m.artists) { + print(a.id + ":" + a.name); + } + } +} From b226528042cb7ca9838d55422138af736723ffb1 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 26 Jul 2023 19:36:56 +0200 Subject: [PATCH 4/4] fix errors :bug: --- Sources/justMUSIC/lib/model/Artist.dart | 15 ++++++++--- Sources/justMUSIC/lib/model/Music.dart | 26 +++++++++---------- .../lib/view_model/MusicViewModel.dart | 12 ++++----- .../lib/view_model/TokenSpotify.dart | 2 +- Sources/justMUSIC/test/Music_test.dart | 23 ++++++++-------- 5 files changed, 43 insertions(+), 35 deletions(-) diff --git a/Sources/justMUSIC/lib/model/Artist.dart b/Sources/justMUSIC/lib/model/Artist.dart index 1a7ae04..847ab48 100644 --- a/Sources/justMUSIC/lib/model/Artist.dart +++ b/Sources/justMUSIC/lib/model/Artist.dart @@ -1,10 +1,17 @@ class Artist { String _id; - String _name; + String? _name; + String? _image; - Artist(this._id, this._name); + Artist(this._id, this._name, this._image); - String get id => _id; + String? get id => _id; - String get name => _name; + String? get name => _name; + + String? get image => _image; + + set image(String? value) { + _image = value; + } } diff --git a/Sources/justMUSIC/lib/model/Music.dart b/Sources/justMUSIC/lib/model/Music.dart index e50223f..ff3c685 100644 --- a/Sources/justMUSIC/lib/model/Music.dart +++ b/Sources/justMUSIC/lib/model/Music.dart @@ -2,10 +2,10 @@ import 'Artist.dart'; class Music { final String _id; - String _title; - String _cover; - String _previewUrl; - DateTime _date; + String? _title; + String? _cover; + String? _previewUrl; + DateTime? _date; List _artists; // Constructor @@ -13,29 +13,29 @@ class Music { this._artists); //Getters and setters - String get id => _id; + String? get id => _id; - String get title => _title; + String? get title => _title; - set title(String value) { + set title(String? value) { _title = value; } - String get cover => _cover; + String? get cover => _cover; - set cover(String value) { + set cover(String? value) { _cover = value; } - String get previewUrl => _previewUrl; + String? get previewUrl => _previewUrl; - set previewUrl(String value) { + set previewUrl(String? value) { _previewUrl = value; } - DateTime get date => _date; + DateTime? get date => _date; - set date(DateTime value) { + set date(DateTime? value) { _date = value; } diff --git a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart index 5f789ee..514155b 100644 --- a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart @@ -24,7 +24,7 @@ class MusicViewModel { final responseData = jsonDecode(response.body); List artists = List.from(responseData['artists'].map((artist) { - return Artist(artist['id'], artist['name']); + return Artist(artist['id'], artist['name'],''); })); return Music( @@ -46,7 +46,7 @@ class MusicViewModel { List tracks = responseData['tracks']['items']; for (var track in tracks) { List artists = List.from(track['artists'].map((artist) { - return Artist(artist['id'], artist['name']); + return Artist(artist['id'], artist['name'],''); })); musics.add(Music( @@ -61,10 +61,10 @@ class MusicViewModel { return musics; } - Future> getMusicsWithName(String name, {int limit = 20, int offset = 1}) async { + Future> getMusicsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async { var accessToken = await _token.getAccessToken(); var response = await http - .get(Uri.parse('$API_URL/search?q=track%3A$name&type=track&limit=$limit&offset=$offset'), headers: { + .get(Uri.parse('$API_URL/search?q=track%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: { 'Authorization': 'Bearer $accessToken', }); @@ -77,10 +77,10 @@ class MusicViewModel { } } - Future> getMusicsWithArtistName(String name, {int limit = 20, int offset = 1}) async { + Future> getMusicsWithArtistName(String name, {int limit = 20, int offset = 0, String market = "FR"}) async { var accessToken = await _token.getAccessToken(); var response = await http.get( - Uri.parse('$API_URL/search?q=artist%3A$name&type=track&limit=$limit&offset=$offset'), + Uri.parse('$API_URL/search?q=artist%3A$name&type=track&market=fr&limit=$limit&offset=$offset'), headers: { 'Authorization': 'Bearer $accessToken', }); diff --git a/Sources/justMUSIC/lib/view_model/TokenSpotify.dart b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart index fbdffac..a221129 100644 --- a/Sources/justMUSIC/lib/view_model/TokenSpotify.dart +++ b/Sources/justMUSIC/lib/view_model/TokenSpotify.dart @@ -8,7 +8,7 @@ class TokenSpotify { late DateTime _tokenEnd; TokenSpotify() { - _tokenEnd = DateTime.now().add(Duration(seconds: -1)); + _tokenEnd = DateTime.now().add(Duration(seconds: -10)); } Future getAccessToken() async { diff --git a/Sources/justMUSIC/test/Music_test.dart b/Sources/justMUSIC/test/Music_test.dart index a5ef914..eab5022 100644 --- a/Sources/justMUSIC/test/Music_test.dart +++ b/Sources/justMUSIC/test/Music_test.dart @@ -5,31 +5,32 @@ import 'package:justmusic/view_model/MusicViewModel.dart'; Future main() async { MusicViewModel musicVM = new MusicViewModel(); Music m = await musicVM.getMusic('295SxdR1DqunCNwd0U767w'); - print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); - print(m.date.toString() + " " + m.previewUrl); + + print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); for (Artist a in m.artists) { - print(a.id + ":" + a.name); + print("id : ${a.id}, name : ${a.name}"); } print('\nMusics :'); - List musics = await musicVM.getMusicsWithName('Onizuka'); + List musics = await musicVM.getMusicsWithName('Shavkat'); for (Music m in musics) { - print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); - print(m.date.toString() + " " + m.previewUrl); + print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); for (Artist a in m.artists) { - print(a.id + ":" + a.name); + print("id : ${a.id}, name : ${a.name}"); } } print('\nMusics With Artist:'); - List musics2 = await musicVM.getMusicsWithArtistName('PNL'); + List musics2 = await musicVM.getMusicsWithArtistName('jul'); for (Music m in musics2) { - print("id :" + m.id.toString() + " cover :" + m.cover + " title :" + m.title); - print(m.date.toString() + " " + m.previewUrl); + print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); for (Artist a in m.artists) { - print(a.id + ":" + a.name); + print("id : ${a.id}, name : ${a.name}"); } } }