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
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.Width = int.Parse(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":
\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
295 return queryParsed;
\r
299 /// Export a preset to a Plist file readable by the Mac and Linux GUI's
\r
301 /// <param name="path"></param>
\r
302 public void Export(string path)
\r
304 Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);
\r
307 Writer.WriteStartDocument();
\r
308 Writer.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",
\r
309 @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);
\r
311 Writer.WriteStartElement("plist");
\r
312 Writer.WriteStartElement("array");
\r
314 // Add New Preset Here. Can write multiple presets here if required in future.
\r
318 Writer.WriteEndElement();
\r
319 Writer.WriteEndElement();
\r
321 Writer.WriteEndDocument();
\r
328 /// Write a Plist file
\r
330 private void WritePreset()
\r
332 Writer.WriteStartElement("dict");
\r
333 AudioListArrayDict();
\r
334 AddEncodeSettings();
\r
336 Writer.WriteEndElement();
\r
340 /// Add all the encode settings to the preset
\r
342 private void AddEncodeSettings()
\r
344 AddEncodeElement("ChapterMarkers", "integer", string.Empty);
\r
345 AddEncodeElement("Default", "integer", string.Empty);
\r
346 AddEncodeElement("FileFormat", "String", string.Empty);
\r
347 AddBooleanElement("Folder", true);
\r
348 AddEncodeElement("Mp4HttpOptimize", "integer", string.Empty);
\r
349 AddEncodeElement("Mp4LargeFile", "integer", string.Empty);
\r
350 AddEncodeElement("Mp4iPodCompatible", "integer", string.Empty);
\r
351 AddEncodeElement("PictureAutoCrop", "integer", string.Empty);
\r
352 AddEncodeElement("PictureBottomCrop", "integer", string.Empty);
\r
353 AddEncodeElement("PictureDeblock", "integer", string.Empty);
\r
354 AddEncodeElement("PictureDecomb", "integer", string.Empty);
\r
355 AddEncodeElement("PictureDecombCustom", "string", string.Empty);
\r
356 AddEncodeElement("PictureDecombDeinterlace", "integer", string.Empty);
\r
357 AddEncodeElement("PictureDeinterlace", "integer", string.Empty);
\r
358 AddEncodeElement("PictureDeinterlaceCustom", "string", string.Empty);
\r
359 AddEncodeElement("PictureDenoise", "integer", string.Empty);
\r
360 AddEncodeElement("PictureDenoiseCustom", "string", string.Empty);
\r
361 AddEncodeElement("PictureDetelecine", "integer", string.Empty);
\r
362 AddEncodeElement("PictureDetelecineCustom", "string", string.Empty);
\r
363 AddEncodeElement("PictureHeight", "integer", string.Empty);
\r
364 AddEncodeElement("PictureKeepRatio", "integer", string.Empty);
\r
365 AddEncodeElement("PictureLeftCrop", "integer", string.Empty);
\r
366 AddEncodeElement("PicturePAR", "integer", string.Empty);
\r
367 AddEncodeElement("PictureRightCrop", "integer", string.Empty);
\r
368 AddEncodeElement("PictureTopCrop", "integer", string.Empty);
\r
369 AddEncodeElement("PictureWidth", "integer", string.Empty);
\r
370 AddEncodeElement("PresetBuildNumber", "string", string.Empty);
\r
371 AddEncodeElement("PresetDescription", "string", string.Empty);
\r
372 AddEncodeElement("PresetName", "string", string.Empty);
\r
373 AddEncodeElement("Type", "integer", string.Empty);
\r
374 AddEncodeElement("UsesMaxPictureSettings", "integer", string.Empty);
\r
375 AddEncodeElement("UsesPictureFilters", "integer", string.Empty);
\r
376 AddEncodeElement("UsesPictureSettings", "integer", string.Empty);
\r
377 AddEncodeElement("VideoAvgBitrate", "string", string.Empty);
\r
378 AddEncodeElement("VideoEncoder", "string", string.Empty);
\r
379 AddEncodeElement("VideoFramerate", "string", string.Empty);
\r
380 AddEncodeElement("VideoGrayScale", "integer", string.Empty);
\r
381 AddEncodeElement("VideoQualitySlider", "real", string.Empty);
\r
382 AddEncodeElement("VideoQualityType", "integer", string.Empty);
\r
383 AddEncodeElement("VideoTargetSize", "string", string.Empty);
\r
384 AddEncodeElement("VideoTurboTwoPass", "integer", string.Empty);
\r
385 AddEncodeElement("VideoTwoPass", "integer", string.Empty);
\r
386 AddEncodeElement("x264Option", "string", string.Empty);
\r
390 /// Add Preset setting + value
\r
392 /// <param name="keyName"></param>
\r
393 /// <param name="value"></param>
\r
394 private void AddBooleanElement(string keyName, bool value)
\r
396 Writer.WriteStartElement("key");
\r
397 Writer.WriteString(keyName);
\r
398 Writer.WriteEndElement();
\r
401 Writer.WriteStartElement("true");
\r
402 Writer.WriteEndElement();
\r
406 Writer.WriteStartElement("false");
\r
407 Writer.WriteEndElement();
\r
412 /// Add Preset setting + value
\r
414 /// <param name="keyName"></param>
\r
415 /// <param name="type"></param>
\r
416 /// <param name="value"></param>
\r
417 private void AddEncodeElement(string keyName, string type, string value)
\r
419 Writer.WriteElementString("key", keyName);
\r
420 Writer.WriteElementString(type, value);
\r
424 /// Add List of audio tracks
\r
426 private void AudioListArrayDict()
\r
428 Writer.WriteStartElement("key");
\r
429 Writer.WriteString("AudioList");
\r
430 Writer.WriteEndElement();
\r
432 Writer.WriteStartElement("array");
\r
435 Writer.WriteEndElement();
\r
439 /// Add List of audio tracks
\r
441 private void AddAudioItem()
\r
444 string encoder = "AC3 Passthru";
\r
445 string mixdown = "AC3 Passthru";
\r
446 string sample = "Auto";
\r
449 string desc = "English (AC3) (5.1 ch)";
\r
451 Writer.WriteStartElement("dict");
\r
453 Writer.WriteElementString("key", "AudioBitrate");
\r
454 Writer.WriteElementString("string", bitrate.ToString());
\r
456 Writer.WriteElementString("key", "AudioEncoder");
\r
457 Writer.WriteElementString("string", encoder);
\r
459 Writer.WriteElementString("key", "AudioMixdown");
\r
460 Writer.WriteElementString("string", mixdown);
\r
462 Writer.WriteElementString("key", "AudioSamplerate");
\r
463 Writer.WriteElementString("string", sample);
\r
465 Writer.WriteElementString("key", "AudioTrack");
\r
466 Writer.WriteElementString("integer", track.ToString());
\r
468 Writer.WriteElementString("key", "AudioTrackDRCSlider");
\r
469 Writer.WriteElementString("real", drc.ToString());
\r
471 Writer.WriteElementString("key", "AudioTrackDescription");
\r
472 Writer.WriteElementString("string", desc);
\r
474 Writer.WriteEndElement();
\r