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),
|
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(
|
'quarkFilesExtractor': BridgeMethodDef(
|
||||||
BridgeFunctionDef(
|
BridgeFunctionDef(
|
||||||
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [
|
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 ?? "")
|
args[0]!.$value, args[1]?.$value ?? "", args[2]?.$value ?? "")
|
||||||
.then((value) =>
|
.then((value) =>
|
||||||
$List.wrap(value.map((e) => _toMVideo(e)).toList())))),
|
$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) =>
|
"quarkFilesExtractor" => $Function((_, __, List<$Value?> args) =>
|
||||||
$Future.wrap(
|
$Future.wrap(
|
||||||
MBridge.quarkFilesExtractor(args[0]!.$value, args[1]!.$value)
|
MBridge.quarkFilesExtractor(args[0]!.$value, args[1]!.$value)
|
||||||
|
|
|
||||||
|
|
@ -352,6 +352,13 @@ class MBridge {
|
||||||
return await quark.videoFilesFromUrl(url);
|
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(
|
static Future<List<Video>> streamTapeExtractor(
|
||||||
String url, String? quality) async {
|
String url, String? quality) async {
|
||||||
return await StreamTapeExtractor()
|
return await StreamTapeExtractor()
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ class JsVideosExtractors {
|
||||||
runtime.onMessage('vidBomExtractor', (dynamic args) async {
|
runtime.onMessage('vidBomExtractor', (dynamic args) async {
|
||||||
return (await MBridge.vidBomExtractor(args[0])).encodeToJson();
|
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 {
|
runtime.onMessage('quarkFilesExtractor', (dynamic args) async {
|
||||||
List<String> urls = (args[0] as List).cast<String>();
|
List<String> urls = (args[0] as List).cast<String>();
|
||||||
return (await MBridge.quarkFilesExtractor(urls, args[1]));
|
return (await MBridge.quarkFilesExtractor(urls, args[1]));
|
||||||
|
|
@ -182,6 +186,13 @@ async function filemoonExtractor(url, prefix, suffix) {
|
||||||
);
|
);
|
||||||
return JSON.parse(result);
|
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) {
|
async function quarkFilesExtractor(urls, cookie) {
|
||||||
const result = await sendMessage(
|
const result = await sendMessage(
|
||||||
"quarkFilesExtractor",
|
"quarkFilesExtractor",
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,6 @@ class QuarkExtractor {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> getPlayFormatList() {
|
|
||||||
return ["4K", "超清", "高清", "普画"];
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> getPlayFormtQuarkList() {
|
List<String> getPlayFormtQuarkList() {
|
||||||
return ["4k", "2k", "super", "high", "normal", "low"];
|
return ["4k", "2k", "super", "high", "normal", "low"];
|
||||||
}
|
}
|
||||||
|
|
@ -278,7 +274,7 @@ class QuarkExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> getLiveTranscoding(String shareId, String stoken,
|
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)) {
|
if (!saveFileIdCaches.containsKey(fileId)) {
|
||||||
final saveFileId = await save(shareId, stoken, fileId, fileToken, true);
|
final saveFileId = await save(shareId, stoken, fileId, fileToken, true);
|
||||||
if (saveFileId == null) return null;
|
if (saveFileId == null) return null;
|
||||||
|
|
@ -294,15 +290,13 @@ class QuarkExtractor {
|
||||||
'post');
|
'post');
|
||||||
if (transcoding['data'] != null &&
|
if (transcoding['data'] != null &&
|
||||||
transcoding['data']['video_list'] != 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']) {
|
for (final video in transcoding['data']['video_list']) {
|
||||||
if (video['resolution'] == quarkFormat) {
|
if (video['resolution'] == quality) {
|
||||||
return video['video_info']['url'];
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -363,23 +357,65 @@ class QuarkExtractor {
|
||||||
print(vodItems);
|
print(vodItems);
|
||||||
return vodItems;
|
return vodItems;
|
||||||
}
|
}
|
||||||
// Future<List<Video>> getVod(List<dynamic> videoItemList,
|
|
||||||
// List<dynamic> subItemList, String typeName) async {
|
Future<List<Video>> videosFromUrl(String url) async {
|
||||||
// if (videoItemList.isEmpty) {
|
List<String> parts = url.split('++');
|
||||||
// return [];
|
String fileId = parts[0];
|
||||||
// }
|
String fileToken = parts[1];
|
||||||
// List<Video> vodItems = [];
|
String shareId = parts[2];
|
||||||
// for (var videoItem in videoItemList) {
|
String stoken = parts[3];
|
||||||
// String episodeUrl = videoItem.getEpisodeUrl(typeName);
|
|
||||||
// String subtitles = findSubs(videoItem.getName(), subItemList);
|
List<String> subtitleParts = parts.length > 4 ? parts[4].split('+') : [];
|
||||||
// String fullUrl = episodeUrl + subtitles;
|
|
||||||
// List<String> parts = fullUrl.split('\$');
|
// 获取原画质量
|
||||||
// String name = parts[0].trim();
|
var originalQuality =
|
||||||
// String url = parts[1];
|
await getDownload(shareId, stoken, fileId, fileToken, true);
|
||||||
// vodItems.add(Video(url, name, url));
|
String originalUrl = originalQuality?['download_url'] ?? '';
|
||||||
// }
|
|
||||||
// return vodItems;
|
// 获取可用的质量列表
|
||||||
// }
|
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) {
|
String findSubs(String name, List<dynamic> itemList) {
|
||||||
List<dynamic> subItemList = [];
|
List<dynamic> subItemList = [];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue