public override void LoadSubtitle(Subtitle subtitle, List <string> 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("\"SubtitleLanguages\"", StringComparison.Ordinal); if (indexOfMainTag < 0) { return; } var startIndex = allText.Remove(indexOfMainTag).LastIndexOf('{'); if (startIndex < 0) { return; } var json = allText.Substring(startIndex); var parser = new SeJsonParser(); var items = parser.GetArrayElementsByName(json, "SubtitleItems"); foreach (var item in items) { var textLines = parser.GetArrayElementsByName(item, "TextLines"); var showTime = parser.GetAllTagsByNameAsStrings(item, "ShowTime"); var hideTime = parser.GetAllTagsByNameAsStrings(item, "HideTime"); if (textLines.Count > 0 && showTime.Count == 1 && hideTime.Count == 1 && long.TryParse(showTime[0], out var startMs) && long.TryParse(hideTime[0], out var endMs)) { var text = new StringBuilder(); foreach (var line in textLines) { text.AppendLine(Json.DecodeJsonText(line)); } var p = new Paragraph(text.ToString().Trim(), startMs, endMs); var className = parser.GetAllTagsByNameAsStrings(item, "ClassName"); if (className.Count == 1) { p.Language = className[0]; } subtitle.Paragraphs.Add(p); } } subtitle.RemoveEmptyLines(); subtitle.Renumber(); }
public void SimpleNull() { var parser = new SeJsonParser(); var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : null }]", "content"); Assert.AreEqual(null, result[0]); }
public void SimpleBoolFalse() { var parser = new SeJsonParser(); var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : false }]", "content"); Assert.AreEqual("false", result[0]); }
public void SimpleQuote() { var parser = new SeJsonParser(); var result = parser.GetAllTagsByNameAsStrings("{ \"content\" : \"Joe \\\"is\\\" best\"}", "content"); Assert.AreEqual("Joe \\\"is\\\" best", result.First()); }
public void SimpleArray() { var parser = new SeJsonParser(); var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : \"Joe1\"},{ \"content\" : \"Joe2\"}]", "content"); Assert.AreEqual("Joe1", result[0]); Assert.AreEqual("Joe2", result[1]); }
private static double GetTimeCode(SeJsonParser parser, string timeObject) { var h = parser.GetAllTagsByNameAsStrings(timeObject, "h").FirstOrDefault(); var m = parser.GetAllTagsByNameAsStrings(timeObject, "m").FirstOrDefault(); var s = parser.GetAllTagsByNameAsStrings(timeObject, "s").FirstOrDefault(); var f = parser.GetAllTagsByNameAsStrings(timeObject, "f").FirstOrDefault(); if (h != null && m != null && s != null && f != null && int.TryParse(h, NumberStyles.Integer, CultureInfo.InvariantCulture, out var hNumber) && int.TryParse(m, NumberStyles.Integer, CultureInfo.InvariantCulture, out var mNumber) && int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out var sNumber) && int.TryParse(f, NumberStyles.Integer, CultureInfo.InvariantCulture, out var fNumber)) { var tc = new TimeCode(hNumber, mNumber, sNumber, FramesToMillisecondsMax999(fNumber)); return(tc.TotalMilliseconds); } return(double.MinValue); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); foreach (string s in lines) { sb.Append(s); } var text = sb.ToString(); if (!text.Contains("\"items\"") || !text.Contains("\"alternatives\"", StringComparison.Ordinal)) { return; } var parser = new SeJsonParser(); foreach (string json in parser.GetArrayElementsByName(text, "items")) { var start = parser.GetAllTagsByNameAsStrings(json, "start_time").FirstOrDefault(); var end = parser.GetAllTagsByNameAsStrings(json, "end_time").FirstOrDefault(); var content = parser.GetAllTagsByNameAsStrings(json, "content").FirstOrDefault(); if (start != null && end != null && !string.IsNullOrEmpty(content)) { if (double.TryParse(start, System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out var startSeconds) && double.TryParse(end, System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out var endSeconds)) { subtitle.Paragraphs.Add(new Paragraph(Json.DecodeJsonText(content), startSeconds * TimeCode.BaseUnit, endSeconds * TimeCode.BaseUnit)); } else { _errorCount++; } } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); foreach (string s in lines) { sb.Append(s); } var text = sb.ToString().TrimStart(); if (!text.StartsWith("[", StringComparison.Ordinal)) { var tag = "\"subtitles\":"; var startTag = text.IndexOf(tag, StringComparison.Ordinal); if (startTag >= 0) { text = text.Remove(0, startTag + tag.Length).TrimStart(); } if (!text.StartsWith("[", StringComparison.Ordinal)) { return; } } var parser = new SeJsonParser(); var elements = parser.GetArrayElements(text); foreach (var element in elements) { var startTimeObject = parser.GetFirstObject(element, "startTime"); var endTimeObject = parser.GetFirstObject(element, "endTime"); var texts = parser.GetAllTagsByNameAsStrings(element, "text"); if (texts.Count == 1 && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(endTimeObject)) { var startTime = GetTimeCode(parser, startTimeObject); var endTime = GetTimeCode(parser, endTimeObject); if (Math.Abs(startTime - double.MinValue) < 0.01 || Math.Abs(endTime - double.MinValue) < 0.01) { _errorCount++; } else { var p = new Paragraph(texts[0], startTime, endTime); subtitle.Paragraphs.Add(p); } } } subtitle.Renumber(); }
public void Complex() { var parser = new SeJsonParser(); var result = parser.GetAllTagsByNameAsStrings("{" + Environment.NewLine + "\"name\":\"John\"," + Environment.NewLine + "\"age\":30," + Environment.NewLine + "\"cars\": [" + Environment.NewLine + "{ \"name\":\"Ford\", \"content\":\"Fiesta\" }," + Environment.NewLine + "{ \"name\":\"BMW\", \"content\": \"X3\"}," + Environment.NewLine + "{ \"name\":\"Fiat\", \"content\": \"500\" } ]}", "content"); Assert.AreEqual("Fiesta", result[0]); Assert.AreEqual("X3", result[1]); Assert.AreEqual("500", result[2]); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); foreach (string s in lines) { sb.Append(s); } var text = sb.ToString().TrimStart(); if (!text.Contains("\"body\"")) { return; } var parser = new SeJsonParser(); var elements = parser.GetArrayElementsByName(text, "body"); foreach (var element in elements) { var startTimeObject = parser.GetFirstObject(element, "from"); var endTimeObject = parser.GetFirstObject(element, "to"); var texts = parser.GetAllTagsByNameAsStrings(element, "content"); if (texts.Count == 1 && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(endTimeObject)) { var startTime = GetTimeCode(startTimeObject); var endTime = GetTimeCode(endTimeObject); if (Math.Abs(startTime - double.MinValue) < 0.01 || Math.Abs(endTime - double.MinValue) < 0.01) { _errorCount++; } else { var pText = texts[0].Replace("\\n", Environment.NewLine); var p = new Paragraph(pText, startTime, endTime); subtitle.Paragraphs.Add(p); } } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); foreach (string s in lines) { sb.Append(s); } var text = sb.ToString().TrimStart(); if (!text.StartsWith("[", StringComparison.Ordinal)) { return; } var parser = new SeJsonParser(); var elements = parser.GetArrayElements(text); foreach (var element in elements) { var startTimeObject = parser.GetFirstObject(element, "start"); var endTimeObject = parser.GetFirstObject(element, "end"); var texts = parser.GetAllTagsByNameAsStrings(element, "text"); if (texts.Count > 0 && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(endTimeObject)) { if (long.TryParse(startTimeObject, out var startMs) && long.TryParse(endTimeObject, out var endMs)) { var p = new Paragraph(string.Join(Environment.NewLine, texts), startMs, endMs); subtitle.Paragraphs.Add(p); } else { _errorCount++; } } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> 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 indexOfSubtitles = allText.IndexOf("subtitles", StringComparison.Ordinal); if (indexOfSubtitles <= 0) { return; } var startText = allText.Substring(0, indexOfSubtitles); var startIndex = startText.LastIndexOf('{'); 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(); }