import 'dart:convert'; import 'package:mangayomi/services/http/m_client.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'aniskip.g.dart'; // credits: https://github.com/aniyomiorg/aniyomi/blob/master/app/src/main/java/eu/kanade/tachiyomi/util/AniSkipApi.kt @riverpod class AniSkip extends _$AniSkip { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); @override void build() {} Future?> getResult((int, int) id, int episodeNumber, double episodeLength) async { try { final malId = await _getMalId(id); final url = "https://api.aniskip.com/v2/skip-times/$malId/$episodeNumber?types[]=ed&types[]=mixed-ed&types[]=mixed-op&types[]=op&types[]=recap&episodeLength=$episodeLength"; final response = await http.get(Uri.parse(url)); final res = AniSkipResponse.fromJson(json.decode(response.body)); return (res.found ?? false) ? res.results : null; } catch (_) { return null; } } Future _getMalId((int, int) id) async { if (id.$2 == 1) return id.$1; if (id.$2 != 2) throw ""; final query = """ query{ Media(id:${id.$1}){idMal} } """; final response = await http.post( Uri.parse("https://graphql.anilist.co"), body: json.encode({"query": query}), headers: {"Content-Type": "application/json"}, ); return jsonDecode(response.body)["data"]["Media"]["idMal"] ?? 0; } } class AniSkipResponse { bool? found; List? results; String? message; int? statusCode; AniSkipResponse({this.found, this.results, this.message, this.statusCode}); factory AniSkipResponse.fromJson(Map json) { return AniSkipResponse( found: json['found'], results: (json['results'] as List?)?.map((e) => Results.fromJson(e)).toList(), message: json['message'], statusCode: json['statusCode'], ); } } class Results { Interval? interval; String? skipType; String? skipId; double? episodeLength; Results({this.interval, this.skipType, this.skipId, this.episodeLength}); factory Results.fromJson(Map json) { return Results( interval: Interval.fromJson(json['interval']), skipType: json['skipType'], skipId: json['skipId'], episodeLength: json['episodeLength'], ); } } class Interval { double? startTime; double? endTime; Interval({this.startTime, this.endTime}); factory Interval.fromJson(Map json) { return Interval( startTime: double.parse(json['startTime'].toString()), endTime: double.parse(json['endTime'].toString()), ); } }