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
11 using System.Windows.Forms;
\r
12 using System.Collections;
\r
13 using Handbrake.Functions;
\r
14 using Handbrake.Model;
\r
16 namespace Handbrake.Presets
\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", "Error",
\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.", "Error",
\r
65 MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
68 // We'll query a query parser object and use it's public var structures to store all the data.
\r
69 // This will allow the preset loader logic to be used instead of writing custom logic just for this file.
\r
70 QueryParser queryParsed = new QueryParser();
\r
72 /***** Get the Audio Tracks *****/
\r
73 XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];
\r
74 ArrayList AudioInfo = new ArrayList();
\r
75 for (int i = 0; i < audioListDict.ChildNodes.Count; i++)
\r
77 XmlNode audioChannel = audioListDict.ChildNodes[i];
\r
78 AudioTrack track = new AudioTrack();
\r
80 for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)
\r
82 // Audio Channel Information is here.
\r
83 string key = audioChannel.ChildNodes[subi].InnerText;
\r
84 string value = audioChannel.ChildNodes[subi + 1].InnerText;
\r
87 case "AudioBitrate":
\r
88 track.Bitrate = value;
\r
90 case "AudioEncoder":
\r
91 track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");
\r
93 case "AudioMixdown":
\r
94 track.MixDown = value;
\r
96 case "AudioSamplerate":
\r
97 track.SampleRate = value;
\r
100 track.Track = value;
\r
102 case "AudioTrackDRCSlider":
\r
107 AudioInfo.Add(track);
\r
109 queryParsed.AudioInformation = AudioInfo;
\r
111 /***** Get the rest of the settings. *****/
\r
112 XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;
\r
113 for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2) // Start from 2 to avoid the audio settings which we don't need.
\r
115 string key = presetSettings.ChildNodes[i].InnerText;
\r
116 string value = presetSettings.ChildNodes[i + 1].InnerText;
\r
122 queryParsed.Format = value;
\r
124 case "Mp4HttpOptimize":
\r
125 queryParsed.OptimizeMP4 = value == "1";
\r
127 case "Mp4LargeFile":
\r
128 queryParsed.LargeMP4 = value == "1";
\r
130 case "Mp4iPodCompatible":
\r
131 queryParsed.IpodAtom = value == "1";
\r
134 // Picture Settings
\r
135 case "PictureAutoCrop":
\r
137 case "PictureTopCrop":
\r
138 queryParsed.CropTop = value;
\r
140 case "PictureBottomCrop":
\r
141 queryParsed.CropBottom = value;
\r
143 case "PictureLeftCrop":
\r
144 queryParsed.CropLeft = value;
\r
146 case "PictureRightCrop":
\r
147 queryParsed.CropRight = value;
\r
149 case "PictureHeight":
\r
150 queryParsed.Height = int.Parse(value);
\r
152 case "PictureWidth":
\r
153 queryParsed.Width = int.Parse(value);
\r
155 case "PictureKeepRatio":
\r
156 queryParsed.KeepDisplayAsect = value == "1";
\r
159 queryParsed.AnamorphicMode = int.Parse(value);
\r
164 case "PictureDeblock":
\r
165 queryParsed.DeBlock = int.Parse(value);
\r
167 case "PictureDecomb":
\r
168 queryParsed.Decomb = "Off";
\r
169 if (value == "2") queryParsed.Decomb = "Default";
\r
171 case "PictureDecombCustom":
\r
173 queryParsed.Decomb = value;
\r
175 case "PictureDecombDeinterlace":
\r
178 case "PictureDeinterlace":
\r
182 queryParsed.DeInterlace = "Off";
\r
185 queryParsed.DeInterlace = "Fast";
\r
188 queryParsed.DeInterlace = "Slow";
\r
191 queryParsed.DeInterlace = "Slowest";
\r
195 case "PictureDeinterlaceCustom":
\r
197 queryParsed.DeInterlace = value;
\r
199 case "PictureDenoise":
\r
203 queryParsed.DeNoise = "Off";
\r
206 queryParsed.DeNoise = "Weak";
\r
209 queryParsed.DeNoise = "Medium";
\r
212 queryParsed.DeNoise = "Strong";
\r
217 case "PictureDenoiseCustom":
\r
219 queryParsed.DeNoise = value;
\r
221 case "PictureDetelecine":
\r
222 queryParsed.DeTelecine = "Off";
\r
223 if (value == "1") queryParsed.DeTelecine = "Default";
\r
225 case "PictureDetelecineCustom":
\r
227 queryParsed.DeTelecine = value;
\r
231 case "VideoAvgBitrate":
\r
232 queryParsed.Width = int.Parse(value);
\r
234 case "VideoEncoder":
\r
235 queryParsed.VideoEncoder = value;
\r
237 case "VideoFramerate":
\r
238 queryParsed.VideoFramerate = value;
\r
240 case "VideoGrayScale":
\r
241 queryParsed.Grayscale = value == "1";
\r
243 case "VideoQualitySlider":
\r
244 queryParsed.VideoQuality = float.Parse(value);
\r
246 case "VideoQualityType":
\r
248 case "VideoTargetSize":
\r
249 queryParsed.VideoTargetSize = value;
\r
251 case "VideoTurboTwoPass":
\r
252 queryParsed.TurboFirstPass = value == "1";
\r
254 case "VideoTwoPass":
\r
255 queryParsed.TwoPass = value == "1";
\r
258 // Chapter Markers Tab
\r
259 case "ChapterMarkers":
\r
260 queryParsed.ChapterMarkers = value == "1";
\r
263 // Advanced x264 tab
\r
265 queryParsed.H264Query = value;
\r
268 // Preset Information
\r
269 case "PresetBuildNumber":
\r
270 queryParsed.PresetBuildNumber = int.Parse(value);
\r
272 case "PresetDescription":
\r
273 queryParsed.PresetDescription = value;
\r
276 queryParsed.PresetName = value;
\r
279 queryParsed.Type = value;
\r
281 case "UsesMaxPictureSettings":
\r
282 queryParsed.UsesMaxPictureSettings = value == "1";
\r
284 case "UsesPictureFilters":
\r
285 queryParsed.UsesPictureFilters = value == "1";
\r
287 case "UsesPictureSettings":
\r
288 queryParsed.UsesPictureSettings = value == "1";
\r
292 return queryParsed;
\r
296 /// Export a preset to a Plist file readable by the Mac and Linux GUI's
\r
298 /// <param name="path"></param>
\r
299 public void Export(string path)
\r
301 Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);
\r
304 Writer.WriteStartDocument();
\r
305 Writer.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN", @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);
\r
307 Writer.WriteStartElement("plist");
\r
308 Writer.WriteStartElement("array");
\r
310 // Add New Preset Here. Can write multiple presets here if required in future.
\r
314 Writer.WriteEndElement();
\r
315 Writer.WriteEndElement();
\r
317 Writer.WriteEndDocument();
\r
324 /// Write a Plist file
\r
326 private void WritePreset()
\r
328 Writer.WriteStartElement("dict");
\r
329 AudioListArrayDict();
\r
330 AddEncodeSettings();
\r
332 Writer.WriteEndElement();
\r
336 /// Add all the encode settings to the preset
\r
338 private void AddEncodeSettings()
\r
340 AddEncodeElement("ChapterMarkers", "integer", "");
\r
341 AddEncodeElement("Default", "integer", "");
\r
342 AddEncodeElement("FileFormat", "String", "");
\r
343 AddBooleanElement("Folder", true);
\r
344 AddEncodeElement("Mp4HttpOptimize", "integer", "");
\r
345 AddEncodeElement("Mp4LargeFile", "integer", "");
\r
346 AddEncodeElement("Mp4iPodCompatible", "integer", "");
\r
347 AddEncodeElement("PictureAutoCrop", "integer", "");
\r
348 AddEncodeElement("PictureBottomCrop", "integer", "");
\r
349 AddEncodeElement("PictureDeblock", "integer", "");
\r
350 AddEncodeElement("PictureDecomb", "integer", "");
\r
351 AddEncodeElement("PictureDecombCustom", "string", "");
\r
352 AddEncodeElement("PictureDecombDeinterlace", "integer", "");
\r
353 AddEncodeElement("PictureDeinterlace", "integer", "");
\r
354 AddEncodeElement("PictureDeinterlaceCustom", "string", "");
\r
355 AddEncodeElement("PictureDenoise", "integer", "");
\r
356 AddEncodeElement("PictureDenoiseCustom", "string", "");
\r
357 AddEncodeElement("PictureDetelecine", "integer", "");
\r
358 AddEncodeElement("PictureDetelecineCustom", "string", "");
\r
359 AddEncodeElement("PictureHeight", "integer", "");
\r
360 AddEncodeElement("PictureKeepRatio", "integer", "");
\r
361 AddEncodeElement("PictureLeftCrop", "integer", "");
\r
362 AddEncodeElement("PicturePAR", "integer", "");
\r
363 AddEncodeElement("PictureRightCrop", "integer", "");
\r
364 AddEncodeElement("PictureTopCrop", "integer", "");
\r
365 AddEncodeElement("PictureWidth", "integer", "");
\r
366 AddEncodeElement("PresetBuildNumber", "string", "");
\r
367 AddEncodeElement("PresetDescription", "string", "");
\r
368 AddEncodeElement("PresetName", "string", "");
\r
369 AddEncodeElement("Type", "integer", "");
\r
370 AddEncodeElement("UsesMaxPictureSettings", "integer", "");
\r
371 AddEncodeElement("UsesPictureFilters", "integer", "");
\r
372 AddEncodeElement("UsesPictureSettings", "integer", "");
\r
373 AddEncodeElement("VideoAvgBitrate", "string", "");
\r
374 AddEncodeElement("VideoEncoder", "string", "");
\r
375 AddEncodeElement("VideoFramerate", "string", "");
\r
376 AddEncodeElement("VideoGrayScale", "integer", "");
\r
377 AddEncodeElement("VideoQualitySlider", "real", "");
\r
378 AddEncodeElement("VideoQualityType", "integer", "");
\r
379 AddEncodeElement("VideoTargetSize", "string", "");
\r
380 AddEncodeElement("VideoTurboTwoPass", "integer", "");
\r
381 AddEncodeElement("VideoTwoPass", "integer", "");
\r
382 AddEncodeElement("x264Option", "string", "");
\r
386 /// Add Preset setting + value
\r
388 /// <param name="keyName"></param>
\r
389 /// <param name="value"></param>
\r
390 private void AddBooleanElement(string keyName, Boolean value)
\r
392 Writer.WriteStartElement("key");
\r
393 Writer.WriteString(keyName);
\r
394 Writer.WriteEndElement();
\r
397 Writer.WriteStartElement("true");
\r
398 Writer.WriteEndElement();
\r
402 Writer.WriteStartElement("false");
\r
403 Writer.WriteEndElement();
\r
408 /// Add Preset setting + value
\r
410 /// <param name="keyName"></param>
\r
411 /// <param name="type"></param>
\r
412 /// <param name="value"></param>
\r
413 private void AddEncodeElement(string keyName, string type, string value)
\r
415 Writer.WriteElementString("key", keyName);
\r
416 Writer.WriteElementString(type, value);
\r
420 /// Add List of audio tracks
\r
422 private void AudioListArrayDict()
\r
424 Writer.WriteStartElement("key");
\r
425 Writer.WriteString("AudioList");
\r
426 Writer.WriteEndElement();
\r
428 Writer.WriteStartElement("array");
\r
431 Writer.WriteEndElement();
\r
435 /// Add List of audio tracks
\r
437 private void AddAudioItem()
\r
440 string encoder = "AC3 Passthru";
\r
441 string mixdown = "AC3 Passthru";
\r
442 string sample = "Auto";
\r
445 string desc = "English (AC3) (5.1 ch)";
\r
447 Writer.WriteStartElement("dict");
\r
449 Writer.WriteElementString("key", "AudioBitrate");
\r
450 Writer.WriteElementString("string", bitrate.ToString());
\r
452 Writer.WriteElementString("key", "AudioEncoder");
\r
453 Writer.WriteElementString("string", encoder);
\r
455 Writer.WriteElementString("key", "AudioMixdown");
\r
456 Writer.WriteElementString("string", mixdown);
\r
458 Writer.WriteElementString("key", "AudioSamplerate");
\r
459 Writer.WriteElementString("string", sample);
\r
461 Writer.WriteElementString("key", "AudioTrack");
\r
462 Writer.WriteElementString("integer", track.ToString());
\r
464 Writer.WriteElementString("key", "AudioTrackDRCSlider");
\r
465 Writer.WriteElementString("real", drc.ToString());
\r
467 Writer.WriteElementString("key", "AudioTrackDescription");
\r
468 Writer.WriteElementString("string", desc);
\r
470 Writer.WriteEndElement();
\r