From 729212a5d59db3cdb0bae8901852fef4e569b79e Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Thu, 1 Jul 2021 13:16:09 -0600 Subject: [PATCH] Simplified ffmpeg chapter parser by using json insterad of xml. --- AaxDecrypter/Chapters.cs | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/AaxDecrypter/Chapters.cs b/AaxDecrypter/Chapters.cs index 8a05e7e2..fedc3b40 100644 --- a/AaxDecrypter/Chapters.cs +++ b/AaxDecrypter/Chapters.cs @@ -1,9 +1,9 @@ using Dinah.Core; using Dinah.Core.Diagnostics; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; -using System.Globalization; using System.Linq; using System.Text; @@ -14,36 +14,25 @@ namespace AaxDecrypter private List _chapterList = new List(); public IEnumerable Chapters => _chapterList.AsEnumerable(); public int Count => _chapterList.Count; - public ChapterInfo() { } public ChapterInfo(string audiobookFile) { var info = new ProcessStartInfo { FileName = DecryptSupportLibraries.ffprobePath, - Arguments = "-loglevel panic -show_chapters -print_format xml \"" + audiobookFile + "\"" + Arguments = "-loglevel panic -show_chapters -print_format json \"" + audiobookFile + "\"" }; + var xml = info.RunHidden().Output; + var chapterJObject = JObject.Parse(xml); + var chapters = chapterJObject["chapters"] + .Select(c => new Chapter( + c["tags"]?["title"]?.Value(), + c["start_time"].Value(), + c["end_time"].Value() + )); - var xmlDocument = new System.Xml.XmlDocument(); - xmlDocument.LoadXml(xml); - var chaptersXml = xmlDocument.SelectNodes("/ffprobe/chapters/chapter") - .Cast() - .Where(n => n.Name == "chapter"); - - foreach (var cnode in chaptersXml) - { - double startTime = double.Parse(cnode.Attributes["start_time"].Value.Replace(",", "."), CultureInfo.InvariantCulture); - double endTime = double.Parse(cnode.Attributes["end_time"].Value.Replace(",", "."), CultureInfo.InvariantCulture); - - string chapterTitle = cnode.ChildNodes - .Cast() - .Where(childnode => childnode.Attributes["key"].Value == "title") - .Select(childnode => childnode.Attributes["value"].Value) - .FirstOrDefault(); - - AddChapter(new Chapter(chapterTitle, (long)(startTime * 1000), (long)((endTime - startTime) * 1000))); - } + _chapterList.AddRange(chapters); } public void AddChapter(Chapter chapter) { @@ -79,6 +68,10 @@ namespace AaxDecrypter StartOffset = TimeSpan.FromMilliseconds(startOffsetMs); EndOffset = StartOffset + TimeSpan.FromMilliseconds(lengthMs); } + public Chapter(string title, double startTimeSec, double endTimeSec) + :this(title, (long)(startTimeSec * 1000), (long)((endTimeSec - startTimeSec) * 1000)) + { + } public string ToFFMeta() {