1 /* PlistPresetHandler.cs $
\r
2 This file is part of the HandBrake source code.
\r
3 Homepage: <http://handbrake.fr/>.
\r
4 It may be used under the terms of the GNU General Public License. */
\r
6 namespace Handbrake.Presets
\r
9 using System.Collections;
\r
12 using System.Windows.Forms;
\r
17 public class PlistPresetHandler
\r
19 /* WARNING This file is not complete!!!!!!
\r
22 * 1. Hookup all the widgets in the GUI so it exports real values.
\r
23 * 2. Check for any missing key/value pairs
\r
24 * 3. Test with MacGui / Cleanup code / Retest
\r
27 private XmlTextWriter Writer;
\r
30 /// Import a Plist preset generated by the Mac or Linux GUI
\r
32 /// <param name="filename"></param>
\r
33 /// <returns></returns>
\r
34 public static QueryParser Import(string filename)
\r
36 XmlNode root = null;
\r
39 if (!File.Exists(filename))
\r
42 StreamReader sr = File.OpenText(filename);
\r
43 string fromfile = string.Empty;
\r
45 while ((fileChar = sr.Read()) != -1)
\r
46 fromfile += Convert.ToChar(fileChar);
\r
48 XmlDocument doc = new XmlDocument();
\r
49 doc.LoadXml(fromfile);
\r
52 if (!root.HasChildNodes)
\r
55 "The Preset file you selected appears to be invlaid or from an older version of HandBrake",
\r
57 MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
64 "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
66 MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
69 // We'll query a query parser object and use it's public var structures to store all the data.
\r
70 // This will allow the preset loader logic to be used instead of writing custom logic just for this file.
\r
71 QueryParser queryParsed = new QueryParser();
\r
72 string QualityMode = string.Empty;
\r
73 /***** Get the Audio Tracks *****/
\r
74 XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];
\r
75 ArrayList AudioInfo = new ArrayList();
\r
76 for (int i = 0; i < audioListDict.ChildNodes.Count; i++)
\r
78 XmlNode audioChannel = audioListDict.ChildNodes[i];
\r
79 AudioTrack track = new AudioTrack();
\r
81 for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)
\r
83 // Audio Channel Information is here.
\r
84 string key = audioChannel.ChildNodes[subi].InnerText;
\r
85 string value = audioChannel.ChildNodes[subi + 1].InnerText;
\r
88 case "AudioBitrate":
\r
89 track.Bitrate = value;
\r
91 case "AudioEncoder":
\r
92 track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");
\r
94 case "AudioMixdown":
\r
95 track.MixDown = value;
\r
97 case "AudioSamplerate":
\r
98 track.SampleRate = value;
\r
101 track.Track = value;
\r
103 case "AudioTrackDRCSlider":
\r
108 AudioInfo.Add(track);
\r
110 queryParsed.AudioInformation = AudioInfo;
\r
112 /***** Get the rest of the settings. *****/
\r
113 XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;
\r
114 for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)
\r
115 // Start from 2 to avoid the audio settings which we don't need.
\r
117 string key = presetSettings.ChildNodes[i].InnerText;
\r
118 string value = presetSettings.ChildNodes[i + 1].InnerText;
\r
124 queryParsed.Format = value;
\r
126 case "Mp4HttpOptimize":
\r
127 queryParsed.OptimizeMP4 = value == "1";
\r
129 case "Mp4LargeFile":
\r
130 queryParsed.LargeMP4 = value == "1";
\r
132 case "Mp4iPodCompatible":
\r
133 queryParsed.IpodAtom = value == "1";
\r
136 // Picture Settings
\r
137 case "PictureAutoCrop":
\r
139 case "PictureTopCrop":
\r
140 queryParsed.CropTop = value;
\r
142 case "PictureBottomCrop":
\r
143 queryParsed.CropBottom = value;
\r
145 case "PictureLeftCrop":
\r
146 queryParsed.CropLeft = value;
\r
148 case "PictureRightCrop":
\r
149 queryParsed.CropRight = value;
\r
151 case "PictureHeight":
\r
152 queryParsed.Height = int.Parse(value);
\r
154 case "PictureWidth":
\r
155 queryParsed.Width = int.Parse(value);
\r
157 case "PictureKeepRatio":
\r
158 queryParsed.KeepDisplayAsect = value == "1";
\r
161 queryParsed.AnamorphicMode = int.Parse(value);
\r
166 case "PictureDeblock":
\r
167 queryParsed.DeBlock = int.Parse(value);
\r
169 case "PictureDecomb":
\r
170 queryParsed.Decomb = "Off";
\r
171 if (value == "2") queryParsed.Decomb = "Default";
\r
173 case "PictureDecombCustom":
\r
174 if (value != string.Empty)
\r
175 queryParsed.Decomb = value;
\r
177 case "PictureDecombDeinterlace":
\r
180 case "PictureDeinterlace":
\r
184 queryParsed.DeInterlace = "Off";
\r
187 queryParsed.DeInterlace = "Fast";
\r
190 queryParsed.DeInterlace = "Slow";
\r
193 queryParsed.DeInterlace = "Slowest";
\r
197 case "PictureDeinterlaceCustom":
\r
198 if (value != string.Empty)
\r
199 queryParsed.DeInterlace = value;
\r
201 case "PictureDenoise":
\r
205 queryParsed.DeNoise = "Off";
\r
208 queryParsed.DeNoise = "Weak";
\r
211 queryParsed.DeNoise = "Medium";
\r
214 queryParsed.DeNoise = "Strong";
\r
219 case "PictureDenoiseCustom":
\r
220 if (value != string.Empty)
\r
221 queryParsed.DeNoise = value;
\r
223 case "PictureDetelecine":
\r
224 queryParsed.DeTelecine = "Off";
\r
225 if (value == "1") queryParsed.DeTelecine = "Default";
\r
227 case "PictureDetelecineCustom":
\r
228 if (value != string.Empty)
\r
229 queryParsed.DeTelecine = value;
\r
233 case "VideoAvgBitrate":
\r
234 queryParsed.AverageVideoBitrate = value;
\r
236 case "VideoEncoder":
\r
237 queryParsed.VideoEncoder = value;
\r
239 case "VideoFramerate":
\r
240 queryParsed.VideoFramerate = value;
\r
242 case "VideoGrayScale":
\r
243 queryParsed.Grayscale = value == "1";
\r
245 case "VideoQualitySlider":
\r
246 queryParsed.VideoQuality = float.Parse(value);
\r
248 case "VideoQualityType": // The Type of Quality Mode used
\r
249 QualityMode = value;
\r
251 case "VideoTargetSize":
\r
252 queryParsed.VideoTargetSize = value;
\r
254 case "VideoTurboTwoPass":
\r
255 queryParsed.TurboFirstPass = value == "1";
\r
257 case "VideoTwoPass":
\r
258 queryParsed.TwoPass = value == "1";
\r
261 // Chapter Markers Tab
\r
262 case "ChapterMarkers":
\r
263 queryParsed.ChapterMarkers = value == "1";
\r
266 // Advanced x264 tab
\r
268 queryParsed.H264Query = value;
\r
271 // Preset Information
\r
272 case "PresetBuildNumber":
\r
273 queryParsed.PresetBuildNumber = int.Parse(value);
\r
275 case "PresetDescription":
\r
276 queryParsed.PresetDescription = value;
\r
279 queryParsed.PresetName = value;
\r
282 queryParsed.Type = value;
\r
284 case "UsesMaxPictureSettings":
\r
285 queryParsed.UsesMaxPictureSettings = value == "1";
\r
287 case "UsesPictureFilters":
\r
288 queryParsed.UsesPictureFilters = value == "1";
\r
290 case "UsesPictureSettings":
\r
291 queryParsed.UsesPictureSettings = value == "1";
\r
296 // Kill any Quality values we don't need.
\r
297 switch (QualityMode)
\r
299 case "0": // FileSize
\r
300 queryParsed.VideoQuality = -1;
\r
301 queryParsed.AverageVideoBitrate = null;
\r
303 case "1": // Avg Bitrate
\r
304 queryParsed.VideoQuality = -1;
\r
305 queryParsed.VideoTargetSize = null;
\r
308 queryParsed.AverageVideoBitrate = null;
\r
309 queryParsed.VideoTargetSize = null;
\r
313 return queryParsed;
\r
317 /// Export a preset to a Plist file readable by the Mac and Linux GUI's
\r
319 /// <param name="path"></param>
\r
320 public void Export(string path)
\r
322 Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);
\r
325 Writer.WriteStartDocument();
\r
326 Writer.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",
\r
327 @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);
\r
329 Writer.WriteStartElement("plist");
\r
330 Writer.WriteStartElement("array");
\r
332 // Add New Preset Here. Can write multiple presets here if required in future.
\r
336 Writer.WriteEndElement();
\r
337 Writer.WriteEndElement();
\r
339 Writer.WriteEndDocument();
\r
346 /// Write a Plist file
\r
348 private void WritePreset()
\r
350 Writer.WriteStartElement("dict");
\r
351 AudioListArrayDict();
\r
352 AddEncodeSettings();
\r
354 Writer.WriteEndElement();
\r
358 /// Add all the encode settings to the preset
\r
360 private void AddEncodeSettings()
\r
362 AddEncodeElement("ChapterMarkers", "integer", string.Empty);
\r
363 AddEncodeElement("Default", "integer", string.Empty);
\r
364 AddEncodeElement("FileFormat", "String", string.Empty);
\r
365 AddBooleanElement("Folder", true);
\r
366 AddEncodeElement("Mp4HttpOptimize", "integer", string.Empty);
\r
367 AddEncodeElement("Mp4LargeFile", "integer", string.Empty);
\r
368 AddEncodeElement("Mp4iPodCompatible", "integer", string.Empty);
\r
369 AddEncodeElement("PictureAutoCrop", "integer", string.Empty);
\r
370 AddEncodeElement("PictureBottomCrop", "integer", string.Empty);
\r
371 AddEncodeElement("PictureDeblock", "integer", string.Empty);
\r
372 AddEncodeElement("PictureDecomb", "integer", string.Empty);
\r
373 AddEncodeElement("PictureDecombCustom", "string", string.Empty);
\r
374 AddEncodeElement("PictureDecombDeinterlace", "integer", string.Empty);
\r
375 AddEncodeElement("PictureDeinterlace", "integer", string.Empty);
\r
376 AddEncodeElement("PictureDeinterlaceCustom", "string", string.Empty);
\r
377 AddEncodeElement("PictureDenoise", "integer", string.Empty);
\r
378 AddEncodeElement("PictureDenoiseCustom", "string", string.Empty);
\r
379 AddEncodeElement("PictureDetelecine", "integer", string.Empty);
\r
380 AddEncodeElement("PictureDetelecineCustom", "string", string.Empty);
\r
381 AddEncodeElement("PictureHeight", "integer", string.Empty);
\r
382 AddEncodeElement("PictureKeepRatio", "integer", string.Empty);
\r
383 AddEncodeElement("PictureLeftCrop", "integer", string.Empty);
\r
384 AddEncodeElement("PicturePAR", "integer", string.Empty);
\r
385 AddEncodeElement("PictureRightCrop", "integer", string.Empty);
\r
386 AddEncodeElement("PictureTopCrop", "integer", string.Empty);
\r
387 AddEncodeElement("PictureWidth", "integer", string.Empty);
\r
388 AddEncodeElement("PresetBuildNumber", "string", string.Empty);
\r
389 AddEncodeElement("PresetDescription", "string", string.Empty);
\r
390 AddEncodeElement("PresetName", "string", string.Empty);
\r
391 AddEncodeElement("Type", "integer", string.Empty);
\r
392 AddEncodeElement("UsesMaxPictureSettings", "integer", string.Empty);
\r
393 AddEncodeElement("UsesPictureFilters", "integer", string.Empty);
\r
394 AddEncodeElement("UsesPictureSettings", "integer", string.Empty);
\r
395 AddEncodeElement("VideoAvgBitrate", "string", string.Empty);
\r
396 AddEncodeElement("VideoEncoder", "string", string.Empty);
\r
397 AddEncodeElement("VideoFramerate", "string", string.Empty);
\r
398 AddEncodeElement("VideoGrayScale", "integer", string.Empty);
\r
399 AddEncodeElement("VideoQualitySlider", "real", string.Empty);
\r
400 AddEncodeElement("VideoQualityType", "integer", string.Empty);
\r
401 AddEncodeElement("VideoTargetSize", "string", string.Empty);
\r
402 AddEncodeElement("VideoTurboTwoPass", "integer", string.Empty);
\r
403 AddEncodeElement("VideoTwoPass", "integer", string.Empty);
\r
404 AddEncodeElement("x264Option", "string", string.Empty);
\r
408 /// Add Preset setting + value
\r
410 /// <param name="keyName"></param>
\r
411 /// <param name="value"></param>
\r
412 private void AddBooleanElement(string keyName, bool value)
\r
414 Writer.WriteStartElement("key");
\r
415 Writer.WriteString(keyName);
\r
416 Writer.WriteEndElement();
\r
419 Writer.WriteStartElement("true");
\r
420 Writer.WriteEndElement();
\r
424 Writer.WriteStartElement("false");
\r
425 Writer.WriteEndElement();
\r
430 /// Add Preset setting + value
\r
432 /// <param name="keyName"></param>
\r
433 /// <param name="type"></param>
\r
434 /// <param name="value"></param>
\r
435 private void AddEncodeElement(string keyName, string type, string value)
\r
437 Writer.WriteElementString("key", keyName);
\r
438 Writer.WriteElementString(type, value);
\r
442 /// Add List of audio tracks
\r
444 private void AudioListArrayDict()
\r
446 Writer.WriteStartElement("key");
\r
447 Writer.WriteString("AudioList");
\r
448 Writer.WriteEndElement();
\r
450 Writer.WriteStartElement("array");
\r
453 Writer.WriteEndElement();
\r
457 /// Add List of audio tracks
\r
459 private void AddAudioItem()
\r
462 string encoder = "AC3 Passthru";
\r
463 string mixdown = "AC3 Passthru";
\r
464 string sample = "Auto";
\r
467 string desc = "English (AC3) (5.1 ch)";
\r
469 Writer.WriteStartElement("dict");
\r
471 Writer.WriteElementString("key", "AudioBitrate");
\r
472 Writer.WriteElementString("string", bitrate.ToString());
\r
474 Writer.WriteElementString("key", "AudioEncoder");
\r
475 Writer.WriteElementString("string", encoder);
\r
477 Writer.WriteElementString("key", "AudioMixdown");
\r
478 Writer.WriteElementString("string", mixdown);
\r
480 Writer.WriteElementString("key", "AudioSamplerate");
\r
481 Writer.WriteElementString("string", sample);
\r
483 Writer.WriteElementString("key", "AudioTrack");
\r
484 Writer.WriteElementString("integer", track.ToString());
\r
486 Writer.WriteElementString("key", "AudioTrackDRCSlider");
\r
487 Writer.WriteElementString("real", drc.ToString());
\r
489 Writer.WriteElementString("key", "AudioTrackDescription");
\r
490 Writer.WriteElementString("string", desc);
\r
492 Writer.WriteEndElement();
\r