Merge branch 'fix'
This commit is contained in:
@ -536,7 +536,8 @@ class VideoHttp {
|
||||
// 获取字幕内容
|
||||
static Future<Map<String, dynamic>> getSubtitleContent(url) async {
|
||||
var res = await Request().get('https:$url');
|
||||
final String content = SubTitleUtils.convertToWebVTT(res.data['body']);
|
||||
final String content =
|
||||
await SubTitleUtils.convertToWebVTT(res.data['body']);
|
||||
final List body = res.data['body'];
|
||||
return {'content': content, 'body': body};
|
||||
}
|
||||
|
@ -1,21 +1,51 @@
|
||||
import 'dart:async';
|
||||
import 'dart:isolate';
|
||||
|
||||
class SubTitleUtils {
|
||||
// 格式整理
|
||||
static String convertToWebVTT(List jsonData) {
|
||||
String webVTTContent = 'WEBVTT FILE\n\n';
|
||||
static Future<String> convertToWebVTT(List jsonData) async {
|
||||
final receivePort = ReceivePort();
|
||||
await Isolate.spawn(_convertToWebVTTIsolate, receivePort.sendPort);
|
||||
|
||||
for (int i = 0; i < jsonData.length; i++) {
|
||||
final item = jsonData[i];
|
||||
double from = double.parse(item['from'].toString());
|
||||
double to = double.parse(item['to'].toString());
|
||||
int sid = (item['sid'] ?? 0) as int;
|
||||
String content = item['content'] as String;
|
||||
final sendPort = await receivePort.first as SendPort;
|
||||
final response = ReceivePort();
|
||||
sendPort.send([jsonData, response.sendPort]);
|
||||
|
||||
webVTTContent += '$sid\n';
|
||||
webVTTContent += '${formatTime(from)} --> ${formatTime(to)}\n';
|
||||
webVTTContent += '$content\n\n';
|
||||
return await response.first as String;
|
||||
}
|
||||
|
||||
static void _convertToWebVTTIsolate(SendPort sendPort) async {
|
||||
final port = ReceivePort();
|
||||
sendPort.send(port.sendPort);
|
||||
|
||||
await for (final message in port) {
|
||||
final List jsonData = message[0];
|
||||
final SendPort replyTo = message[1];
|
||||
|
||||
String webVTTContent = 'WEBVTT FILE\n\n';
|
||||
int chunkSize = 100; // 每次处理100条数据
|
||||
int totalChunks = (jsonData.length / chunkSize).ceil();
|
||||
|
||||
for (int chunk = 0; chunk < totalChunks; chunk++) {
|
||||
int start = chunk * chunkSize;
|
||||
int end = start + chunkSize;
|
||||
if (end > jsonData.length) end = jsonData.length;
|
||||
|
||||
for (int i = start; i < end; i++) {
|
||||
final item = jsonData[i];
|
||||
double from = double.parse(item['from'].toString());
|
||||
double to = double.parse(item['to'].toString());
|
||||
int sid = (item['sid'] ?? 0) as int;
|
||||
String content = item['content'] as String;
|
||||
|
||||
webVTTContent += '$sid\n';
|
||||
webVTTContent += '${formatTime(from)} --> ${formatTime(to)}\n';
|
||||
webVTTContent += '$content\n\n';
|
||||
}
|
||||
}
|
||||
|
||||
replyTo.send(webVTTContent);
|
||||
}
|
||||
|
||||
return webVTTContent;
|
||||
}
|
||||
|
||||
static String formatTime(num seconds) {
|
||||
|
Reference in New Issue
Block a user