コード例 #1
0
ファイル: AudioToText.cs プロジェクト: hugok79/subtitleedit
        private static List <ResultText> ParseJsonToResult(string result)
        {
            var list       = new List <ResultText>();
            var jsonParser = new SeJsonParser();
            var root       = jsonParser.GetArrayElementsByName(result, "result");

            foreach (var item in root)
            {
                var conf  = jsonParser.GetFirstObject(item, "conf");
                var start = jsonParser.GetFirstObject(item, "start");
                var end   = jsonParser.GetFirstObject(item, "end");
                var word  = jsonParser.GetFirstObject(item, "word");
                if (!string.IsNullOrWhiteSpace(word) &&
                    decimal.TryParse(conf, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var confidence) &&
                    decimal.TryParse(start, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds) &&
                    decimal.TryParse(end, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var endSeconds))
                {
                    var rt = new ResultText {
                        Confidence = confidence, Text = word, Start = startSeconds, End = endSeconds
                    };
                    list.Add(rt);
                }
            }

            return(list);
        }
コード例 #2
0
        public void SimpleBoolFalse()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : false }]", "content");

            Assert.AreEqual("false", result[0]);
        }
コード例 #3
0
        public void SimpleQuote()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("{ \"content\" : \"Joe \\\"is\\\" best\"}", "content");

            Assert.AreEqual("Joe \\\"is\\\" best", result.First());
        }
コード例 #4
0
        public void SimpleNull()
        {
            var parser = new SeJsonParser();
            var result = parser.GetAllTagsByNameAsStrings("[{ \"content\" : null }]", "content");

            Assert.AreEqual(null, result[0]);
        }
コード例 #5
0
ファイル: JsonType19.cs プロジェクト: zhiiker/subtitleedit
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;

            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var text = sb.ToString().TrimStart();

            if (!text.Contains("\"segs\"", StringComparison.Ordinal) || !text.Contains('['))
            {
                return;
            }

            var parser   = new SeJsonParser();
            var elements = parser.GetArrayElements(text.Substring(text.IndexOf('[')));

            foreach (var element in elements)
            {
                var startTimeObject    = parser.GetFirstObject(element, "tStartMs");
                var durationTimeObject = parser.GetFirstObject(element, "dDurationMs");
                var idx = element.IndexOf('[');
                var s   = string.Empty;
                if (idx > 0)
                {
                    sb = new StringBuilder();
                    var arr = parser.GetArrayElements(element.Substring(idx));
                    foreach (var line in arr)
                    {
                        var content = parser.GetFirstObject(line, "utf8");
                        if (content != null)
                        {
                            sb.Append(content.Replace("\\n", Environment.NewLine) + " ");
                        }
                    }
                    s = sb.ToString().Trim();

                    if (!string.IsNullOrEmpty(s) && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(durationTimeObject))
                    {
                        if (double.TryParse(startTimeObject, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startMs) &&
                            double.TryParse(durationTimeObject, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var durationMs))
                        {
                            var pText = Json.DecodeJsonText(s);
                            var p     = new Paragraph(pText, startMs, startMs + durationMs);
                            subtitle.Paragraphs.Add(p);
                        }
                        else
                        {
                            _errorCount++;
                        }
                    }
                }
            }
            subtitle.Renumber();
        }
コード例 #6
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]);
        }
コード例 #7
0
        public void GetArrayElementsByName_Empty_Array()
        {
            var parser = new SeJsonParser();
            var result = parser.GetArrayElementsByName("{ \"start_time\": \"118.64\", \"items\": [] }", "items");

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual("", result[0].Trim());
        }
コード例 #8
0
ファイル: HollyStarJson.cs プロジェクト: zzfeed/subtitleedit
        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();
        }
コード例 #9
0
        public void GetArrayElementsByName_Simple()
        {
            var parser = new SeJsonParser();
            var result = parser.GetArrayElementsByName("{ \"items\": [ { \"name\" : \"Joe1\" },{ \"name\" : \"Joe2\" } ] }", "items");

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual("{ \"name\" : \"Joe1\" }", result[0].Trim());
            Assert.AreEqual("{ \"name\" : \"Joe2\" }", result[1].Trim());
        }
コード例 #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.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();
        }
コード例 #11
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]);
        }
