update quark
This commit is contained in:
parent
a382044329
commit
4dedb6bfa2
4 changed files with 101 additions and 27 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 = [];
|
||||
|
|
|
|||
Loading…
Reference in a new issue