OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Presets / PlistPresetHandler.cs
1 /*  PlistPresetHandler.cs $\r
2         \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
6 \r
7 namespace Handbrake.Presets\r
8 {\r
9     using System;\r
10     using System.Collections;\r
11     using System.IO;\r
12     using System.Text;\r
13     using System.Windows.Forms;\r
14     using System.Xml;\r
15     using Functions;\r
16     using Model;\r
17 \r
18     public class PlistPresetHandler\r
19     {\r
20         /* WARNING This file is not complete!!!!!!\r
21          *\r
22          * TODO \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
26          */\r
27 \r
28         private XmlTextWriter Writer;\r
29 \r
30         /// <summary>\r
31         /// Import a Plist preset generated by the Mac or Linux GUI\r
32         /// </summary>\r
33         /// <param name="filename"></param>\r
34         /// <returns></returns>\r
35         public static QueryParser Import(string filename)\r
36         {\r
37             XmlNode root = null;\r
38             try\r
39             {\r
40                 if (!File.Exists(filename))\r
41                     return null;\r
42 \r
43                 StreamReader sr = File.OpenText(filename);\r
44                 string fromfile = string.Empty;\r
45                 int fileChar;\r
46                 while ((fileChar = sr.Read()) != -1)\r
47                     fromfile += Convert.ToChar(fileChar);\r
48 \r
49                 XmlDocument doc = new XmlDocument();\r
50                 doc.LoadXml(fromfile);\r
51 \r
52                 root = doc;\r
53                 if (!root.HasChildNodes)\r
54                 {\r
55                     MessageBox.Show(\r
56                         "The Preset file you selected appears to be invlaid or from an older version of HandBrake",\r
57                         "Error",\r
58                         MessageBoxButtons.OK, MessageBoxIcon.Error);\r
59                     return null;\r
60                 }\r
61             }\r
62             catch (Exception)\r
63             {\r
64                 MessageBox.Show(\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
66                     "Error",\r
67                     MessageBoxButtons.OK, MessageBoxIcon.Error);\r
68             }\r
69 \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
78             {\r
79                 XmlNode audioChannel = audioListDict.ChildNodes[i];\r
80                 AudioTrack track = new AudioTrack();\r
81 \r
82                 for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)\r
83                 {\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
87                     switch (key)\r
88                     {\r
89                         case "AudioBitrate":\r
90                             track.Bitrate = value;\r
91                             break;\r
92                         case "AudioEncoder":\r
93                             track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");\r
94                             break;\r
95                         case "AudioMixdown":\r
96                             track.MixDown = value;\r
97                             break;\r
98                         case "AudioSamplerate":\r
99                             track.SampleRate = value;\r
100                             break;\r
101                         case "AudioTrack":\r
102                             track.Track = value;\r
103                             break;\r
104                         case "AudioTrackDRCSlider":\r
105                             track.DRC = value;\r
106                             break;\r
107                     }\r
108                 }\r
109                 AudioInfo.Add(track);\r
110             }\r
111             queryParsed.AudioInformation = AudioInfo;\r
112 \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
117             {\r
118                 string key = presetSettings.ChildNodes[i].InnerText;\r
119                 string value = presetSettings.ChildNodes[i + 1].InnerText;\r
120 \r
121                 switch (key)\r
122                 {\r
123                     // Output Settings\r
124                     case "FileFormat":\r
125                         queryParsed.Format = value;\r
126                         break;\r
127                     case "Mp4HttpOptimize":\r
128                         queryParsed.OptimizeMP4 = value == "1";\r
129                         break;\r
130                     case "Mp4LargeFile":\r
131                         queryParsed.LargeMP4 = value == "1";\r
132                         break;\r
133                     case "Mp4iPodCompatible":\r
134                         queryParsed.IpodAtom = value == "1";\r
135                         break;\r
136 \r
137                     // Picture Settings\r
138                     case "PictureAutoCrop":\r
139                         break;\r
140                     case "PictureTopCrop":\r
141                         queryParsed.CropTop = value;\r
142                         break;\r
143                     case "PictureBottomCrop":\r
144                         queryParsed.CropBottom = value;\r
145                         break;\r
146                     case "PictureLeftCrop":\r
147                         queryParsed.CropLeft = value;\r
148                         break;\r
149                     case "PictureRightCrop":\r
150                         queryParsed.CropRight = value;\r
151                         break;\r
152                     case "PictureHeight":\r
153                         queryParsed.Height = int.Parse(value);\r
154                         break;\r
155                     case "PictureWidth":\r
156                         queryParsed.Width = int.Parse(value);\r
157                         break;\r
158                     case "PictureKeepRatio":\r
159                         queryParsed.KeepDisplayAsect = value == "1";\r
160                         break;\r
161                     case "PicturePAR":\r
162                         queryParsed.AnamorphicMode = int.Parse(value);\r
163                         break;\r
164 \r
165 \r
166                     // Filters\r
167                     case "PictureDeblock":\r
168                         queryParsed.DeBlock = int.Parse(value);\r
169                         break;\r
170                     case "PictureDecomb":\r
171                         queryParsed.Decomb = "Off";\r
172                         if (value == "2") queryParsed.Decomb = "Default";\r
173                         break;\r
174                     case "PictureDecombCustom":\r
175                         if (value != string.Empty)\r
176                             queryParsed.Decomb = value;\r
177                         break;\r
178                     case "PictureDecombDeinterlace":\r
179                         // Not Used\r
180                         break;\r
181                     case "PictureDeinterlace":\r
182                         switch (value)\r
183                         {\r
184                             case "0":\r
185                                 queryParsed.DeInterlace = "Off";\r
186                                 break;\r
187                             case "2":\r
188                                 queryParsed.DeInterlace = "Fast";\r
189                                 break;\r
190                             case "3":\r
191                                 queryParsed.DeInterlace = "Slow";\r
192                                 break;\r
193                             case "4":\r
194                                 queryParsed.DeInterlace = "Slowest";\r
195                                 break;\r
196                         }\r
197                         break;\r
198                     case "PictureDeinterlaceCustom":\r
199                         if (value != string.Empty)\r
200                             queryParsed.DeInterlace = value;\r
201                         break;\r
202                     case "PictureDenoise":\r
203                         switch (value)\r
204                         {\r
205                             case "0":\r
206                                 queryParsed.DeNoise = "Off";\r
207                                 break;\r
208                             case "2":\r
209                                 queryParsed.DeNoise = "Weak";\r
210                                 break;\r
211                             case "3":\r
212                                 queryParsed.DeNoise = "Medium";\r
213                                 break;\r
214                             case "4":\r
215                                 queryParsed.DeNoise = "Strong";\r
216                                 break;\r
217                         }\r
218 \r
219                         break;\r
220                     case "PictureDenoiseCustom":\r
221                         if (value != string.Empty)\r
222                             queryParsed.DeNoise = value;\r
223                         break;\r
224                     case "PictureDetelecine":\r
225                         queryParsed.DeTelecine = "Off";\r
226                         if (value == "1") queryParsed.DeTelecine = "Default";\r
227                         break;\r
228                     case "PictureDetelecineCustom":\r
229                         if (value != string.Empty)\r
230                             queryParsed.DeTelecine = value;\r
231                         break;\r
232 \r
233                     // Video Tab\r
234                     case "VideoAvgBitrate":\r
235                         queryParsed.AverageVideoBitrate = value;\r
236                         break;\r
237                     case "VideoEncoder":\r
238                         queryParsed.VideoEncoder = value;\r
239                         break;\r
240                     case "VideoFramerate":\r
241                         queryParsed.VideoFramerate = value;\r
242                         break;\r
243                     case "VideoGrayScale":\r
244                         queryParsed.Grayscale = value == "1";\r
245                         break;\r
246                     case "VideoQualitySlider":\r
247                         queryParsed.VideoQuality = float.Parse(value);\r
248                         break;\r
249                     case "VideoQualityType": // The Type of Quality Mode used\r
250                         QualityMode = value;\r
251                         break;\r
252                     case "VideoTargetSize":\r
253                         queryParsed.VideoTargetSize = value;\r
254                         break;\r
255                     case "VideoTurboTwoPass":\r
256                         queryParsed.TurboFirstPass = value == "1";\r
257                         break;\r
258                     case "VideoTwoPass":\r
259                         queryParsed.TwoPass = value == "1";\r
260                         break;\r
261 \r
262                     // Chapter Markers Tab\r
263                     case "ChapterMarkers":\r
264                         queryParsed.ChapterMarkers = value == "1";\r
265                         break;\r
266 \r
267                     // Advanced x264 tab\r
268                     case "x264Option":\r
269                         queryParsed.H264Query = value;\r
270                         break;\r
271 \r
272                     // Preset Information\r
273                     case "PresetBuildNumber":\r
274                         queryParsed.PresetBuildNumber = int.Parse(value);\r
275                         break;\r
276                     case "PresetDescription":\r
277                         queryParsed.PresetDescription = value;\r
278                         break;\r
279                     case "PresetName":\r
280                         queryParsed.PresetName = value;\r
281                         break;\r
282                     case "Type":\r
283                         queryParsed.Type = value;\r
284                         break;\r
285                     case "UsesMaxPictureSettings":\r
286                         queryParsed.UsesMaxPictureSettings = value == "1";\r
287                         break;\r
288                     case "UsesPictureFilters":\r
289                         queryParsed.UsesPictureFilters = value == "1";\r
290                         break;\r
291                     case "UsesPictureSettings":\r
292                         queryParsed.UsesPictureSettings = value == "1";\r
293                         break;\r
294                 }\r
295             }\r
296 \r
297             // Kill any Quality values we don't need.\r
298             switch (QualityMode)\r
299             {\r
300                 case "0": // FileSize\r
301                     queryParsed.VideoQuality = -1;\r
302                     queryParsed.AverageVideoBitrate = null;\r
303                     break;\r
304                 case "1": // Avg Bitrate\r
305                     queryParsed.VideoQuality = -1;\r
306                     queryParsed.VideoTargetSize = null;\r
307                     break;\r
308                 case "2": // CQ\r
309                     queryParsed.AverageVideoBitrate = null;\r
310                     queryParsed.VideoTargetSize = null;\r
311                     break;\r
312             }\r
313 \r
314             return queryParsed;\r
315         }\r
316 \r
317         /// <summary>\r
318         /// Export a preset to a Plist file readable by the Mac and Linux GUI's\r
319         /// </summary>\r
320         /// <param name="path"></param>\r
321         public void Export(string path)\r
322         {\r
323             Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);\r
324 \r
325             // Header\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
329 \r
330             Writer.WriteStartElement("plist");\r
331             Writer.WriteStartElement("array");\r
332 \r
333             // Add New Preset Here. Can write multiple presets here if required in future.\r
334             WritePreset();\r
335 \r
336             // Footer\r
337             Writer.WriteEndElement();\r
338             Writer.WriteEndElement();\r
339 \r
340             Writer.WriteEndDocument();\r
341 \r
342             // Closeout\r
343             Writer.Close();\r
344         }\r
345 \r
346         /// <summary>\r
347         /// Write a Plist file\r
348         /// </summary>\r
349         private void WritePreset()\r
350         {\r
351             Writer.WriteStartElement("dict");\r
352             AudioListArrayDict();\r
353             AddEncodeSettings();\r
354 \r
355             Writer.WriteEndElement();\r
356         }\r
357 \r
358         /// <summary>\r
359         /// Add all the encode settings to the preset\r
360         /// </summary>\r
361         private void AddEncodeSettings()\r
362         {\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
406         }\r
407 \r
408         /// <summary>\r
409         /// Add Preset setting + value\r
410         /// </summary>\r
411         /// <param name="keyName"></param>\r
412         /// <param name="value"></param>\r
413         private void AddBooleanElement(string keyName, bool value)\r
414         {\r
415             Writer.WriteStartElement("key");\r
416             Writer.WriteString(keyName);\r
417             Writer.WriteEndElement();\r
418             if (value)\r
419             {\r
420                 Writer.WriteStartElement("true");\r
421                 Writer.WriteEndElement();\r
422             }\r
423             else\r
424             {\r
425                 Writer.WriteStartElement("false");\r
426                 Writer.WriteEndElement();\r
427             }\r
428         }\r
429 \r
430         /// <summary>\r
431         /// Add Preset setting + value\r
432         /// </summary>\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
437         {\r
438             Writer.WriteElementString("key", keyName);\r
439             Writer.WriteElementString(type, value);\r
440         }\r
441 \r
442         /// <summary>\r
443         /// Add List of audio tracks\r
444         /// </summary>\r
445         private void AudioListArrayDict()\r
446         {\r
447             Writer.WriteStartElement("key");\r
448             Writer.WriteString("AudioList");\r
449             Writer.WriteEndElement();\r
450 \r
451             Writer.WriteStartElement("array");\r
452             AddAudioItem();\r
453             AddAudioItem();\r
454             Writer.WriteEndElement();\r
455         }\r
456 \r
457         /// <summary>\r
458         /// Add List of audio tracks\r
459         /// </summary>\r
460         private void AddAudioItem()\r
461         {\r
462             int bitrate = 448;\r
463             string encoder = "AC3 Passthru";\r
464             string mixdown = "AC3 Passthru";\r
465             string sample = "Auto";\r
466             int track = 1;\r
467             double drc = 0.0;\r
468             string desc = "English (AC3) (5.1 ch)";\r
469 \r
470             Writer.WriteStartElement("dict");\r
471 \r
472             Writer.WriteElementString("key", "AudioBitrate");\r
473             Writer.WriteElementString("string", bitrate.ToString());\r
474 \r
475             Writer.WriteElementString("key", "AudioEncoder");\r
476             Writer.WriteElementString("string", encoder);\r
477 \r
478             Writer.WriteElementString("key", "AudioMixdown");\r
479             Writer.WriteElementString("string", mixdown);\r
480 \r
481             Writer.WriteElementString("key", "AudioSamplerate");\r
482             Writer.WriteElementString("string", sample);\r
483 \r
484             Writer.WriteElementString("key", "AudioTrack");\r
485             Writer.WriteElementString("integer", track.ToString());\r
486 \r
487             Writer.WriteElementString("key", "AudioTrackDRCSlider");\r
488             Writer.WriteElementString("real", drc.ToString());\r
489 \r
490             Writer.WriteElementString("key", "AudioTrackDescription");\r
491             Writer.WriteElementString("string", desc);\r
492 \r
493             Writer.WriteEndElement();\r
494         }\r
495     }\r
496 }