opt export subtitle

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-11 13:52:54 +08:00
parent 82116480cb
commit bcd8bc7366
3 changed files with 141 additions and 67 deletions

View File

@@ -37,6 +37,7 @@ import 'package:PiliPlus/utils/recommend_filter.dart';
import 'package:PiliPlus/utils/request_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/subtitle_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/utils/wbi_sign.dart';
import 'package:dio/dio.dart';
@@ -834,33 +835,20 @@ abstract final class VideoHttp {
}
}
static String _subtitleTimecode(num seconds) {
int h = seconds ~/ 3600;
seconds %= 3600;
int m = seconds ~/ 60;
seconds %= 60;
String sms = seconds.toStringAsFixed(3).padLeft(6, '0');
return h == 0
? "${m.toString().padLeft(2, '0')}:$sms"
: "${h.toString().padLeft(2, '0')}:${m.toString().padLeft(2, '0')}:$sms";
}
static String processList(List list) {
final sb = StringBuffer('WEBVTT\n\n')
..writeAll(
list.map(
(item) =>
'${_subtitleTimecode(item['from'])} --> ${_subtitleTimecode(item['to'])}\n${item['content'].trim()}',
),
'\n\n',
);
return sb.toString();
}
static Future<String?> vttSubtitles(String subtitleUrl) async {
static Future<String?> vttSubtitles(
String subtitleUrl, {
SubtitleFormat format = .vtt,
}) async {
final res = await Request().get("https:$subtitleUrl");
if (res.data?['body'] case List list) {
return compute<List, String>(processList, list);
switch (format) {
case .json:
throw UnimplementedError();
case .vtt:
return compute<List, String>(SubtitleUtils.json2Vtt, list);
case .srt:
return compute<List, String>(SubtitleUtils.json2Srt, list);
}
}
return null;
}