diff --git a/libse/SeJsonParser.cs b/libse/SeJsonParser.cs index 9440fcc31..bad824670 100644 --- a/libse/SeJsonParser.cs +++ b/libse/SeJsonParser.cs @@ -6,7 +6,7 @@ namespace Nikse.SubtitleEdit.Core public class SeJsonParser { public enum SeJsonState - { + { Object, Array, Value, diff --git a/libse/SubtitleFormats/JsonType17.cs b/libse/SubtitleFormats/JsonType17.cs new file mode 100644 index 000000000..1aa029c47 --- /dev/null +++ b/libse/SubtitleFormats/JsonType17.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace Nikse.SubtitleEdit.Core.SubtitleFormats +{ + public class JsonType17 : SubtitleFormat + { + public override string Extension => ".json"; + + public override string Name => "JSON Type 17"; + + public override string ToText(Subtitle subtitle, string title) + { + var sb = new StringBuilder(); + sb.AppendLine("{" + Environment.NewLine + "\t\"subtitles\": ["); + for (int i = 0; i < subtitle.Paragraphs.Count; i++) + { + if (i > 0) + { + sb.AppendLine("\t,"); + } + + sb.AppendLine("\t{"); + sb.AppendLine("\t\t\"text\": ["); + Paragraph p = subtitle.Paragraphs[i]; + var lines = p.Text.SplitToLines(); + for (int j = 0; j < lines.Count; j++) + { + sb.Append("\t\t"); + sb.Append('"'); + sb.Append(Json.EncodeJsonText(lines[j])); + sb.Append('"'); + if (j < lines.Count - 1) + { + sb.Append(','); + } + sb.AppendLine(); + } + sb.AppendLine("\t\t],"); + + sb.AppendLine($"\t\t\"timestamp_begin\": {p.StartTime.TotalSeconds.ToString(CultureInfo.InvariantCulture)}, "); + sb.AppendLine($"\t\t\"timestamp_end\": {p.EndTime.TotalMilliseconds.ToString(CultureInfo.InvariantCulture)}"); + sb.AppendLine("\t}"); + } + + sb.Append("}"); + return sb.ToString().Trim(); + } + + public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) + { + _errorCount = 0; + + var sb = new StringBuilder(); + foreach (string s in lines) + { + sb.Append(s); + } + + string allText = sb.ToString(); + var indexOfMainTag = allText.IndexOf("\"timestamp_begin\"", StringComparison.Ordinal); + if (indexOfMainTag < 0) + { + return; + } + + var startIndex = allText.IndexOf('{'); + if (startIndex < 0) + { + return; + } + + var json = allText.Substring(startIndex); + var parser = new SeJsonParser(); + var items = parser.GetArrayElementsByName(json, "subtitles"); + foreach (var item in items) + { + var textLines = parser.GetArrayElementsByName(item, "text"); + var beginTime = parser.GetAllTagsByNameAsStrings(item, "timestamp_begin"); + var endTime = parser.GetAllTagsByNameAsStrings(item, "timestamp_end"); + if (textLines.Count > 0 && beginTime.Count == 1 && endTime.Count == 1 && + double.TryParse(beginTime[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds) && + double.TryParse(endTime[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var endSeconds)) + { + var text = new StringBuilder(); + foreach (var line in textLines) + { + text.AppendLine(Json.DecodeJsonText(line)); + } + + var p = new Paragraph(text.ToString().Trim(), startSeconds * 1000.0, endSeconds * 1000.0); + subtitle.Paragraphs.Add(p); + } + } + + subtitle.RemoveEmptyLines(); + subtitle.Renumber(); + } + } +} diff --git a/libse/SubtitleFormats/SubtitleFormat.cs b/libse/SubtitleFormats/SubtitleFormat.cs index 5bb0b9ae9..74e2edaa8 100644 --- a/libse/SubtitleFormats/SubtitleFormat.cs +++ b/libse/SubtitleFormats/SubtitleFormat.cs @@ -115,6 +115,7 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats new JsonType14(), new JsonType15(), new JsonType16(), + new JsonType17(), new KanopyHtml(), new LambdaCap(), new Lrc(),