OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Presets / PlistPresetHandler.cs
index 142662f..a030cfd 100644 (file)
@@ -1,8 +1,7 @@
 /*  PlistPresetHandler.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr/>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Presets\r
 {\r
@@ -15,65 +14,27 @@ namespace Handbrake.Presets
     using Functions;\r
     using Model;\r
 \r
+    /// <summary>\r
+    /// Plist Preset Converter\r
+    /// </summary>\r
     public class PlistPresetHandler\r
     {\r
-        /* WARNING This file is not complete!!!!!!\r
-         *\r
-         * TODO \r
-         * 1. Hookup all the widgets in the GUI so it exports real values.\r
-         * 2. Check for any missing key/value pairs\r
-         * 3. Test with MacGui / Cleanup code  / Retest \r
-         */\r
+        #region Import\r
 \r
-        private XmlTextWriter Writer;\r
-\r
-        /// <summary>\r
-        /// Import a Plist preset generated by the Mac or Linux GUI\r
-        /// </summary>\r
-        /// <param name="filename"></param>\r
-        /// <returns></returns>\r
         public static QueryParser Import(string filename)\r
         {\r
-            XmlNode root = null;\r
-            try\r
-            {\r
-                if (!File.Exists(filename))\r
-                    return null;\r
-\r
-                StreamReader sr = File.OpenText(filename);\r
-                string fromfile = string.Empty;\r
-                int fileChar;\r
-                while ((fileChar = sr.Read()) != -1)\r
-                    fromfile += Convert.ToChar(fileChar);\r
-\r
-                XmlDocument doc = new XmlDocument();\r
-                doc.LoadXml(fromfile);\r
-\r
-                root = doc;\r
-                if (!root.HasChildNodes)\r
-                {\r
-                    MessageBox.Show(\r
-                        "The Preset file you selected appears to be invlaid or from an older version of HandBrake",\r
-                        "Error",\r
-                        MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-                    return null;\r
-                }\r
-            }\r
-            catch (Exception)\r
-            {\r
-                MessageBox.Show(\r
-                    "The Preset file you selected appears to be invlaid or from an older version of HandBrake.\n\n Please note, if you are exporting from the MacGui you may need to rebuild your preset so that it uses the current preset plist format.\n The MacGui does not currently update user presets automatically.",\r
-                    "Error",\r
-                    MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-            }\r
+            XmlNode root = loadFile(filename);\r
+            if (root == null) return null;\r
 \r
             // We'll query a query parser object and use it's public var structures to store all the data.\r
             // This will allow the preset loader logic to be used instead of writing custom logic just for this file.\r
             QueryParser queryParsed = new QueryParser();\r
-            string QualityMode = string.Empty;\r
-            /***** Get the Audio Tracks *****/\r
+            string qualityMode = string.Empty;\r
+\r
+            #region Get a List of Audio Track Objects\r
             XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];\r
-            ArrayList AudioInfo = new ArrayList();\r
+            ArrayList audioTracks = new ArrayList();\r
+\r
             for (int i = 0; i < audioListDict.ChildNodes.Count; i++)\r
             {\r
                 XmlNode audioChannel = audioListDict.ChildNodes[i];\r
@@ -106,14 +67,17 @@ namespace Handbrake.Presets
                             break;\r
                     }\r
                 }\r
-                AudioInfo.Add(track);\r
+                audioTracks.Add(track);\r
+                queryParsed.AudioInformation = audioTracks;\r
             }\r
-            queryParsed.AudioInformation = AudioInfo;\r
+            #endregion\r
+\r
+            #region Parse the reset of the plist keys into local variables\r
 \r
-            /***** Get the rest of the settings. *****/\r
             XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;\r
-            for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)\r
+\r
             // Start from 2 to avoid the audio settings which we don't need.\r
