Skip to content
Snippets Groups Projects
scrobbles_api.dart 3.42 KiB
Newer Older
import 'dart:convert';
import 'package:http/http.dart' as http;

import '../models/counts_by_day.dart';
import '../models/counts_by_hour.dart';
import '../models/discoveries.dart';
import '../models/statistics_global.dart';
import '../models/statistics_recent.dart';
import '../models/timeline.dart';
import '../models/topartists.dart';

class ScrobblesApi {
  static String baseUrl = 'https://scrobble.harrault.fr';

  static Future<StatisticsGlobalData> fetchGlobalStatistics() async {
    final String url = baseUrl + '/stats';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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';
    print('fetching ' + url);
    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.');
    }
  }