From ae9ad68030cbb886388da4917990e179b64bab47 Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Thu, 27 Jul 2023 12:51:03 +0200 Subject: [PATCH 1/2] Add new functions in the MusicViewModel class :hammer: --- Sources/justMUSIC/lib/model/Music.dart | 9 +- .../lib/view_model/MusicViewModel.dart | 122 +++++++++++- Sources/justMUSIC/pubspec.lock | 174 ++++++++++++------ Sources/justMUSIC/test/Music_test.dart | 30 ++- Sources/justMUSIC/test/widget_test.dart | 4 +- 5 files changed, 265 insertions(+), 74 deletions(-) diff --git a/Sources/justMUSIC/lib/model/Music.dart b/Sources/justMUSIC/lib/model/Music.dart index ff3c685..1d1e11e 100644 --- a/Sources/justMUSIC/lib/model/Music.dart +++ b/Sources/justMUSIC/lib/model/Music.dart @@ -6,11 +6,12 @@ class Music { String? _cover; String? _previewUrl; DateTime? _date; + double? _duration; List _artists; // Constructor Music(this._id, this._title, this._cover, this._previewUrl, this._date, - this._artists); + this._duration, this._artists); //Getters and setters String? get id => _id; @@ -39,6 +40,12 @@ class Music { _date = value; } + double? get duration => _duration; + + set duration(double? value) { + _duration = value; + } + List get artists => _artists; set artists(List value) { diff --git a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart index 514155b..43417aa 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( @@ -33,6 +33,7 @@ class MusicViewModel { responseData['album']['images'][0]['url'], responseData['preview_url'], DateTime.parse(responseData['album']['release_date']), + responseData['duration_ms'] / 1000, artists); } else { throw Exception( @@ -46,7 +47,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( @@ -55,18 +56,22 @@ class MusicViewModel { track['album']['images'][0]['url'], track['preview_url'], DateTime.now(), + track['duration_ms'] / 1000, artists)); } return musics; } - Future> getMusicsWithName(String name, {int limit = 20, int offset = 0, String market = "FR"}) 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&market=fr&limit=$limit&offset=$offset'), headers: { - 'Authorization': 'Bearer $accessToken', - }); + var response = await http.get( + Uri.parse( + '$API_URL/search?q=track%3A$name&type=track&market=$market&limit=$limit&offset=$offset'), + headers: { + 'Authorization': 'Bearer $accessToken', + }); if (response.statusCode == 200) { Map responseData = jsonDecode(response.body); @@ -77,10 +82,12 @@ class MusicViewModel { } } - Future> getMusicsWithArtistName(String name, {int limit = 20, int offset = 0, String market = "FR"}) 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&market=fr&limit=$limit&offset=$offset'), + Uri.parse( + '$API_URL/search?q=artist%3A$name&type=track&market=$market&limit=$limit&offset=$offset'), headers: { 'Authorization': 'Bearer $accessToken', }); @@ -93,4 +100,101 @@ class MusicViewModel { 'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}'); } } + + Future getArtistWithName(String name, {String market = "FR"}) async { + var accessToken = await _token.getAccessToken(); + var response = await http.get( + Uri.parse( + '$API_URL/search?q=artist%3A$name&type=artist&market=$market'), + headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + List artists = + List.from(responseData['artists']['items'].map((artist) { + String image = ''; + if (!artist['images'].isEmpty) { + image = artist['images'][0]['url']; + } + return Artist(artist['id'], artist['name'], image); + })); + + for (Artist a in artists) { + if (a.name?.toLowerCase() == name.toLowerCase()) { + return a; + } + } + + throw Exception('Artist not found : ${name}'); + } else { + throw Exception( + 'Error retrieving artist information : ${response.statusCode} ${response.reasonPhrase}'); + } + } + + Future> getArtistsWithName(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=artist&market=$market&limit=$limit&offset=$offset'), + headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + List artists = + List.from(responseData['artists']['items'].map((artist) { + String image = ''; + if (!artist['images'].isEmpty) { + image = artist['images'][0]['url']; + } + return Artist(artist['id'], artist['name'], image); + })); + + return artists; + } else { + throw Exception( + 'Error while retrieving artist : ${response.statusCode} ${response.reasonPhrase}'); + } + } + + Future> getTopMusicsWithArtistId(String id, + {String market = "FR"}) async { + var accessToken = await _token.getAccessToken(); + var response = await http.get( + Uri.parse('$API_URL/artists/$id/top-tracks?market=$market'), + headers: { + 'Authorization': 'Bearer $accessToken', + }); + + if (response.statusCode == 200) { + Map responseData = jsonDecode(response.body); + List musics = []; + + List tracks = responseData['tracks']; + 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(), + track['duration_ms'] / 1000, + artists)); + } + + return musics; + } else { + throw Exception( + 'Error while retrieving music : ${response.statusCode} ${response.reasonPhrase}'); + } + } } diff --git a/Sources/justMUSIC/pubspec.lock b/Sources/justMUSIC/pubspec.lock index f06f84c..28fd5eb 100644 --- a/Sources/justMUSIC/pubspec.lock +++ b/Sources/justMUSIC/pubspec.lock @@ -5,84 +5,96 @@ 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" auto_size_text: dependency: "direct main" description: name: auto_size_text - url: "https://pub.dartlang.org" + sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" + url: "https://pub.dev" source: hosted version: "3.0.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" circular_reveal_animation: dependency: "direct main" description: name: circular_reveal_animation - url: "https://pub.dartlang.org" + sha256: "198f5a1fa27384dcf950807e0ae07a0da857c04df6233f7468755ee9db102b0c" + url: "https://pub.dev" source: hosted version: "2.0.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" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" 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" custom_draggable_widget: dependency: "direct main" description: name: custom_draggable_widget - url: "https://pub.dartlang.org" + sha256: "15718003ebcebb84acdf0c625831a880d139a284d8de9d943ef0d0a669f10159" + url: "https://pub.dev" source: hosted version: "0.0.2" 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" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 + url: "https://pub.dev" source: hosted version: "2.0.2" flutter: @@ -94,21 +106,24 @@ 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_screenutil: dependency: "direct main" description: name: flutter_screenutil - url: "https://pub.dartlang.org" + sha256: "0a122936b450324cbdfd51be0819cc6fcebb093eb65585e9cd92263f7a1a8a39" + url: "https://pub.dev" source: hosted version: "5.7.0" flutter_signin_button: dependency: "direct main" description: name: flutter_signin_button - url: "https://pub.dartlang.org" + sha256: a063ecc5d5308377e103c9c3a89084abf15fca4440636233af6a13abacd5dcae + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_test: @@ -120,140 +135,168 @@ packages: dependency: transitive description: name: font_awesome_flutter - url: "https://pub.dartlang.org" + sha256: "1f93e5799f0e6c882819e8393a05c6ca5226010f289190f2242ec19f3f0fdba5" + url: "https://pub.dev" source: hosted version: "9.2.0" google_fonts: dependency: "direct main" description: name: google_fonts - url: "https://pub.dartlang.org" + sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" + url: "https://pub.dev" source: hosted version: "4.0.4" gradiantbutton: dependency: "direct main" description: name: gradiantbutton - url: "https://pub.dartlang.org" + sha256: c88ac8567242630cd14231e2a6a861da4e40a02a9a0310af360e05634890d172 + url: "https://pub.dev" source: hosted version: "0.0.1" gradient_borders: dependency: "direct main" description: name: gradient_borders - url: "https://pub.dartlang.org" + sha256: "69eeaff519d145a4c6c213ada1abae386bcc8981a4970d923e478ce7ba19e309" + url: "https://pub.dev" source: hosted version: "1.0.0" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" + 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" modal_bottom_sheet: dependency: "direct main" description: name: modal_bottom_sheet - url: "https://pub.dartlang.org" + sha256: ef533916a2c3089571c32bd34e410faca77a6849a3f28f748e0794525c5658a0 + url: "https://pub.dev" source: hosted version: "2.1.2" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_provider: dependency: transitive description: name: path_provider - url: "https://pub.dartlang.org" + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" + url: "https://pub.dev" source: hosted version: "2.0.15" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" + url: "https://pub.dev" source: hosted version: "2.0.27" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - url: "https://pub.dartlang.org" + sha256: "916731ccbdce44d545414dd9961f26ba5fbaa74bcbb55237d8e65a623a8c7297" + url: "https://pub.dev" source: hosted version: "2.2.4" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 + url: "https://pub.dev" source: hosted version: "2.1.11" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + url: "https://pub.dev" source: hosted version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" + url: "https://pub.dev" source: hosted version: "2.1.7" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" + url: "https://pub.dev" source: hosted version: "2.1.5" sky_engine: @@ -265,91 +308,104 @@ packages: dependency: "direct main" description: name: smooth_corner - url: "https://pub.dartlang.org" + sha256: "1e920cffd9644d6f51f9a99674652f8c00f2e9074b275f3edde0de1441ba78e9" + url: "https://pub.dev" source: hosted version: "1.1.0" source_span: 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" text_scroll: dependency: "direct main" description: name: text_scroll - url: "https://pub.dartlang.org" + sha256: "7869d86a6fdd725dee56bdd150216a99f0372b82fbfcac319214dbd5f36e1908" + url: "https://pub.dev" source: hosted version: "0.2.0" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" source: hosted version: "1.3.2" 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" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" + url: "https://pub.dev" source: hosted version: "4.1.4" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: e0b1147eec179d3911f1f19b59206448f78195ca1d20514134e10641b7d7fbff + url: "https://pub.dev" source: hosted version: "1.0.1" zoom_tap_animation: dependency: "direct main" description: name: zoom_tap_animation - url: "https://pub.dartlang.org" + sha256: d9f7a73cab65aa1546ba6886b5e21d3c8ccccb34e4e5f770301c306d4868bee0 + url: "https://pub.dev" source: hosted version: "1.1.0" sdks: diff --git a/Sources/justMUSIC/test/Music_test.dart b/Sources/justMUSIC/test/Music_test.dart index eab5022..7855741 100644 --- a/Sources/justMUSIC/test/Music_test.dart +++ b/Sources/justMUSIC/test/Music_test.dart @@ -7,7 +7,7 @@ Future main() async { Music m = await musicVM.getMusic('295SxdR1DqunCNwd0U767w'); print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } @@ -17,7 +17,7 @@ Future main() async { List musics = await musicVM.getMusicsWithName('Shavkat'); for (Music m in musics) { print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } @@ -28,9 +28,33 @@ Future main() async { List musics2 = await musicVM.getMusicsWithArtistName('jul'); for (Music m in musics2) { print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } } + + print('\nArtist with Name:'); + + Artist a = await musicVM.getArtistWithName('jul'); + print("id : ${a.id}, name : ${a.name}, image : ${a.image}"); + + print('\nArtists with Name:'); + + List artists = await musicVM.getArtistsWithName('jul'); + for (Artist a in artists) { + print("id : ${a.id}, name : ${a.name}, image : ${a.image}"); + } + + print('\nTop Musics :'); + + List topMusics = await musicVM.getTopMusicsWithArtistId('3NH8t45zOTqzlZgBvZRjvB'); + for (Music m in topMusics) { + print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); + for (Artist a in m.artists) { + print("id : ${a.id}, name : ${a.name}"); + } + } + } diff --git a/Sources/justMUSIC/test/widget_test.dart b/Sources/justMUSIC/test/widget_test.dart index 7612045..0dd0921 100644 --- a/Sources/justMUSIC/test/widget_test.dart +++ b/Sources/justMUSIC/test/widget_test.dart @@ -11,7 +11,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:justmusic/main.dart'; void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { + /*testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(const MyApp()); @@ -26,5 +26,5 @@ void main() { // Verify that our counter has incremented. expect(find.text('0'), findsNothing); expect(find.text('1'), findsOneWidget); - }); + });*/ } From 0a588ed822e8614c1665d7664c79a5ebe50dbbf9 Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Thu, 27 Jul 2023 21:05:24 +0200 Subject: [PATCH 2/2] added explicit attribute --- Sources/justMUSIC/lib/model/Music.dart | 9 ++++++++- Sources/justMUSIC/lib/view_model/MusicViewModel.dart | 3 +++ Sources/justMUSIC/test/Music_test.dart | 8 ++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Sources/justMUSIC/lib/model/Music.dart b/Sources/justMUSIC/lib/model/Music.dart index 1d1e11e..367d6a6 100644 --- a/Sources/justMUSIC/lib/model/Music.dart +++ b/Sources/justMUSIC/lib/model/Music.dart @@ -7,11 +7,12 @@ class Music { String? _previewUrl; DateTime? _date; double? _duration; + bool _explicit = false; List _artists; // Constructor Music(this._id, this._title, this._cover, this._previewUrl, this._date, - this._duration, this._artists); + this._duration, this._explicit, this._artists); //Getters and setters String? get id => _id; @@ -46,6 +47,12 @@ class Music { _duration = value; } + bool get explicit => _explicit; + + set explicit(bool value) { + _explicit = value; + } + List get artists => _artists; set artists(List value) { diff --git a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart index 43417aa..5f0f0eb 100644 --- a/Sources/justMUSIC/lib/view_model/MusicViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/MusicViewModel.dart @@ -34,6 +34,7 @@ class MusicViewModel { responseData['preview_url'], DateTime.parse(responseData['album']['release_date']), responseData['duration_ms'] / 1000, + responseData['explicit'], artists); } else { throw Exception( @@ -57,6 +58,7 @@ class MusicViewModel { track['preview_url'], DateTime.now(), track['duration_ms'] / 1000, + track['explicit'], artists)); } @@ -188,6 +190,7 @@ class MusicViewModel { track['preview_url'], DateTime.now(), track['duration_ms'] / 1000, + track['explicit'], artists)); } diff --git a/Sources/justMUSIC/test/Music_test.dart b/Sources/justMUSIC/test/Music_test.dart index 7855741..baf3aaa 100644 --- a/Sources/justMUSIC/test/Music_test.dart +++ b/Sources/justMUSIC/test/Music_test.dart @@ -7,7 +7,7 @@ Future main() async { Music m = await musicVM.getMusic('295SxdR1DqunCNwd0U767w'); print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}, explicit : ${m.explicit}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } @@ -17,7 +17,7 @@ Future main() async { List musics = await musicVM.getMusicsWithName('Shavkat'); for (Music m in musics) { print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}, explicit : ${m.explicit}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } @@ -28,7 +28,7 @@ Future main() async { List musics2 = await musicVM.getMusicsWithArtistName('jul'); for (Music m in musics2) { print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}, explicit : ${m.explicit}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); } @@ -51,7 +51,7 @@ Future main() async { List topMusics = await musicVM.getTopMusicsWithArtistId('3NH8t45zOTqzlZgBvZRjvB'); for (Music m in topMusics) { print("id : ${m.id.toString()}, cover : ${m.cover}, title : ${m.title}"); - print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}"); + print("date : ${m.date.toString()}, preview : ${m.previewUrl}, duration : ${m.duration}, explicit : ${m.explicit}"); for (Artist a in m.artists) { print("id : ${a.id}, name : ${a.name}"); }