From 4dedb6bfa2065b419da4b2c7fd5f666752934879 Mon Sep 17 00:00:00 2001 From: yxxyun Date: Wed, 2 Oct 2024 15:33:55 +0800 Subject: [PATCH] update quark --- lib/eval/dart/bridge/m_provider.dart | 20 +++++ lib/eval/dart/model/m_bridge.dart | 7 ++ lib/eval/javascript/extractors.dart | 11 +++ .../anime_extractors/quark_extractor.dart | 90 +++++++++++++------ 4 files changed, 101 insertions(+), 27 deletions(-) diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 795a728..78481a9 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -330,6 +330,22 @@ class $MProvider extends MProvider with $Bridge { false), ]), ), + 'quarkVideosExtractor': BridgeMethodDef( + BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [ + BridgeTypeRef(CoreTypes.list, [$MVideo.$type]) + ])), + params: [ + BridgeParameter( + 'url', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + false), + BridgeParameter( + 'cookie', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + false), + ]), + ), 'quarkFilesExtractor': BridgeMethodDef( BridgeFunctionDef( returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [ @@ -926,6 +942,10 @@ class $MProvider extends MProvider with $Bridge { args[0]!.$value, args[1]?.$value ?? "", args[2]?.$value ?? "") .then((value) => $List.wrap(value.map((e) => _toMVideo(e)).toList())))), + "quarkVideosExtractor" => $Function((_, __, List<$Value?> args) => $Future + .wrap(MBridge.quarkVideosExtractor(args[0]!.$value, args[1]!.$value) + .then((value) => + $List.wrap(value.map((e) => _toMVideo(e)).toList())))), "quarkFilesExtractor" => $Function((_, __, List<$Value?> args) => $Future.wrap( MBridge.quarkFilesExtractor(args[0]!.$value, args[1]!.$value) diff --git a/lib/eval/dart/model/m_bridge.dart b/lib/eval/dart/model/m_bridge.dart index 6389fe0..1fa1390 100644 --- a/lib/eval/dart/model/m_bridge.dart +++ b/lib/eval/dart/model/m_bridge.dart @@ -352,6 +352,13 @@ class MBridge { return await quark.videoFilesFromUrl(url); } + static Future> quarkVideosExtractor( + String url, String cookie) async { + QuarkExtractor quark = QuarkExtractor(); + await quark.initQuark(cookie); + return await quark.videosFromUrl(url); + } + static Future> streamTapeExtractor( String url, String? quality) async { return await StreamTapeExtractor() diff --git a/lib/eval/javascript/extractors.dart b/lib/eval/javascript/extractors.dart index 052f5ac..830f614 100644 --- a/lib/eval/javascript/extractors.dart +++ b/lib/eval/javascript/extractors.dart @@ -25,6 +25,10 @@ class JsVideosExtractors { runtime.onMessage('vidBomExtractor', (dynamic args) async { return (await MBridge.vidBomExtractor(args[0])).encodeToJson(); }); + runtime.onMessage('quarkVideosExtractor', (dynamic args) async { + return (await MBridge.quarkVideosExtractor(args[0], args[1])) + .encodeToJson(); + }); runtime.onMessage('quarkFilesExtractor', (dynamic args) async { List urls = (args[0] as List).cast(); return (await MBridge.quarkFilesExtractor(urls, args[1])); @@ -182,6 +186,13 @@ async function filemoonExtractor(url, prefix, suffix) { ); return JSON.parse(result); } +async function quarkVideosExtractor(url, cookie) { + const result = await sendMessage( + "quarkVideosExtractor", + JSON.stringify([url, cookie]) + ); + return JSON.parse(result); +} async function quarkFilesExtractor(urls, cookie) { const result = await sendMessage( "quarkFilesExtractor", diff --git a/lib/services/anime_extractors/quark_extractor.dart b/lib/services/anime_extractors/quark_extractor.dart index 66f81c1..59f15ee 100644 --- a/lib/services/anime_extractors/quark_extractor.dart +++ b/lib/services/anime_extractors/quark_extractor.dart @@ -72,10 +72,6 @@ class QuarkExtractor { return null; } - List getPlayFormatList() { - return ["4K", "超清", "高清", "普画"]; - } - List getPlayFormtQuarkList() { return ["4k", "2k", "super", "high", "normal", "low"]; } @@ -278,7 +274,7 @@ class QuarkExtractor { } Future getLiveTranscoding(String shareId, String stoken, - String fileId, String fileToken, String flag) async { + String fileId, String fileToken, String quality) async { if (!saveFileIdCaches.containsKey(fileId)) { final saveFileId = await save(shareId, stoken, fileId, fileToken, true); if (saveFileId == null) return null; @@ -294,15 +290,13 @@ class QuarkExtractor { 'post'); if (transcoding['data'] != null && transcoding['data']['video_list'] != null) { - final flagId = flag.split("-").last; - final index = getPlayFormatList().indexOf(flagId); - final quarkFormat = getPlayFormtQuarkList()[index]; for (final video in transcoding['data']['video_list']) { - if (video['resolution'] == quarkFormat) { + if (video['resolution'] == quality) { return video['video_info']['url']; } } - return transcoding['data']['video_list'][index]['video_info']['url']; + // 如果没有找到匹配的质量,返回第一个可用的视频URL + return transcoding['data']['video_list'][0]['video_info']['url']; } return null; } @@ -363,23 +357,65 @@ class QuarkExtractor { print(vodItems); return vodItems; } - // Future> getVod(List videoItemList, - // List subItemList, String typeName) async { - // if (videoItemList.isEmpty) { - // return []; - // } - // List