dart-app-core/bin/main.dart
2023-03-26 01:48:46 +09:00

97 lines
2.9 KiB
Dart
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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('&nbsp;')) {
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);
}
}