OSDN Git Service

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