コード例 #12
0
        public void GetArrayElementsByName_Get_Two_Lines()
        {
            var json   = @"{                    
	        'TextLines': [                        
		        'Aussi dur que ce soit pour nous,',
		        'tout ce qui nous arrive'
		        ],                    
	        'ClassName': 'fr',
	        'ShowTime': 115801,                    
	        'HideTime': 120040"    .Replace('\'', '"');
            var parser = new SeJsonParser();
            var result = parser.GetArrayElementsByName(json, "TextLines");

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual("Aussi dur que ce soit pour nous,", result[0].Trim());
            Assert.AreEqual("tout ce qui nous arrive", result[1].Trim());
        }
コード例 #13
0
ファイル: Bilibili.cs プロジェクト: zhiiker/subtitleedit
        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();
        }
コード例 #14
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);
        }
コード例 #15
0
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;

            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var text = sb.ToString().TrimStart();

            if (text.IndexOf("atpjfile_info", StringComparison.Ordinal) < 0)
            {
                return;
            }

            subtitle.Paragraphs.Clear();
            var parser   = new SeJsonParser();
            var elements = parser.GetArrayElementsByName(text, "BLOCKS");

            foreach (var element in elements)
            {
                var startTimeObject = parser.GetFirstObject(element, "time_start");
                var endTimeObject   = parser.GetFirstObject(element, "time_end");
                var textObject      = parser.GetFirstObject(element, "text");
                if (!string.IsNullOrEmpty(textObject) && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(endTimeObject))
                {
                    if (double.TryParse(startTimeObject, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var startMs) &&
                        double.TryParse(endTimeObject, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var endMs))
                    {
                        var s = Utilities.UrlDecode(Json.DecodeJsonText(textObject));
                        var p = new Paragraph(s, startMs, endMs);
                        subtitle.Paragraphs.Add(p);
                    }
                    else
                    {
                        _errorCount++;
                    }
                }
            }
            subtitle.Renumber();
        }
コード例 #16
0
ファイル: JsonType18.cs プロジェクト: xianvfx/subtitleedit
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;

            var sb = new StringBuilder();

            foreach (var 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, "s");
                var durationTimeObject = parser.GetFirstObject(element, "d");
                var s = parser.GetFirstObject(element, "n");
                if (!string.IsNullOrEmpty(s) && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(durationTimeObject))
                {
                    if (double.TryParse(startTimeObject, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds) &&
                        double.TryParse(durationTimeObject, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var durationSeconds))
                    {
                        var pText = Json.DecodeJsonText(s);
                        var p     = new Paragraph(pText, startSeconds * 1000.0, (startSeconds + durationSeconds) * 1000.0);
                        subtitle.Paragraphs.Add(p);
                    }
                    else
                    {
                        _errorCount++;
                    }
                }
            }
            subtitle.Renumber();
        }
コード例 #17
0
ファイル: JsonType20.cs プロジェクト: zhiiker/subtitleedit
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;
            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var text = sb.ToString().TrimStart();

            if (!text.Contains("\"alternatives\"", StringComparison.Ordinal) || !text.Contains("\"words\"", StringComparison.Ordinal))
            {
                return;
            }

            var parser = new SeJsonParser();
            var words  = parser.GetArrayElementsByName(text, "words");

            foreach (var word in words)
            {
                var startTimeObject = parser.GetFirstObject(word, "startTime");
                var endTimeObject   = parser.GetFirstObject(word, "endTime");
                var s = parser.GetFirstObject(word, "word");
                if (!string.IsNullOrEmpty(s) && !string.IsNullOrEmpty(startTimeObject) && !string.IsNullOrEmpty(endTimeObject))
                {
                    if (double.TryParse(startTimeObject.TrimEnd('s'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSecs) &&
                        double.TryParse(endTimeObject.TrimEnd('s'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var endSecs))
                    {
                        var pText = Json.DecodeJsonText(s);
                        var p     = new Paragraph(pText, startSecs * 1000.0, endSecs * 1000.0);
                        subtitle.Paragraphs.Add(p);
                    }
                    else
                    {
                        _errorCount++;
                    }
                }
            }

            subtitle.Renumber();
        }
コード例 #18
0
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;

            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var allText = sb.ToString();

            if (!allText.Contains("\"lines\""))
            {
                return;
            }

            var jp        = new SeJsonParser();
            var fragments = jp.GetArrayElementsByName(allText, "fragments");

            for (var i = 0; i < fragments.Count; i++)
            {
                var fragment  = fragments[i];
                var startTime = jp.GetFirstObject(fragment, "begin");
                var endTime   = jp.GetFirstObject(fragment, "end");
                var texts     = jp.GetArrayElementsByName(fragment, "lines");
                if (decimal.TryParse(startTime, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var startSeconds) &&
                    decimal.TryParse(endTime, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var endSeconds))
                {
                    var text = string.Join(Environment.NewLine, texts);
                    var p    = new Paragraph(text, (double)startSeconds * 1000.0, (double)endSeconds * 1000.0);
                    subtitle.Paragraphs.Add(p);
                }
                else
                {
                    _errorCount++;
                }
            }

            subtitle.RemoveEmptyLines();
            subtitle.Renumber();
        }
