update quark

This commit is contained in:
yxxyun 2024-10-02 15:33:55 +08:00
parent a382044329
commit 4dedb6bfa2
4 changed files with 101 additions and 27 deletions

View file

@ -330,6 +330,22 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
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<MProvider> {
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)

View file

@ -352,6 +352,13 @@ class MBridge {
return await quark.videoFilesFromUrl(url);
}
static Future<List<Video>> quarkVideosExtractor(
String url, String cookie) async {
QuarkExtractor quark = QuarkExtractor();
await quark.initQuark(cookie);
return await quark.videosFromUrl(url);
}
static Future<List<Video>> streamTapeExtractor(
String url, String? quality) async {
return await StreamTapeExtractor()

View file

@ -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<String> urls = (args[0] as List).cast<String>();
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",

View file

@ -72,10 +72,6 @@ class QuarkExtractor {
return null;
}
List<String> getPlayFormatList() {
return ["4K", "超清", "高清", "普画"];
}
List<String> getPlayFormtQuarkList() {
return ["4k", "2k", "super", "high", "normal", "low"];
}
@ -278,7 +274,7 @@ class QuarkExtractor {
}
Future<String?> 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<List<Video>> getVod(List<dynamic> videoItemList,
// List<dynamic> subItemList, String typeName) async {
// if (videoItemList.isEmpty) {
// return [];
// }
// List<Video> vodItems = [];
// for (var videoItem in videoItemList) {
// String episodeUrl = videoItem.getEpisodeUrl(typeName);
// String subtitles = findSubs(videoItem.getName(), subItemList);
// String fullUrl = episodeUrl + subtitles;
// List<String> parts = fullUrl.split('\$');
// String name = parts[0].trim();
// String url = parts[1];
// vodItems.add(Video(url, name, url));
// }
// return vodItems;
// }
Future<List<Video>> videosFromUrl(String url) async {
List<String> parts = url.split('++');
String fileId = parts[0];
String fileToken = parts[1];
String shareId = parts[2];
String stoken = parts[3];
List<String> subtitleParts = parts.length > 4 ? parts[4].split('+') : [];
//
var originalQuality =
await getDownload(shareId, stoken, fileId, fileToken, true);
String originalUrl = originalQuality?['download_url'] ?? '';
//
List<String> qualities = await getPlayFormtQuarkList();
List<Video> videos = [];
for (String quality in qualities) {
String? url =
await getLiveTranscoding(shareId, stoken, fileId, fileToken, quality);
if (url != null) {
var headers = getHeaders();
headers.remove('Host');
videos.add(Video(
url,
quality,
originalUrl,
headers: headers,
));
}
}
//
List<Track> subtitles = [];
for (String subtitleInfo in subtitleParts) {
if (subtitleInfo.isNotEmpty) {
List<String> subParts = subtitleInfo.split('@@@');
if (subParts.length == 3) {
String subName = subParts[0];
String subFileId = subParts[2];
var subDownload =
await getDownload(shareId, stoken, subFileId, '', true);
String? subUrl = subDownload?['download_url'];
if (subUrl != null) {
subtitles.add(Track(file: subUrl, label: subName));
}
}
}
}
//
for (var video in videos) {
video.subtitles = subtitles;
}
print(videos);
return videos;
}
String findSubs(String name, List<dynamic> itemList) {
List<dynamic> subItemList = [];