Пример #1
0
        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();
        }
Пример #2
0
        public void SimpleNull()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : null }]", "content");

            Assert.AreEqual(null, result[0]);
        }
Пример #3
0
        public void SimpleBoolFalse()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : false }]", "content");

            Assert.AreEqual("false", result[0]);
        }
Пример #4
0
        public void SimpleQuote()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("{ \"content\" : \"Joe \\\"is\\\" best\"}", "content");

            Assert.AreEqual("Joe \\\"is\\\" best", result.First());
        }
Пример #5
0
        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]);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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();
        }
Пример #8
0
        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();
        }
Пример #9
0
        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]);
        }
Пример #10
0
        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();
        }
Пример #11
0
        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();
        }