コード例 #19
0
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;
            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var text = sb.ToString().TrimStart();

            if (text.IndexOf("captiondata", StringComparison.Ordinal) < 0)
            {
                return;
            }

            subtitle.Paragraphs.Clear();
            var parser        = new SeJsonParser();
            var captionDataAr = parser.GetArrayElementsByName(text, "captiondata");

            foreach (var captionData in captionDataAr)
            {
                var texts = parser.GetArrayElementsByName(captionData, "data");
                foreach (var textElement in texts)
                {
                    var start   = parser.GetFirstObject(textElement, "fromms");
                    var end     = parser.GetFirstObject(textElement, "toms");
                    var caption = parser.GetFirstObject(textElement, "caption");
                    if (!string.IsNullOrEmpty(caption) &&
                        double.TryParse(start, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var startMs) &&
                        double.TryParse(end, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var endMs))
                    {
                        caption = Json.DecodeJsonText(caption);
                        caption = caption.Replace("<br />", Environment.NewLine);
                        var p = new Paragraph(caption, startMs, endMs);
                        subtitle.Paragraphs.Add(p);
                    }
                }
            }

            subtitle.Renumber();
        }
コード例 #20
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("\"timestamp_begin\"", StringComparison.Ordinal);

            if (indexOfMainTag < 0 && !allText.Contains("\"data\""))
            {
                return;
            }

            var startIndex = allText.IndexOf('{');

            if (startIndex < 0)
            {
                return;
            }

            var json         = allText.Substring(startIndex);
            var parser       = new SeJsonParser();
            var subtitleData = parser.GetFirstObject(json, "data");

            if (string.IsNullOrEmpty(subtitleData))
            {
                return;
            }

            var format    = new TwentyThreeJson();
            var innerJson = Json.DecodeJsonText(subtitleData);

            format.LoadSubtitle(subtitle, new List <string> {
                innerJson
            }, null);
        }
コード例 #21
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();
        }
コード例 #22
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();
        }
コード例 #23
0
        public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName)
        {
            _errorCount = 0;
            var sb = new StringBuilder();

            foreach (var s in lines)
            {
                sb.Append(s);
            }

            var text = sb.ToString().TrimStart();

            if (text.IndexOf("canvas_config", StringComparison.Ordinal) < 0)
            {
                return;
            }

            subtitle.Paragraphs.Clear();
            var parser         = new SeJsonParser();
            var textDictionary = new Dictionary <string, string>();
            var texts          = parser.GetArrayElementsByName(text, "texts");

            foreach (var textElement in texts)
            {
                var id      = parser.GetFirstObject(textElement, "id");
                var content = parser.GetFirstObject(textElement, "content");
                if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(content))
                {
                    textDictionary.Add(id, content);
                }
            }

            var timeDictionary = new Dictionary <string, Paragraph>();
            var tracks         = parser.GetArrayElementsByName(text, "tracks");

            foreach (var track in tracks)
            {
                var trackType = parser.GetFirstObject(track, "type");
                if (trackType == "text")
                {
                    var segments = parser.GetArrayElementsByName(track, "segments");
                    foreach (var segment in segments)
                    {
                        var id             = parser.GetFirstObject(segment, "material_id");
                        var targetTimeRage = parser.GetFirstObject(segment, "target_timerange");
                        if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(targetTimeRage))
                        {
                            var start    = parser.GetFirstObject(targetTimeRage, "start");
                            var duration = parser.GetFirstObject(targetTimeRage, "duration");
                            if (double.TryParse(start, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var startNumber) &&
                                double.TryParse(duration, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var durationNumber))
                            {
                                var startMs    = startNumber / 1_000;
                                var durationMs = durationNumber / 1_000;
                                var endMs      = startMs + durationMs;
                                var p          = new Paragraph(string.Empty, startMs, endMs);
                                timeDictionary.Add(id, p);
                            }
                        }
                    }
                }
            }

            foreach (var kvp in textDictionary)
            {
                if (timeDictionary.TryGetValue(kvp.Key, out var p))
                {
                    p.Text = kvp.Value;
                    subtitle.Paragraphs.Add(p);
                }
            }

            subtitle.Sort(Enums.SubtitleSortCriteria.StartTime);
            subtitle.Renumber();
        }
