97 lines
2.9 KiB
Dart
97 lines
2.9 KiB
Dart
import 'dart:convert';
|
||
import 'dart:io';
|
||
import 'package:dart_framework/log/log.dart';
|
||
import 'package:dart_framework/subtitle/ParserSRT.dart';
|
||
import 'package:path/path.dart' as path;
|
||
|
||
import 'package:dart_framework/core/application.dart';
|
||
import 'package:dart_framework/charset.dart';
|
||
|
||
void main() async {
|
||
Application(() async {
|
||
var filePath = Platform.script.toFilePath(windows: true);
|
||
var file = File('${path.dirname(path.dirname(filePath))}/test_euckr.smi');
|
||
var bytes = file.readAsBytesSync();
|
||
var encoding = Charset.detect(bytes, defaultEncoding: Utf8Codec());
|
||
print(encoding);
|
||
var result = eucKr.decode(bytes);
|
||
// print(result);
|
||
|
||
//SRT
|
||
// var parser = ParserSRT();
|
||
// var subtitles = parser.getSubtitlesData(result!, SubtitleType.srt);
|
||
// var index = 0;
|
||
// for (var item in subtitles.subtitles) {
|
||
// print('$index. ${item.text}');
|
||
// index++;
|
||
// }
|
||
|
||
//SMI
|
||
var smi = ParserSMI();
|
||
smi.getSubtitlesData(result!);
|
||
|
||
// var regExp = RegExp(
|
||
// r'<SYNC Start=(\d+)><P Class=KRCC>',
|
||
// caseSensitive: false,
|
||
// multiLine: true,
|
||
// );
|
||
}, (error, stack) {
|
||
print(error);
|
||
print(stack);
|
||
exit(0);
|
||
});
|
||
}
|
||
|
||
class ParserSMI {
|
||
Subtitles getSubtitlesData(String subtitlesContent) {
|
||
subtitlesContent = subtitlesContent.replaceAll(
|
||
RegExp('<font (.*?=)(.*?>)|</font>|<b>|</b>| |<i>|</i>',
|
||
caseSensitive: false, multiLine: false),
|
||
'');
|
||
|
||
var regExp = RegExp(
|
||
r'<SYNC Start=(\d+)><P Class=(.*?>)(\r|\n)*((((?!<SYNC|<\/BODY).*)(\r|\n))+)',
|
||
caseSensitive: false,
|
||
multiLine: true,
|
||
);
|
||
final matches = regExp.allMatches(subtitlesContent).toList();
|
||
final subtitleList = <Subtitle>[];
|
||
Subtitle? lastItem;
|
||
for (final regExpMatch in matches) {
|
||
var startTime = Time(
|
||
Duration(milliseconds: int.parse(regExpMatch.group(1).toString())));
|
||
var content = regExpMatch.group(4)!;
|
||
if (lastItem != null) {
|
||
lastItem.endTime.duration = startTime.before;
|
||
lastItem = null;
|
||
}
|
||
|
||
if (!content.contains(' ')) {
|
||
content = content
|
||
.replaceAll(RegExp(r'(\r\n|\r|\n)', caseSensitive: false), '')
|
||
.replaceAll(RegExp(r'(<br>|<\/br>)', caseSensitive: false), ' ')
|
||
.trim();
|
||
|
||
if (content.isNotEmpty) {
|
||
if (subtitleList.isNotEmpty &&
|
||
content.contains(subtitleList.last.text)) {
|
||
subtitleList.last.text = content;
|
||
lastItem = subtitleList.last;
|
||
} else {
|
||
var endTime = Time(Duration());
|
||
lastItem =
|
||
Subtitle(startTime: startTime, endTime: endTime, text: content);
|
||
subtitleList.add(lastItem);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
for (var item in subtitleList) {
|
||
print(
|
||
'${item.startTime.toString()} --> ${item.endTime.toString()} >> ${item.text}');
|
||
}
|
||
|
||
return Subtitles(subtitles: subtitleList);
|
||
}
|
||
}
|