1 /* PlistPresetHandler.cs $
\r
3 This file is part of the HandBrake source code.
\r
4 Homepage: <http://handbrake.fr/>.
\r
5 It may be used under the terms of the GNU General Public License. */
\r
7 namespace Handbrake.Presets
\r
10 using System.Collections;
\r
13 using System.Windows.Forms;
\r
18 public class PlistPresetHandler
\r
20 /* WARNING This file is not complete!!!!!!
\r
23 * 1. Hookup all the widgets in the GUI so it exports real values.
\r
24 * 2. Check for any missing key/value pairs
\r
25 * 3. Test with MacGui / Cleanup code / Retest
\r
28 private XmlTextWriter Writer;
\r
31 /// Import a Plist preset generated by the Mac or Linux GUI
\r
33 /// <param name="filename"></param>
\r
34 /// <returns></returns>
\r
35 public static QueryParser Import(string filename)
\r
37 XmlNode root = null;
\r
40 if (!File.Exists(filename))
\r
43 StreamReader sr = File.OpenText(filename);
\r
44 string fromfile = string.Empty;
\r
46 while ((fileChar = sr.Read()) != -1)
\r
47 fromfile += Convert.ToChar(fileChar);
\r
49 XmlDocument doc = new XmlDocument();
\r
50 doc.LoadXml(fromfile);
\r
53 if (!root.HasChildNodes)
\r
56 "The Preset file you selected appears to be invlaid or from an older version of HandBrake",
\r
58 MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
65 "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
67 MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
70 // We'll query a query parser object and use it's public var structures to store all the data.
\r
71 // This will allow the preset loader logic to be used instead of writing custom logic just for this file.
\r
72 QueryParser queryParsed = new QueryParser();
\r
73 string QualityMode = string.Empty;
\r
74 /***** Get the Audio Tracks *****/
\r
75 XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];
\r
76 ArrayList AudioInfo = new ArrayList();
\r
77 for (int i = 0; i < audioListDict.ChildNodes.Count; i++)
\r
79 XmlNode audioChannel = audioListDict.ChildNodes[i];
\r
80 AudioTrack track = new AudioTrack();
\r
82 for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)
\r
84 // Audio Channel Information is here.
\r
85 string key = audioChannel.ChildNodes[subi].InnerText;
\r
86 string value = audioChannel.ChildNodes[subi + 1].InnerText;
\r
89 case "AudioBitrate":
\r
90 track.Bitrate = value;
\r
92 case "AudioEncoder":
\r
93 track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");
\r
95 case "AudioMixdown":
\r
96 track.MixDown = value;
\r
98 case "AudioSamplerate":
\r
99 track.SampleRate = value;
\r
102 track.Track = value;
\r
104 case "AudioTrackDRCSlider":
\r
109 AudioInfo.Add(track);
\r
111 queryParsed.AudioInformation = AudioInfo;
\r
113 /***** Get the rest of the settings. *****/
\r
114 XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;
\r
115 for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)
\r
116 // Start from 2 to avoid the audio settings which we don't need.
\r
118 string key = presetSettings.ChildNodes[i].InnerText;
\r
119 string value = presetSettings.ChildNodes[i + 1].InnerText;
\r
125 queryParsed.Format = value;
\r
127 case "Mp4HttpOptimize":
\r
128 queryParsed.OptimizeMP4 = value == "1";
\r
130 case "Mp4LargeFile":
\r
131 queryParsed.LargeMP4 = value == "1";
\r
133 case "Mp4iPodCompatible":
\r
134 queryParsed.IpodAtom = value == "1";
\r
137 // Picture Settings
\r
138 case "PictureAutoCrop":
\r
140 case "PictureTopCrop":
\r
141 queryParsed.CropTop = value;
\r
143 case "PictureBottomCrop":
\r
144 queryParsed.CropBottom = value;
\r
146 case "PictureLeftCrop":
\r
147 queryParsed.CropLeft = value;
\r
149 case "PictureRightCrop":
\r
150 queryParsed.CropRight = value;
\r
152 case "PictureHeight":
\r
153 queryParsed.Height = int.Parse(value);
\r
155 case "PictureWidth":
\r
156 queryParsed.Width = int.Parse(value);
\r
158 case "PictureKeepRatio":
\r
159 queryParsed.KeepDisplayAsect = value == "1";
\r
162 queryParsed.AnamorphicMode = int.Parse(value);
\r
167 case "PictureDeblock":
\r
168 queryParsed.DeBlock = int.Parse(value);
\r
170 case "PictureDecomb":
\r
171 queryParsed.Decomb = "Off";
\r
172 if (value == "2") queryParsed.Decomb = "Default";
\r
174 case "PictureDecombCustom":
\r
175 if (value != string.Empty)
\r
176 queryParsed.Decomb = value;
\r
178 case "PictureDecombDeinterlace":
\r
181 case "PictureDeinterlace":
\r
185 queryParsed.DeInterlace = "Off";
\r
188 queryParsed.DeInterlace = "Fast";
\r
191 queryParsed.DeInterlace = "Slow";
\r
194 queryParsed.DeInterlace = "Slowest";
\r
198 case "PictureDeinterlaceCustom":
\r
199 if (value != string.Empty)
\r
200 queryParsed.DeInterlace = value;
\r
202 case "PictureDenoise":
\r
206 queryParsed.DeNoise = "Off";
\r
209 queryParsed.DeNoise = "Weak";
\r
212 queryParsed.DeNoise = "Medium";
\r
215 queryParsed.DeNoise = "Strong";
\r
220 case "PictureDenoiseCustom":
\r
221 if (value != string.Empty)
\r
222 queryParsed.DeNoise = value;
\r
224 case "PictureDetelecine":
\r
225 queryParsed.DeTelecine = "Off";
\r
226 if (value == "1") queryParsed.DeTelecine = "Default";
\r
228 case "PictureDetelecineCustom":
\r
229 if (value != string.Empty)
\r
230 queryParsed.DeTelecine = value;
\r
234 case "VideoAvgBitrate":
\r
235 queryParsed.AverageVideoBitrate = value;
\r
237 case "VideoEncoder":
\r
238 queryParsed.VideoEncoder = value;
\r
240 case "VideoFramerate":
\r
241 queryParsed.VideoFramerate = value;
\r
243 case "VideoGrayScale":
\r
244 queryParsed.Grayscale = value == "1";
\r
246 case "VideoQualitySlider":
\r
247 queryParsed.VideoQuality = float.Parse(value);
\r
249 case "VideoQualityType": // The Type of Quality Mode used
\r
250 QualityMode = value;
\r
252 case "VideoTargetSize":
\r
253 queryParsed.VideoTargetSize = value;
\r
255 case "VideoTurboTwoPass":
\r
256 queryParsed.TurboFirstPass = value == "1";
\r
258 case "VideoTwoPass":
\r
259 queryParsed.TwoPass = value == "1";
\r
262 // Chapter Markers Tab
\r
263 case "ChapterMarkers":
\r
264 queryParsed.ChapterMarkers = value == "1";
\r
267 // Advanced x264 tab
\r
269 queryParsed.H264Query = value;
\r
272 // Preset Information
\r
273 case "PresetBuildNumber":
\r
274 queryParsed.PresetBuildNumber = int.Parse(value);
\r
276 case "PresetDescription":
\r
277 queryParsed.PresetDescription = value;
\r
280 queryParsed.PresetName = value;
\r
283 queryParsed.Type = value;
\r
285 case "UsesMaxPictureSettings":
\r
286 queryParsed.UsesMaxPictureSettings = value == "1";
\r
288 case "UsesPictureFilters":
\r
289 queryParsed.UsesPictureFilters = value == "1";
\r
291 case "UsesPictureSettings":
\r
292 queryParsed.UsesPictureSettings = value == "1";
\r
297 // Kill any Quality values we don't need.
\r
298 switch (QualityMode)
\r
300 case "0": // FileSize
\r
301 queryParsed.VideoQuality = -1;
\r
302 queryParsed.AverageVideoBitrate = null;
\r
304 case "1": // Avg Bitrate
\r
305 queryParsed.VideoQuality = -1;
\r
306 queryParsed.VideoTargetSize = null;
\r
309 queryParsed.AverageVideoBitrate = null;
\r
310 queryParsed.VideoTargetSize = null;
\r
314 return queryParsed;
\r
318 /// Export a preset to a Plist file readable by the Mac and Linux GUI's
\r
320 /// <param name="path"></param>
\r
321 public void Export(string path)
\r
323 Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);
\r
326 Writer.WriteStartDocument();
\r
327 Writer.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",
\r
328 @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);
\r
330 Writer.WriteStartElement("plist");
\r
331 Writer.WriteStartElement("array");
\r
333 // Add New Preset Here. Can write multiple presets here if required in future.
\r
337 Writer.WriteEndElement();
\r
338 Writer.WriteEndElement();
\r
340 Writer.WriteEndDocument();
\r
347 /// Write a Plist file
\r
349 private void WritePreset()
\r
351 Writer.WriteStartElement("dict");
\r
352 AudioListArrayDict();
\r
353 AddEncodeSettings();
\r
355 Writer.WriteEndElement();
\r
359 /// Add all the encode settings to the preset
\r
361 private void AddEncodeSettings()
\r
363 AddEncodeElement("ChapterMarkers", "integer", string.Empty);
\r
364 AddEncodeElement("Default", "integer", string.Empty);
\r
365 AddEncodeElement("FileFormat", "String", string.Empty);
\r
366 AddBooleanElement("Folder", true);
\r
367 AddEncodeElement("Mp4HttpOptimize", "integer", string.Empty);
\r
368 AddEncodeElement("Mp4LargeFile", "integer", string.Empty);
\r
369 AddEncodeElement("Mp4iPodCompatible", "integer", string.Empty);
\r
370 AddEncodeElement("PictureAutoCrop", "integer", string.Empty);
\r
371 AddEncodeElement("PictureBottomCrop", "integer", string.Empty);
\r
372 AddEncodeElement("PictureDeblock", "integer", string.Empty);
\r
373 AddEncodeElement("PictureDecomb", "integer", string.Empty);
\r
374 AddEncodeElement("PictureDecombCustom", "string", string.Empty);
\r
375 AddEncodeElement("PictureDecombDeinterlace", "integer", string.Empty);
\r
376 AddEncodeElement("PictureDeinterlace", "integer", string.Empty);
\r
377 AddEncodeElement("PictureDeinterlaceCustom", "string", string.Empty);
\r
378 AddEncodeElement("PictureDenoise", "integer", string.Empty);
\r
379 AddEncodeElement("PictureDenoiseCustom", "string", string.Empty);
\r
380 AddEncodeElement("PictureDetelecine", "integer", string.Empty);
\r
381 AddEncodeElement("PictureDetelecineCustom", "string", string.Empty);
\r
382 AddEncodeElement("PictureHeight", "integer", string.Empty);
\r
383 AddEncodeElement("PictureKeepRatio", "integer", string.Empty);
\r
384 AddEncodeElement("PictureLeftCrop", "integer", string.Empty);
\r
385 AddEncodeElement("PicturePAR", "integer", string.Empty);
\r
386 AddEncodeElement("PictureRightCrop", "integer", string.Empty);
\r
387 AddEncodeElement("PictureTopCrop", "integer", string.Empty);
\r
388 AddEncodeElement("PictureWidth", "integer", string.Empty);
\r
389 AddEncodeElement("PresetBuildNumber", "string", string.Empty);
\r
390 AddEncodeElement("PresetDescription", "string", string.Empty);
\r
391 AddEncodeElement("PresetName", "string", string.Empty);
\r
392 AddEncodeElement("Type", "integer", string.Empty);
\r
393 AddEncodeElement("UsesMaxPictureSettings", "integer", string.Empty);
\r
394 AddEncodeElement("UsesPictureFilters", "integer", string.Empty);
\r
395 AddEncodeElement("UsesPictureSettings", "integer", string.Empty);
\r
396 AddEncodeElement("VideoAvgBitrate", "string", string.Empty);
\r
397 AddEncodeElement("VideoEncoder", "string", string.Empty);
\r
398 AddEncodeElement("VideoFramerate", "string", string.Empty);
\r
399 AddEncodeElement("VideoGrayScale", "integer", string.Empty);
\r
400 AddEncodeElement("VideoQualitySlider", "real", string.Empty);
\r
401 AddEncodeElement("VideoQualityType", "integer", string.Empty);
\r
402 AddEncodeElement("VideoTargetSize", "string", string.Empty);
\r
403 AddEncodeElement("VideoTurboTwoPass", "integer", string.Empty);
\r
404 AddEncodeElement("VideoTwoPass", "integer", string.Empty);
\r
405 AddEncodeElement("x264Option", "string", string.Empty);
\r
409 /// Add Preset setting + value
\r
411 /// <param name="keyName"></param>
\r
412 /// <param name="value"></param>
\r
413 private void AddBooleanElement(string keyName, bool value)
\r
415 Writer.WriteStartElement("key");
\r
416 Writer.WriteString(keyName);
\r
417 Writer.WriteEndElement();
\r
420 Writer.WriteStartElement("true");
\r
421 Writer.WriteEndElement();
\r
425 Writer.WriteStartElement("false");
\r
426 Writer.WriteEndElement();
\r
431 /// Add Preset setting + value
\r
433 /// <param name="keyName"></param>
\r
434 /// <param name="type"></param>
\r
435 /// <param name="value"></param>
\r
436 private void AddEncodeElement(string keyName, string type, string value)
\r
438 Writer.WriteElementString("key", keyName);
\r
439 Writer.WriteElementString(type, value);
\r
443 /// Add List of audio tracks
\r
445 private void AudioListArrayDict()
\r
447 Writer.WriteStartElement("key");
\r
448 Writer.WriteString("AudioList");
\r
449 Writer.WriteEndElement();
\r
451 Writer.WriteStartElement("array");
\r
454 Writer.WriteEndElement();
\r
458 /// Add List of audio tracks
\r
460 private void AddAudioItem()
\r
463 string encoder = "AC3 Passthru";
\r
464 string mixdown = "AC3 Passthru";
\r
465 string sample = "Auto";
\r
468 string desc = "English (AC3) (5.1 ch)";
\r
470 Writer.WriteStartElement("dict");
\r
472 Writer.WriteElementString("key", "AudioBitrate");
\r
473 Writer.WriteElementString("string", bitrate.ToString());
\r
475 Writer.WriteElementString("key", "AudioEncoder");
\r
476 Writer.WriteElementString("string", encoder);
\r
478 Writer.WriteElementString("key", "AudioMixdown");
\r
479 Writer.WriteElementString("string", mixdown);
\r
481 Writer.WriteElementString("key", "AudioSamplerate");
\r
482 Writer.WriteElementString("string", sample);
\r
484 Writer.WriteElementString("key", "AudioTrack");
\r
485 Writer.WriteElementString("integer", track.ToString());
\r
487 Writer.WriteElementString("key", "AudioTrackDRCSlider");
\r
488 Writer.WriteElementString("real", drc.ToString());
\r
490 Writer.WriteElementString("key", "AudioTrackDescription");
\r
491 Writer.WriteElementString("string", desc);
\r
493 Writer.WriteEndElement();
\r