+            for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)\r
             {\r
                 string key = presetSettings.ChildNodes[i].InnerText;\r
                 string value = presetSettings.ChildNodes[i + 1].InnerText;\r
@@ -136,6 +100,7 @@ namespace Handbrake.Presets
 \r
                     // Picture Settings\r
                     case "PictureAutoCrop":\r
+                        // Not used\r
                         break;\r
                     case "PictureTopCrop":\r
                         queryParsed.CropTop = value;\r
@@ -162,13 +127,13 @@ namespace Handbrake.Presets
                         queryParsed.AnamorphicMode = int.Parse(value);\r
                         break;\r
 \r
-\r
                     // Filters\r
                     case "PictureDeblock":\r
                         queryParsed.DeBlock = int.Parse(value);\r
                         break;\r
                     case "PictureDecomb":\r
                         queryParsed.Decomb = "Off";\r
+                        // Don't place custom here as it's handled in the filter panel\r
                         if (value == "2") queryParsed.Decomb = "Default";\r
                         break;\r
                     case "PictureDecombCustom":\r
@@ -184,6 +149,7 @@ namespace Handbrake.Presets
                             case "0":\r
                                 queryParsed.DeInterlace = "Off";\r
                                 break;\r
+                            // Don't place custom here as it's handled in the filter panel\r
                             case "2":\r
                                 queryParsed.DeInterlace = "Fast";\r
                                 break;\r
@@ -205,6 +171,7 @@ namespace Handbrake.Presets
                             case "0":\r
                                 queryParsed.DeNoise = "Off";\r
                                 break;\r
+                            // Don't place custom here as it's handled in the filter panel\r
                             case "2":\r
                                 queryParsed.DeNoise = "Weak";\r
                                 break;\r
@@ -247,7 +214,7 @@ namespace Handbrake.Presets
                         queryParsed.VideoQuality = float.Parse(value);\r
                         break;\r
                     case "VideoQualityType": // The Type of Quality Mode used\r
-                        QualityMode = value;\r
+                        qualityMode = value;\r
                         break;\r
                     case "VideoTargetSize":\r
                         queryParsed.VideoTargetSize = value;\r
@@ -295,7 +262,7 @@ namespace Handbrake.Presets
             }\r
 \r
             // Kill any Quality values we don't need.\r
-            switch (QualityMode)\r
+            switch (qualityMode)\r
             {\r
                 case "0": // FileSize\r
                     queryParsed.VideoQuality = -1;\r
@@ -310,187 +277,380 @@ namespace Handbrake.Presets
                     queryParsed.VideoTargetSize = null;\r
                     break;\r
             }\r
+            #endregion\r
 \r
             return queryParsed;\r
         }\r
 \r
+        private static XmlNode loadFile(string filename)\r
+        {\r
+            try\r
+            {\r
+                XmlNode root;\r
+\r
+                if (!File.Exists(filename))\r
+                    return null;\r
+\r
+                StreamReader sr = File.OpenText(filename);\r
+                string fromfile = string.Empty;\r
+                int fileChar;\r
+                while ((fileChar = sr.Read()) != -1)\r
+                    fromfile += Convert.ToChar(fileChar);\r
+\r
+                XmlDocument doc = new XmlDocument();\r
+                doc.LoadXml(fromfile);\r
+\r
+                root = doc;\r
+                if (!root.HasChildNodes)\r
+                {\r
+                    MessageBox.Show(\r
+                        "The Preset file you selected appears to be invlaid or from an older version of HandBrake",\r
+                        "Error",\r
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                    return null;\r
+                }\r
+\r
+                return root;\r
+            }\r
+            catch (Exception)\r
+            {\r
+                MessageBox.Show(\r
+                    "The Preset file you selected appears to be invlaid or from an older version of HandBrake.\n\n Please note, if you are exporting from the MacGui you may need to rebuild your preset so that it uses the current preset plist format.\n The MacGui does not currently update user presets automatically.",\r
+                    "Error",\r
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                return null;\r
+            }\r
+        }\r
+        #endregion\r
+\r
+        #region Export\r
+\r
         /// <summary>\r
-        /// Export a preset to a Plist file readable by the Mac and Linux GUI's\r
+        /// Export a MacGui style plist preset.\r
         /// </summary>\r
-        /// <param name="path"></param>\r
-        public void Export(string path)\r
+        /// <param name="path">\r
+        /// The path.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        public static void Export(string path, Preset preset)\r
         {\r
-            Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);\r
+            QueryParser parsed = QueryParser.Parse(preset.Query);\r
+\r
+            XmlTextWriter xmlWriter;\r
+\r
+            xmlWriter = new XmlTextWriter(path, Encoding.UTF8);\r
 \r
             // Header\r
-            Writer.WriteStartDocument();\r
-            Writer.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",\r
+            xmlWriter.WriteStartDocument();\r
+            xmlWriter.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",\r
                                 @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);\r
 \r
-            Writer.WriteStartElement("plist");\r
-            Writer.WriteStartElement("array");\r
+            xmlWriter.WriteStartElement("plist");\r
+            xmlWriter.WriteStartElement("array");\r
 \r
             // Add New Preset Here. Can write multiple presets here if required in future.\r
-            WritePreset();\r
+            WritePreset(xmlWriter, parsed, preset);\r
 \r
             // Footer\r
-            Writer.WriteEndElement();\r
-            Writer.WriteEndElement();\r
+            xmlWriter.WriteEndElement();\r
+            xmlWriter.WriteEndElement();\r
 \r
-            Writer.WriteEndDocument();\r
+            xmlWriter.WriteEndDocument();\r
 \r
             // Closeout\r
-            Writer.Close();\r
+            xmlWriter.Close();\r
         }\r
 \r
         /// <summary>\r