コード例 #24
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("\"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();
        }
コード例 #25
0
        public void GetArrayElementsByName_Advanced()
        {
            var parser = new SeJsonParser();
            var result = parser.GetArrayElementsByName(@"{
    'results': {
        'transcripts': [
            {
                'transcript': 'em águas brasileiras estão achado mais antigo que o homem. Pré sal pré sal começa a se formar há mais de cem milhões de Jonas com Regina. Salas ainda habitavam até os postos são de altíssima produtividade. As grandes reservas de petróleo foram descobertas em dois mil e seis. Dois anos depois, o Brasil já começava a produzir petróleo retirado do pré sal. E hoje, quando a gente olha para trás, era muito desconhecido. Já são dez anos, vem sendo desafios para isso. As equipes contam com tecnologia especialmente desenvolvida para o pré sal. Muitas soluções saíram do Centro de Pesquisas da Petrobras Cenpes, no Rio de Janeiro. Aqui, pesquisadores inventaram técnicas que não existiam no mercado, coisa que o geofísico desenvolveram técnicas de processamento muito especial de matemática pesada. Para tentar mostrar de maneira mais óbvia onde estava roxa de pessoal, a área do pré sal fica a trezentos quilômetros da costa que vai do Espírito Santo a Santa Catarina, uma extensão de oitocentos quilômetros. O petróleo está a sete mil metros de profundidade, abaixo de uma espessa camada de sal, que funciona como um sino. Ao contrário do que muita gente acha que o petróleo tem, piscinas, debaixo do Mar Petróleo se aloja nesses buracos nessas horas, muitas dessas rochas estão no fundo da Bacia de Santos, no litoral de São Paulo. Metade da produção de petróleo que a gente tem aqui no Brasil já vem do pré sal, e um terço do gás que é consumido pelo Brasil também vem do pré sal. Então, se a gente não tivesse descoberto e desenvolvido essa tecnologia toda para poder operar as plataformas, hoje a gente estaria muito mais dependente do mercado externo. A jornada do conhecimento da tecnologia trouxe para a Petrobras a inovação que certamente para nós, hoje são ativos, são mais importantes do que o petróleo.'
            }
        ],
        'speaker_labels': {
            'speakers': 4,
            'segments': [
                {
                    'start_time': '5.17',
                    'speaker_label': 'spk_0',
                    'end_time': '9.25',
                    'items': [
                        {
                            'start_time': '5.17',
                            'speaker_label': 'spk_0',
                            'end_time': '5.37'
                        },
                        {
                            'start_time': '105.54',
                            'speaker_label': 'spk_1',
                            'end_time': '106.09'
                        }
                    ]
                }
            ]
        },
        'items': [
            {
                'start_time': '5.17',
                'end_time': '5.37',
                'alternatives': [
                    {
                        'confidence': '0.9999',
                        'content': 'em'
                    }
                ],
                'type': 'pronunciation'
            },
            {
                'start_time': '5.37',
                'end_time': '5.67',
                'alternatives': [
                    {
                        'confidence': '0.9999',
                        'content': 'águas'
                    }
                ],
                'type': 'pronunciation'
            }
        ]
    },
    'status': 'COMPLETED'
}".Replace('\'', '"'), "items");

            Assert.AreEqual(4, result.Count);
        }