From 5064f198d20df8604f3e1096770cf242310e4a69 Mon Sep 17 00:00:00 2001 From: Kengwang Date: Sat, 6 Jul 2024 21:32:29 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=20=E6=96=B0=E5=A2=9E=20srt=20=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ALRC/ALRC.Converters/SrtConverter.cs | 88 +++++++++++++++++++ .../ALRC/ALRC.Creator/ALRC.Creator.csproj | 6 +- .../ALRC.Creator/Views/Pages/ConvertPage.xaml | 53 +++++++---- .../Views/Pages/ConvertPage.xaml.cs | 30 +++++++ 4 files changed, 159 insertions(+), 18 deletions(-) create mode 100644 examples/csharp/ALRC/ALRC.Converters/SrtConverter.cs diff --git a/examples/csharp/ALRC/ALRC.Converters/SrtConverter.cs b/examples/csharp/ALRC/ALRC.Converters/SrtConverter.cs new file mode 100644 index 0000000..cf48ae1 --- /dev/null +++ b/examples/csharp/ALRC/ALRC.Converters/SrtConverter.cs @@ -0,0 +1,88 @@ +using System.Text; +using System.Text.RegularExpressions; +using ALRC.Abstraction; + +namespace ALRC.Converters; + +public class SrtConverter : ILyricConverter +{ + public ALRCFile Convert(string input) + { + var lines = new List(); + var alrc = new ALRCFile + { + Schema = "https://github.com/kengwang/ALRC/blob/main/schemas/v1.json", + LyricInfo = null, + SongInfo = null, + Header = null, + Lines = lines + }; + const string regex = @"(?\d+)\n(?[\d\:,]*)\s?-->\s?(?[\d\:,]*)\n(?(?>.+\r?\n)+(?=(?>\r?\n)?))"; + var matches = Regex.Matches(input, regex); + foreach (Match match in matches) + { + var line = match.Groups["line"].Value; + var start = match.Groups["start"].Value; + var end = match.Groups["end"].Value; + // 00:00:11,269 to Milliseconds + start = start.Replace(',', '.'); + end = end.Replace(',', '.'); + var startTime = TimeSpan.Parse(start).TotalMilliseconds; + var endTime = TimeSpan.Parse(end).TotalMilliseconds; + var lineContents = line.Replace("\r\n", "\n").Split('\n'); + var alrcLine = new ALRCLine + { + Id = match.Groups["id"].Value, + Start = (int)startTime, + End = (int)endTime + }; + if (lineContents.Length > 0) + { + alrcLine.RawText = lineContents[0]; + if (lineContents.Length > 1) + { + alrcLine.Translation = lineContents[1]; + } + + if (lineContents.Length > 2) + { + alrcLine.Comment = lineContents[2]; + } + } + lines.Add(alrcLine); + } + + return alrc; + } + + public string ConvertBack(ALRCFile input) + { + var builder = new StringBuilder(); + if (input.Lines is { Count: > 0 }) + { + var id = 1; + for (var index = 0; index < input.Lines.Count; index++) + { + var inputLine = input.Lines[index]; + var startTimeString = TimeSpan.FromMilliseconds(inputLine.Start ?? 0) + .ToString(@"hh\:mm\:ss\,fff"); + var endTimeString = TimeSpan.FromMilliseconds(inputLine.End ?? 0) + .ToString(@"hh\:mm\:ss\,fff"); + builder.AppendLine($"{id++}\n{startTimeString} --> {endTimeString}\n{inputLine.RawText}"); + if (!string.IsNullOrWhiteSpace(inputLine.Translation)) + { + builder.AppendLine(inputLine.Translation); + } + + if (!string.IsNullOrWhiteSpace(inputLine.Comment)) + { + builder.AppendLine(inputLine.Comment); + } + + builder.AppendLine(); + } + } + + return builder.ToString(); + } +} \ No newline at end of file diff --git a/examples/csharp/ALRC/ALRC.Creator/ALRC.Creator.csproj b/examples/csharp/ALRC/ALRC.Creator/ALRC.Creator.csproj index acbeaf4..1818436 100644 --- a/examples/csharp/ALRC/ALRC.Creator/ALRC.Creator.csproj +++ b/examples/csharp/ALRC/ALRC.Creator/ALRC.Creator.csproj @@ -7,9 +7,9 @@ true AnyCPU;x64 default - 1.2.0 - 1.1.0 - 1.1.0 + 1.2.1 + 1.2.1 + 1.2.1 diff --git a/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml b/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml index a62c9ef..b52f372 100644 --- a/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml +++ b/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml @@ -21,7 +21,8 @@ - + @@ -36,8 +37,9 @@ - - + + @@ -56,8 +58,9 @@ - - + + @@ -72,9 +75,10 @@ - - - + + + @@ -89,8 +93,9 @@ - - + + @@ -104,8 +109,9 @@ - - + + @@ -119,8 +125,9 @@ - - + + @@ -133,6 +140,22 @@ - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml.cs b/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml.cs index 51016e4..622f2fb 100644 --- a/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml.cs +++ b/examples/csharp/ALRC/ALRC.Creator/Views/Pages/ConvertPage.xaml.cs @@ -239,4 +239,34 @@ private void ConvertToLyricifySyllable_Click(object sender, RoutedEventArgs e) File.WriteAllText(dialog.FileName, lrcText); } } + + private void ConvertFromSRT_Click(object sender, RoutedEventArgs e) + { + var dialog = new OpenFileDialog(); + dialog.Filter = "SRT 文件|*.srt"; + if (dialog.ShowDialog() is true) + { + var lrc = File.ReadAllText(dialog.FileName); + var converter = new SrtConverter(); + var alrcFile = converter.Convert(lrc); + var result = new EditableALRCConverter().ConvertBack(alrcFile); + _viewModel.Alrc.Lines = result.Lines; + _viewModel.Alrc.Styles = result.Styles; + _viewModel.Alrc.SongInfos = result.SongInfos; + _viewModel.Alrc.LyricInfo = result.LyricInfo; + } + } + + private void ConvertToSRT_Click(object sender, RoutedEventArgs e) + { + var alrc = new EditableALRCConverter().Convert(_viewModel.Alrc); + var converter = new SrtConverter(); + var lrcText = converter.ConvertBack(alrc); + var dialog = new SaveFileDialog(); + dialog.Filter = "SRT 文件|*.srt"; + if (dialog.ShowDialog() is true) + { + File.WriteAllText(dialog.FileName, lrcText); + } + } } \ No newline at end of file