-        /// Write a Plist file\r
+        /// Write the Preset to a file\r
         /// </summary>\r
-        private void WritePreset()\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        private static void WritePreset(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset)\r
         {\r
-            Writer.WriteStartElement("dict");\r
-            AudioListArrayDict();\r
-            AddEncodeSettings();\r
+            xmlWriter.WriteStartElement("dict");\r
+            AudioListArrayDict(xmlWriter, parsed);\r
+            AddEncodeSettings(xmlWriter, parsed, preset);\r
 \r
-            Writer.WriteEndElement();\r
+            xmlWriter.WriteEndElement();\r
         }\r
 \r
         /// <summary>\r
-        /// Add all the encode settings to the preset\r
+        /// Add the encode settings to the preset\r
         /// </summary>\r
-        private void AddEncodeSettings()\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        private static void AddEncodeSettings(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset)\r
         {\r
-            AddEncodeElement("ChapterMarkers", "integer", string.Empty);\r
-            AddEncodeElement("Default", "integer", string.Empty);\r
-            AddEncodeElement("FileFormat", "String", string.Empty);\r
-            AddBooleanElement("Folder", true);\r
-            AddEncodeElement("Mp4HttpOptimize", "integer", string.Empty);\r
-            AddEncodeElement("Mp4LargeFile", "integer", string.Empty);\r
-            AddEncodeElement("Mp4iPodCompatible", "integer", string.Empty);\r
-            AddEncodeElement("PictureAutoCrop", "integer", string.Empty);\r
-            AddEncodeElement("PictureBottomCrop", "integer", string.Empty);\r
-            AddEncodeElement("PictureDeblock", "integer", string.Empty);\r
-            AddEncodeElement("PictureDecomb", "integer", string.Empty);\r
-            AddEncodeElement("PictureDecombCustom", "string", string.Empty);\r
-            AddEncodeElement("PictureDecombDeinterlace", "integer", string.Empty);\r
-            AddEncodeElement("PictureDeinterlace", "integer", string.Empty);\r
-            AddEncodeElement("PictureDeinterlaceCustom", "string", string.Empty);\r
-            AddEncodeElement("PictureDenoise", "integer", string.Empty);\r
-            AddEncodeElement("PictureDenoiseCustom", "string", string.Empty);\r
-            AddEncodeElement("PictureDetelecine", "integer", string.Empty);\r
-            AddEncodeElement("PictureDetelecineCustom", "string", string.Empty);\r
-            AddEncodeElement("PictureHeight", "integer", string.Empty);\r
-            AddEncodeElement("PictureKeepRatio", "integer", string.Empty);\r
-            AddEncodeElement("PictureLeftCrop", "integer", string.Empty);\r
-            AddEncodeElement("PicturePAR", "integer", string.Empty);\r
-            AddEncodeElement("PictureRightCrop", "integer", string.Empty);\r
-            AddEncodeElement("PictureTopCrop", "integer", string.Empty);\r
-            AddEncodeElement("PictureWidth", "integer", string.Empty);\r
-            AddEncodeElement("PresetBuildNumber", "string", string.Empty);\r
-            AddEncodeElement("PresetDescription", "string", string.Empty);\r
-            AddEncodeElement("PresetName", "string", string.Empty);\r
-            AddEncodeElement("Type", "integer", string.Empty);\r
-            AddEncodeElement("UsesMaxPictureSettings", "integer", string.Empty);\r
-            AddEncodeElement("UsesPictureFilters", "integer", string.Empty);\r
-            AddEncodeElement("UsesPictureSettings", "integer", string.Empty);\r
-            AddEncodeElement("VideoAvgBitrate", "string", string.Empty);\r
-            AddEncodeElement("VideoEncoder", "string", string.Empty);\r
-            AddEncodeElement("VideoFramerate", "string", string.Empty);\r
-            AddEncodeElement("VideoGrayScale", "integer", string.Empty);\r
-            AddEncodeElement("VideoQualitySlider", "real", string.Empty);\r
-            AddEncodeElement("VideoQualityType", "integer", string.Empty);\r
-            AddEncodeElement("VideoTargetSize", "string", string.Empty);\r
-            AddEncodeElement("VideoTurboTwoPass", "integer", string.Empty);\r
-            AddEncodeElement("VideoTwoPass", "integer", string.Empty);\r
-            AddEncodeElement("x264Option", "string", string.Empty);\r
+            AddEncodeElement(xmlWriter, "ChapterMarkers", "integer", parsed.ChapterMarkers ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Default", "integer", string.Empty); // TODO\r
+            AddEncodeElement(xmlWriter, "FileFormat", "string", parsed.Format);\r
+            AddBooleanElement(xmlWriter, "Folder", false); // TODO \r
+            AddEncodeElement(xmlWriter, "Mp4HttpOptimize", "integer", parsed.OptimizeMP4 ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Mp4LargeFile", "integer", parsed.LargeMP4 ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Mp4iPodCompatible", "integer", parsed.IpodAtom ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "PictureAutoCrop", "integer", "1"); // TODO\r
+            AddEncodeElement(xmlWriter, "PictureBottomCrop", "integer", parsed.CropBottom);\r
+\r
+            // Filters - TODO Requires Some Logic to convert modes\r
+            AddEncodeElement(xmlWriter, "PictureDeblock", "integer", parsed.DeBlock.ToString());\r
+\r
+            switch (parsed.Decomb)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);\r
+                    break;\r
+                case "Default":\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", parsed.Decomb);\r
+                    break;\r
+            }\r
+            AddEncodeElement(xmlWriter, "PictureDecombDeinterlace", "integer", parsed.Decomb != "Off" ? "0" : "1"); \r
+\r
+            switch (parsed.DeInterlace)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Fast":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Slow":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Slower":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "3");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "4");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", parsed.DeInterlace);\r
+                    break;\r
+            }\r
+\r
+            switch (parsed.DeNoise)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Weak":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Medium":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Strong":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "3");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "4");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", parsed.DeNoise);\r
+                    break;\r
+            }\r
+\r
+            int detelecine;\r
+            switch (parsed.DeTelecine)\r
+            {\r
+                case "Off":\r
+                    detelecine = 0;\r
+                    break;\r
+                case "Default":\r
+                    detelecine = 2;\r
+                    break;\r
+                default:\r
+                    detelecine = 1;\r
+                    break;\r
+            }\r
+            AddEncodeElement(xmlWriter, "PictureDetelecine", "integer", detelecine.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureDetelecineCustom", "string", detelecine == 1 ? parsed.DeTelecine : string.Empty);\r
+\r
+            // Picture Settings\r
+            AddEncodeElement(xmlWriter, "PictureHeight", "integer", parsed.Height.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureKeepRatio", "integer", parsed.KeepDisplayAsect ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "PictureLeftCrop", "integer", parsed.CropLeft);\r
+            AddEncodeElement(xmlWriter, "PicturePAR", "integer", parsed.AnamorphicMode.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureRightCrop", "integer", parsed.CropRight);\r
+            AddEncodeElement(xmlWriter, "PictureTopCrop", "integer", parsed.CropTop);\r
+            AddEncodeElement(xmlWriter, "PictureWidth", "integer", parsed.Width.ToString());\r
+\r
+            // Preset Information\r
+            AddEncodeElement(xmlWriter, "PresetBuildNumber", "string", Properties.Settings.Default.hb_build.ToString());\r
+            AddEncodeElement(xmlWriter, "PresetDescription", "string", "No Description");\r
+            AddEncodeElement(xmlWriter, "PresetName", "string", preset.Name);\r
+            AddEncodeElement(xmlWriter, "Type", "integer", "1"); // 1 is user preset, 0 is built in\r
+\r
+            // Preset Settings\r
+            AddEncodeElement(xmlWriter, "UsesMaxPictureSettings", "integer", (parsed.MaxWidth != 0 || parsed.MaxHeight != 0).ToString());\r
+            AddEncodeElement(xmlWriter, "UsesPictureFilters", "integer", "True");\r
+            AddEncodeElement(xmlWriter, "UsesPictureSettings", "integer", "True");\r
+\r
+            // Video Settings\r
+            AddEncodeElement(xmlWriter, "VideoAvgBitrate", "string", parsed.AverageVideoBitrate);\r
+            AddEncodeElement(xmlWriter, "VideoEncoder", "string", parsed.VideoEncoder);\r
+            AddEncodeElement(xmlWriter, "VideoFramerate", "string", parsed.VideoFramerate);\r
+            AddEncodeElement(xmlWriter, "VideoGrayScale", "integer", parsed.Grayscale ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "VideoQualitySlider", "real", parsed.VideoQuality.ToString());\r
+\r
+            int videoQualityType = 0;\r
+            if (!string.IsNullOrEmpty(parsed.VideoTargetSize)) videoQualityType = 0;\r
+            else if (!string.IsNullOrEmpty(parsed.AverageVideoBitrate)) videoQualityType = 1;\r
+            else if (parsed.VideoQuality != 0) videoQualityType = 2;\r
+\r
+            AddEncodeElement(xmlWriter, "VideoQualityType", "integer", videoQualityType.ToString());\r
+            AddEncodeElement(xmlWriter, "VideoTargetSize", "string", parsed.VideoTargetSize);\r
+            AddEncodeElement(xmlWriter, "VideoTurboTwoPass", "integer", parsed.TurboFirstPass ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "VideoTwoPass", "integer", parsed.TwoPass ? "1" : "0");\r
+\r
+            // x264 string\r
+            AddEncodeElement(xmlWriter, "x264Option", "string", parsed.H264Query);\r
         }\r
 \r
         /// <summary>\r
-        /// Add Preset setting + value\r
+        /// Add a boolean element\r
         /// </summary>\r
-        /// <param name="keyName"></param>\r
-        /// <param name="value"></param>\r
-        private void AddBooleanElement(string keyName, bool value)\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="keyName">\r
+        /// The key name.\r
+        /// </param>\r
+        /// <param name="value">\r
+        /// The value.\r
+        /// </param>\r
+        private static void AddBooleanElement(XmlTextWriter xmlWriter, string keyName, bool value)\r
         {\r
-            Writer.WriteStartElement("key");\r
-            Writer.WriteString(keyName);\r
-            Writer.WriteEndElement();\r
+            xmlWriter.WriteStartElement("key");\r
+            xmlWriter.WriteString(keyName);\r
+            xmlWriter.WriteEndElement();\r
             if (value)\r
             {\r
-                Writer.WriteStartElement("true");\r
-                Writer.WriteEndElement();\r
+                xmlWriter.WriteStartElement("true");\r
+                xmlWriter.WriteEndElement();\r
             }\r
             else\r
             {\r
-                Writer.WriteStartElement("false");\r
-                Writer.WriteEndElement();\r
+                xmlWriter.WriteStartElement("false");\r
+                xmlWriter.WriteEndElement();\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Add Preset setting + value\r
+        /// Add an encode setting element\r
         /// </summary>\r
-        /// <param name="keyName"></param>\r
-        /// <param name="type"></param>\r
-        /// <param name="value"></param>\r
-        private void AddEncodeElement(string keyName, string type, string value)\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="keyName">\r
+        /// The key name.\r
+        /// </param>\r
+        /// <param name="type">\r
+        /// The type.\r
+        /// </param>\r
+        /// <param name="value">\r
+        /// The value.\r
+        /// </param>\r
+        private static void AddEncodeElement(XmlTextWriter xmlWriter, string keyName, string type, string value)\r
         {\r
-            Writer.WriteElementString("key", keyName);\r
-            Writer.WriteElementString(type, value);\r
+            xmlWriter.WriteElementString("key", keyName);\r
+            xmlWriter.WriteElementString(type, value);\r
         }\r
 \r
         /// <summary>\r
-        /// Add List of audio tracks\r
+        /// Add an Audio Track Array Dict\r
         /// </summary>\r
-        private void AudioListArrayDict()\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        private static void AudioListArrayDict(XmlTextWriter xmlWriter, QueryParser parsed)\r
         {\r
-            Writer.WriteStartElement("key");\r
-            Writer.WriteString("AudioList");\r
-            Writer.WriteEndElement();\r
-\r
-            Writer.WriteStartElement("array");\r
-            AddAudioItem();\r
-            AddAudioItem();\r
-            Writer.WriteEndElement();\r
+            xmlWriter.WriteStartElement("key");\r
+            xmlWriter.WriteString("AudioList");\r
+            xmlWriter.WriteEndElement();\r
+\r
+            xmlWriter.WriteStartElement("array");\r
+            foreach (AudioTrack track in parsed.AudioInformation)\r
+            {\r
+                AddAudioItem(xmlWriter, track);\r
+            }\r
+            xmlWriter.WriteEndElement();\r
         }\r
 \r
         /// <summary>\r
-        /// Add List of audio tracks\r
+        /// Add an audio track\r
         /// </summary>\r
-        private void AddAudioItem()\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="audioTrack">\r
+        /// The audio track.\r
+        /// </param>\r
+        private static void AddAudioItem(XmlTextWriter xmlWriter, AudioTrack audioTrack)\r
         {\r
-            int bitrate = 448;\r
-            string encoder = "AC3 Passthru";\r
-            string mixdown = "AC3 Passthru";\r
-            string sample = "Auto";\r
-            int track = 1;\r
-            double drc = 0.0;\r
-            string desc = "English (AC3) (5.1 ch)";\r
+            string bitrate = audioTrack.Bitrate;\r
+            string encoder = audioTrack.Encoder;\r
+            string mixdown = audioTrack.MixDown;\r
+            string sample = audioTrack.SampleRate;\r
+            int track;\r
+            int.TryParse(audioTrack.Track, out track);\r
+            string drc = audioTrack.DRC;\r
+            string desc = "Automatic";\r
 \r
-            Writer.WriteStartElement("dict");\r
+            xmlWriter.WriteStartElement("dict");\r
 \r
-            Writer.WriteElementString("key", "AudioBitrate");\r
-            Writer.WriteElementString("string", bitrate.ToString());\r
+            xmlWriter.WriteElementString("key", "AudioBitrate");\r
+            xmlWriter.WriteElementString("string", bitrate);\r
 \r
-            Writer.WriteElementString("key", "AudioEncoder");\r
-            Writer.WriteElementString("string", encoder);\r
+            xmlWriter.WriteElementString("key", "AudioEncoder");\r
+            xmlWriter.WriteElementString("string", encoder);\r
 \r
-            Writer.WriteElementString("key", "AudioMixdown");\r
-            Writer.WriteElementString("string", mixdown);\r
+            xmlWriter.WriteElementString("key", "AudioMixdown");\r
+            xmlWriter.WriteElementString("string", mixdown);\r
 \r
-            Writer.WriteElementString("key", "AudioSamplerate");\r
-            Writer.WriteElementString("string", sample);\r
+            xmlWriter.WriteElementString("key", "AudioSamplerate");\r
+            xmlWriter.WriteElementString("string", sample);\r
 \r
-            Writer.WriteElementString("key", "AudioTrack");\r
-            Writer.WriteElementString("integer", track.ToString());\r
+            xmlWriter.WriteElementString("key", "AudioTrack");\r
+            xmlWriter.WriteElementString("integer", track.ToString());\r
 \r
-            Writer.WriteElementString("key", "AudioTrackDRCSlider");\r
-            Writer.WriteElementString("real", drc.ToString());\r
+            xmlWriter.WriteElementString("key", "AudioTrackDRCSlider");\r
+            xmlWriter.WriteElementString("real", drc);\r
 \r
-            Writer.WriteElementString("key", "AudioTrackDescription");\r
-            Writer.WriteElementString("string", desc);\r
+            xmlWriter.WriteElementString("key", "AudioTrackDescription");\r
+            xmlWriter.WriteElementString("string", desc);\r
 \r
-            Writer.WriteEndElement();\r
+            xmlWriter.WriteEndElement();\r
         }\r
+        #endregion\r
     }\r
 }
\ No newline at end of file