/// <summary> /// Export a MacGui style plist preset. /// </summary> /// <param name="path"> /// The path. /// </param> /// <param name="preset"> /// The preset. /// </param> public static void Export(string path, Preset preset) { QueryParser parsed = QueryParser.Parse(preset.Query); XmlTextWriter xmlWriter = new XmlTextWriter(path, Encoding.UTF8) { Formatting = Formatting.Indented }; // Header xmlWriter.WriteStartDocument(); xmlWriter.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN", @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null); xmlWriter.WriteStartElement("plist"); xmlWriter.WriteStartElement("array"); // Add New Preset Here. Can write multiple presets here if required in future. WritePreset(xmlWriter, parsed, preset); // Footer xmlWriter.WriteEndElement(); xmlWriter.WriteEndElement(); xmlWriter.WriteEndDocument(); // Closeout xmlWriter.Close(); }
/// <summary> /// Write the Preset to a file /// </summary> /// <param name="xmlWriter"> /// The xml writer. /// </param> /// <param name="parsed"> /// The parsed. /// </param> /// <param name="preset"> /// The preset. /// </param> private static void WritePreset(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset) { xmlWriter.WriteStartElement("dict"); AudioListArrayDict(xmlWriter, parsed); AddEncodeSettings(xmlWriter, parsed, preset); xmlWriter.WriteEndElement(); }
/// <summary> /// Add the encode settings to the preset /// </summary> /// <param name="xmlWriter"> /// The xml writer. /// </param> /// <param name="parsed"> /// The parsed. /// </param> /// <param name="preset"> /// The preset. /// </param> private static void AddEncodeSettings(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset) { AddEncodeElement(xmlWriter, "ChapterMarkers", "integer", parsed.ChapterMarkers ? "1" : "0"); AddEncodeElement(xmlWriter, "Default", "integer", "0"); AddEncodeElement(xmlWriter, "FileFormat", "string", parsed.Format.ToUpper() + " file"); AddBooleanElement(xmlWriter, "Folder", false); AddEncodeElement(xmlWriter, "Mp4HttpOptimize", "integer", parsed.OptimizeMP4 ? "1" : "0"); AddEncodeElement(xmlWriter, "Mp4LargeFile", "integer", parsed.LargeMP4 ? "1" : "0"); AddEncodeElement(xmlWriter, "Mp4iPodCompatible", "integer", parsed.IpodAtom ? "1" : "0"); AddEncodeElement(xmlWriter, "PictureAutoCrop", "integer", "1"); AddEncodeElement(xmlWriter, "PictureBottomCrop", "integer", parsed.CropBottom); // Filters AddEncodeElement(xmlWriter, "PictureDeblock", "integer", parsed.DeBlock.ToString()); switch (parsed.Decomb) { case "Off": AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "0"); AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty); break; case "Default": AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "1"); AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty); break; default: AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "2"); AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", parsed.Decomb); break; } AddEncodeElement(xmlWriter, "PictureDecombDeinterlace", "integer", parsed.Decomb != "Off" ? "0" : "1"); switch (parsed.DeInterlace) { case "Off": AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "0"); AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty); break; case "Fast": AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "1"); AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty); break; case "Slow": AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "2"); AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty); break; case "Slower": AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "3"); AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty); break; default: AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "4"); AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", parsed.DeInterlace); break; } switch (parsed.DeNoise) { case "Off": AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "0"); AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty); break; case "Weak": AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "1"); AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty); break; case "Medium": AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "2"); AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty); break; case "Strong": AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "3"); AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty); break; default: AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "4"); AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", parsed.DeNoise); break; } int detelecine; switch (parsed.DeTelecine) { case "Off": detelecine = 0; break; case "Default": detelecine = 2; break; default: detelecine = 1; break; } AddEncodeElement(xmlWriter, "PictureDetelecine", "integer", detelecine.ToString()); AddEncodeElement(xmlWriter, "PictureDetelecineCustom", "string", detelecine == 1 ? parsed.DeTelecine : string.Empty); // Picture Settings AddEncodeElement(xmlWriter, "PictureHeight", "integer", parsed.Height.ToString()); AddEncodeElement(xmlWriter, "PictureKeepRatio", "integer", parsed.KeepDisplayAsect ? "1" : "0"); AddEncodeElement(xmlWriter, "PictureLeftCrop", "integer", parsed.CropLeft); AddEncodeElement(xmlWriter, "PictureModulus", "integer", parsed.AnamorphicModulus.ToString()); AddEncodeElement(xmlWriter, "PicturePAR", "integer", parsed.AnamorphicMode.ToString()); AddEncodeElement(xmlWriter, "PictureRightCrop", "integer", parsed.CropRight); AddEncodeElement(xmlWriter, "PictureTopCrop", "integer", parsed.CropTop); AddEncodeElement(xmlWriter, "PictureWidth", "integer", parsed.Width.ToString()); // Preset Information AddEncodeElement(xmlWriter, "PresetBuildNumber", "string", Properties.Settings.Default.hb_build.ToString()); AddEncodeElement(xmlWriter, "PresetDescription", "string", "No Description"); AddEncodeElement(xmlWriter, "PresetName", "string", preset.Name); AddEncodeElement(xmlWriter, "Type", "integer", "1"); // 1 is user preset, 0 is built in // Preset Settings AddEncodeElement(xmlWriter, "UsesMaxPictureSettings", "integer", (parsed.MaxWidth != 0 || parsed.MaxHeight != 0) ? "1" : "0"); AddEncodeElement(xmlWriter, "UsesPictureFilters", "integer", "1"); AddEncodeElement(xmlWriter, "UsesPictureSettings", "integer", "2"); // Video Settings AddEncodeElement(xmlWriter, "VideoAvgBitrate", "string", parsed.AverageVideoBitrate); AddEncodeElement(xmlWriter, "VideoEncoder", "string", parsed.VideoEncoder); AddEncodeElement(xmlWriter, "VideoFramerate", "string", parsed.VideoFramerate); AddEncodeElement(xmlWriter, "VideFrameratePFR", "integer", parsed.Pfr ? "1" : "0"); AddEncodeElement(xmlWriter, "VideoGrayScale", "integer", parsed.Grayscale ? "1" : "0"); AddEncodeElement(xmlWriter, "VideoQualitySlider", "real", parsed.VideoQuality.ToString()); int videoQualityType = 0; if (!string.IsNullOrEmpty(parsed.VideoTargetSize)) videoQualityType = 0; else if (!string.IsNullOrEmpty(parsed.AverageVideoBitrate)) videoQualityType = 1; else if (parsed.VideoQuality != 0) videoQualityType = 2; AddEncodeElement(xmlWriter, "VideoQualityType", "integer", videoQualityType.ToString()); AddEncodeElement(xmlWriter, "VideoTargetSize", "string", parsed.VideoTargetSize); AddEncodeElement(xmlWriter, "VideoTurboTwoPass", "integer", parsed.TurboFirstPass ? "1" : "0"); AddEncodeElement(xmlWriter, "VideoTwoPass", "integer", parsed.TwoPass ? "1" : "0"); // x264 string AddEncodeElement(xmlWriter, "x264Option", "string", parsed.H264Query); }
/// <summary> /// Add a new preset to the system /// </summary> /// <param name="presetName"> /// String, The name of the new preset /// </param> /// <param name="query"> /// String, the CLI query for the new preset /// </param> /// <param name="pictureSettings"> /// Bool, store crop/picture sizes in the Presets /// </param> /// <param name="description"> /// The description. /// </param> /// <returns> /// The add. /// </returns> public bool Add(string presetName, string query, bool pictureSettings, string description) { if (this.CheckIfPresetExists(presetName) == false) { Preset newPreset = new Preset { Name = presetName, Query = query, CropSettings = pictureSettings, Version = Properties.Settings.Default.hb_version }; this.userPresets.Add(newPreset); this.UpdatePresetFiles(); this.LastPresetAdded = newPreset; return true; } return false; }
/// <summary> /// Reads the CLI's CLI output format and load's them into the preset List Preset /// </summary> public void UpdateBuiltInPresets() { // Create a new tempory file and execute the CLI to get the built in Presets. string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe"); string presetsPath = Path.Combine(Path.GetTempPath(), "temp_presets.dat"); string strCmdLine = String.Format(@"cmd /c """"{0}"" --preset-list >""{1}"" 2>&1""", handbrakeCLIPath, presetsPath); ProcessStartInfo hbGetPresets = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden }; Process hbproc = Process.Start(hbGetPresets); if (hbproc != null) { hbproc.WaitForExit(); hbproc.Dispose(); hbproc.Close(); } // Clear the current built in Presets and now parse the tempory Presets file. this.presets.Clear(); if (File.Exists(presetsPath)) { StreamReader presetInput = new StreamReader(presetsPath); string category = String.Empty; while (!presetInput.EndOfStream) { string line = presetInput.ReadLine(); if (line.Contains("<") && !line.Contains("<<")) // Found the beginning of a preset block category = line.Replace("<", string.Empty).Trim(); if (line.Contains("+")) // A Preset { Regex r = new Regex("(: )"); // Split on hyphens. string[] presetName = r.Split(line); bool pic = false; if (presetName[2].Contains("crop")) pic = true; Preset newPreset = new Preset { Category = category, Name = presetName[0].Replace("+", string.Empty).Trim(), Query = presetName[2], Version = Properties.Settings.Default.hb_version, CropSettings = pic, Description = string.Empty // Maybe one day we will populate this. }; this.presets.Add(newPreset); } } presetInput.Close(); presetInput.Dispose(); } // Finally, Create a new or update the current Presets.xml file this.UpdatePresetFiles(); }