From 11dea6dfafe98e03458e41dc5575006bd2073c57 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Mon, 2 Dec 2024 17:01:10 +0100 Subject: [PATCH] fix get torrent video list --- lib/eval/javascript/http.dart | 58 +++++++++++++------ lib/modules/anime/anime_player_view.dart | 12 ++-- .../library/providers/add_torrent.g.dart | 2 +- lib/services/get_video_list.dart | 36 +++++++++--- lib/services/get_video_list.g.dart | 15 ++--- lib/services/torrent_server.dart | 13 +++++ pubspec.lock | 16 ++--- pubspec.yaml | 2 +- 8 files changed, 107 insertions(+), 47 deletions(-) diff --git a/lib/eval/javascript/http.dart b/lib/eval/javascript/http.dart index d5f4952..2ad8ead 100644 --- a/lib/eval/javascript/http.dart +++ b/lib/eval/javascript/http.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:mangayomi/services/http/m_client.dart'; +import 'package:http/http.dart' as http; class JsHttpClient { late JavascriptRuntime runtime; @@ -14,33 +16,19 @@ class JsHttpClient { } runtime.onMessage('http_get', (dynamic args) async { - return jsonEncode((await client(args[1]).get(Uri.parse(args[2]), - headers: (args[3] as Map?)?.toMapStringString)) - .toJson()); + return await _toHttpResponse(client(args[1]), "GET", args); }); runtime.onMessage('http_post', (dynamic args) async { - return jsonEncode((await client(args[1]).post(Uri.parse(args[2]), - headers: (args[3] as Map?)?.toMapStringString, - body: (args[4] as Map?)?.toMapStringString)) - .toJson()); + return await _toHttpResponse(client(args[1]), "POST", args); }); runtime.onMessage('http_put', (dynamic args) async { - return (await client(args[1]).put(Uri.parse(args[2]), - headers: (args[3] as Map?)?.toMapStringString, body: args[4])) - .toJson(); + return await _toHttpResponse(client(args[1]), "PUT", args); }); runtime.onMessage('http_delete', (dynamic args) async { - return jsonEncode((await client(args[1]).delete(Uri.parse(args[2]), - headers: (args[3] as Map?)?.map( - (key, value) => MapEntry(key.toString(), value.toString())), - body: (args[4] as Map?)?.toMapStringString)) - .toJson()); + return await _toHttpResponse(client(args[1]), "DELETE", args); }); runtime.onMessage('http_patch', (dynamic args) async { - return jsonEncode((await client(args[1]).patch(Uri.parse(args[2]), - headers: (args[3] as Map?)?.toMapStringString, - body: (args[4] as Map?)?.toMapStringString)) - .toJson()); + return await _toHttpResponse(client(args[1]), "PATCH", args); }); runtime.evaluate(''' class Client { @@ -92,6 +80,38 @@ class Client { } } +Future _toHttpResponse(Client client, String method, List args) async { + final url = args[2] as String; + final headers = (args[3] as Map?)?.toMapStringString; + final body = args.length >= 5 ? (args[4] as Map?)?.toMapStringDynamic : null; + var request = http.Request(method, Uri.parse(url)); + request.headers.addAll(headers ?? {}); + if ((request.headers[HttpHeaders.contentTypeHeader] + ?.contains("application/json")) ?? + false) { + request.body = json.encode(body); + request.headers.addAll(headers ?? {}); + http.StreamedResponse response = await client.send(request); + final res = Response("", response.statusCode, + request: response.request, + headers: response.headers, + isRedirect: response.isRedirect, + persistentConnection: response.persistentConnection, + reasonPhrase: response.reasonPhrase); + Map resMap = res.toJson(); + resMap["body"] = await response.stream.bytesToString(); + return jsonEncode(resMap); + } + final future = switch (method) { + "GET" => client.get(Uri.parse(url), headers: headers), + "POST" => client.post(Uri.parse(url), headers: headers, body: body), + "PUT" => client.put(Uri.parse(url), headers: headers, body: body), + "DELETE" => client.delete(Uri.parse(url), headers: headers, body: body), + _ => client.patch(Uri.parse(url), headers: headers, body: body), + }; + return jsonEncode((await future).toJson()); +} + extension ResponseExtexsion on Response { Map toJson() => { 'body': body, diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 1a25385..be5b994 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -21,6 +21,7 @@ import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/services/aniskip.dart'; import 'package:mangayomi/services/get_video_list.dart'; +import 'package:mangayomi/services/torrent_server.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; @@ -38,9 +39,12 @@ class AnimePlayerView extends riv.ConsumerStatefulWidget { } class _AnimePlayerViewState extends riv.ConsumerState { - String? _infoHash; + List _infoHashList = []; @override void dispose() { + for (var infoHash in _infoHashList) { + MTorrentServer().removeTorrent(infoHash); + } SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); super.dispose(); @@ -53,8 +57,8 @@ class _AnimePlayerViewState extends riv.ConsumerState { SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); return serversData.when( data: (data) { - final (videos, isLocal, infoHash) = data; - _infoHash = infoHash; + final (videos, isLocal, infoHashList) = data; + _infoHashList = infoHashList; if (videos.isEmpty && !(widget.episode.manga.value!.isLocalArchive ?? false)) { return Scaffold( @@ -77,7 +81,7 @@ class _AnimePlayerViewState extends riv.ConsumerState { episode: widget.episode, videos: videos, isLocal: isLocal, - isTorrent: _infoHash != null); + isTorrent: _infoHashList.isNotEmpty); }, error: (error, stackTrace) => Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index 3abd477..5469126 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'8102259b30765a5c5cc57870f5c583bd5d421eee'; + r'a159635689b8f8ac22bb9faa10407f09c8008f71'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/get_video_list.dart b/lib/services/get_video_list.dart index 8a443a2..d25f8a9 100644 --- a/lib/services/get_video_list.dart +++ b/lib/services/get_video_list.dart @@ -14,7 +14,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'get_video_list.g.dart'; @riverpod -Future<(List