import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:scrobbles/models/counts_by_day.dart'; import 'package:scrobbles/models/counts_by_hour.dart'; import 'package:scrobbles/models/discoveries.dart'; import 'package:scrobbles/models/heatmap.dart'; import 'package:scrobbles/models/new_artists.dart'; import 'package:scrobbles/models/new_tracks.dart'; import 'package:scrobbles/models/statistics_global.dart'; import 'package:scrobbles/models/statistics_recent.dart'; import 'package:scrobbles/models/timeline.dart'; import 'package:scrobbles/models/topartists.dart'; class ScrobblesApi { static String baseUrl = 'https://scrobble.harrault.fr'; static Future<StatisticsGlobalData> fetchGlobalStatistics() async { final String url = baseUrl + '/stats'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return StatisticsGlobalData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<StatisticsRecentData> fetchRecentStatistics(int daysCount) async { final String url = baseUrl + '/' + daysCount.toString() + '/stats'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return StatisticsRecentData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<TimelineData> fetchTimeline(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return TimelineData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<CountsByDayData> fetchCountsByDay(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return CountsByDayData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<CountsByHourData> fetchCountsByHour(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return CountsByHourData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<DiscoveriesData> fetchDiscoveries(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/news'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return DiscoveriesData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<TopArtistsData> fetchTopArtists(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/top-artists'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return TopArtistsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<HeatmapData> fetchHeatmap(int daysCount) async { final String url = baseUrl + '/data/' + daysCount.toString() + '/heatmap'; final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return HeatmapData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<NewArtistsData> fetchNewArtists(int count) async { final String url = baseUrl + '/data/discoveries/artists/' + count.toString(); final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return NewArtistsData.fromJson(jsonDecode(response.body) as List<dynamic>); } else { throw Exception('Failed to get data from API.'); } } static Future<NewTracksData> fetchNewTracks(int count) async { final String url = baseUrl + '/data/discoveries/tracks/' + count.toString(); final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { return NewTracksData.fromJson(jsonDecode(response.body) as List<dynamic>); } else { throw Exception('Failed to get data from API.'); } } }