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 using System;\r
8 using System.IO;\r
9 using System.Text;\r
10 using System.Xml;\r
11 using System.Windows.Forms;\r
12 using System.Collections;\r
13 using Handbrake.Functions;\r
14 using Handbrake.Model;\r
15 \r
16 namespace Handbrake.Presets\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", "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.", "Error",\r
65                        MessageBoxButtons.OK, MessageBoxIcon.Error);\r
66             }\r
67 \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
71 \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
76             {\r
77                 XmlNode audioChannel = audioListDict.ChildNodes[i];\r
78                 AudioTrack track = new AudioTrack();\r
79 \r
80                 for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)\r
81                 {\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
85                     switch (key)\r
86                     {\r
87                         case "AudioBitrate":\r
88                             track.Bitrate = value;\r
89                             break;\r
90                         case "AudioEncoder":\r
91                             track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");\r
92                             break;\r
93                         case "AudioMixdown":\r
94                             track.MixDown = value;\r
95                             break;\r
96                         case "AudioSamplerate":\r
97                             track.SampleRate = value;\r
98                             break;\r
99                         case "AudioTrack":\r
100                             track.Track = value;\r
101                             break;\r
102                         case "AudioTrackDRCSlider":\r
103                             track.DRC = value;\r
104                             break;\r
105                     }\r
106                 }\r
107                 AudioInfo.Add(track);\r
108             }\r
109             queryParsed.AudioInformation = AudioInfo;\r
110 \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
114             {\r
115                 string key = presetSettings.ChildNodes[i].InnerText;\r
116                 string value = presetSettings.ChildNodes[i + 1].InnerText;\r
117 \r
118                 switch (key)\r
119                 {\r
120                     // Output Settings\r
121                     case "FileFormat":\r
122                         queryParsed.Format = value;\r
123                         break;\r
124                     case "Mp4HttpOptimize":\r
125                         queryParsed.OptimizeMP4 = value == "1";\r
126                         break;\r
127                     case "Mp4LargeFile":\r
128                         queryParsed.LargeMP4 = value == "1";\r
129                         break;\r
130                     case "Mp4iPodCompatible":\r
131                         queryParsed.IpodAtom = value == "1";\r
132                         break;\r
133 \r
134                     // Picture Settings\r
135                     case "PictureAutoCrop":\r
136                         break;\r
137                     case "PictureTopCrop":\r
138                         queryParsed.CropTop = value;\r
139                         break;\r
140                     case "PictureBottomCrop":\r
141                         queryParsed.CropBottom = value;\r
142                         break;\r
143                     case "PictureLeftCrop":\r
144                         queryParsed.CropLeft = value;\r
145                         break;\r
146                     case "PictureRightCrop":\r
147                         queryParsed.CropRight = value;\r
148                         break;\r
149                     case "PictureHeight":\r
150                         queryParsed.Height = int.Parse(value);\r
151                         break;\r
152                     case "PictureWidth":\r
153                         queryParsed.Width = int.Parse(value);\r
154                         break;\r
155                     case "PictureKeepRatio":\r
156                         queryParsed.KeepDisplayAsect = value == "1";\r
157                         break;\r
158                     case "PicturePAR":\r
159                         queryParsed.AnamorphicMode = int.Parse(value);\r
160                         break;\r
161 \r
162 \r
163                     // Filters\r
164                     case "PictureDeblock":\r
165                         queryParsed.DeBlock = int.Parse(value);\r
166                         break;\r
167                     case "PictureDecomb":\r
168                         queryParsed.Decomb = "Off";\r
169                         if (value == "2") queryParsed.Decomb = "Default";\r
170                         break;\r
171                     case "PictureDecombCustom":\r
172                         if (value != "")\r
173                             queryParsed.Decomb = value;\r
174                         break;\r
175                     case "PictureDecombDeinterlace":\r
176                         // Not Used\r
177                         break;\r
178                     case "PictureDeinterlace":\r
179                         switch (value)\r
180                         {\r
181                             case "0":\r
182                                 queryParsed.DeInterlace = "Off";\r
183                                 break;\r
184                             case "2":\r
185                                 queryParsed.DeInterlace = "Fast";\r
186                                 break;\r
187                             case "3":\r
188                                 queryParsed.DeInterlace = "Slow";\r
189                                 break;\r
190                             case "4":\r
191                                 queryParsed.DeInterlace = "Slowest";\r
192                                 break;\r
193                         }\r
194                         break;\r
195                     case "PictureDeinterlaceCustom":\r
196                         if (value != "")\r
197                             queryParsed.DeInterlace = value;\r
198                         break;\r
199                     case "PictureDenoise":\r
200                         switch (value)\r
201                         {\r
202                             case "0":\r
203                                 queryParsed.DeNoise = "Off";\r
204                                 break;\r
205                             case "2":\r
206                                 queryParsed.DeNoise = "Weak";\r
207                                 break;\r
208                             case "3":\r
209                                 queryParsed.DeNoise = "Medium";\r
210                                 break;\r
211                             case "4":\r
212                                 queryParsed.DeNoise = "Strong";\r
213                                 break;\r
214                         }\r
215 \r
216                         break;\r
217                     case "PictureDenoiseCustom":\r
218                         if (value != "")\r
219                             queryParsed.DeNoise = value;\r
220                         break;\r
221                     case "PictureDetelecine":\r
222                         queryParsed.DeTelecine = "Off";\r
223                         if (value == "1") queryParsed.DeTelecine = "Default";\r
224                         break;\r
225                     case "PictureDetelecineCustom":\r
226                         if (value != "")\r
227                             queryParsed.DeTelecine = value;\r
228                         break;\r
229 \r
230                     // Video Tab\r
231                     case "VideoAvgBitrate":\r
232                         queryParsed.Width = int.Parse(value);\r
233                         break;\r
234                     case "VideoEncoder":\r
235                         queryParsed.VideoEncoder = value;\r
236                         break;\r
237                     case "VideoFramerate":\r
238                         queryParsed.VideoFramerate = value;\r
239                         break;\r
240                     case "VideoGrayScale":\r
241                         queryParsed.Grayscale = value == "1";\r
242                         break;\r
243                     case "VideoQualitySlider":\r
244                         queryParsed.VideoQuality = float.Parse(value);\r
245                         break;\r
246                     case "VideoQualityType":\r
247                         break;\r
248                     case "VideoTargetSize":\r
249                         queryParsed.VideoTargetSize = value;\r
250                         break;\r
251                     case "VideoTurboTwoPass":\r
252                         queryParsed.TurboFirstPass = value == "1";\r
253                         break;\r
254                     case "VideoTwoPass":\r
255                         queryParsed.TwoPass = value == "1";\r
256                         break;\r
257 \r
258                     // Chapter Markers Tab\r
259                     case "ChapterMarkers":\r
260                         queryParsed.ChapterMarkers = value == "1";\r
261                         break;\r
262 \r
263                     // Advanced x264 tab\r
264                     case "x264Option":\r
265                         queryParsed.H264Query = value;\r
266                         break;\r
267 \r
268                     // Preset Information\r
269                     case "PresetBuildNumber":\r
270                         queryParsed.PresetBuildNumber = int.Parse(value);\r
271                         break;\r
272                     case "PresetDescription":\r
273                         queryParsed.PresetDescription = value;\r
274                         break;\r
275                     case "PresetName":\r
276                         queryParsed.PresetName = value;\r
277                         break;\r
278                     case "Type":\r
279                         queryParsed.Type = value;\r
280                         break;\r
281                     case "UsesMaxPictureSettings":\r
282                         queryParsed.UsesMaxPictureSettings = value == "1";\r
283                         break;\r
284                     case "UsesPictureFilters":\r
285                         queryParsed.UsesPictureFilters = value == "1";\r
286                         break;\r
287                     case "UsesPictureSettings":\r
288                         queryParsed.UsesPictureSettings = value == "1";\r
289                         break;\r
290                 }\r
291             }\r
292             return queryParsed;\r
293         }\r
294 \r
295         /// <summary>\r
296         /// Export a preset to a Plist file readable by the Mac and Linux GUI's\r
297         /// </summary>\r
298         /// <param name="path"></param>\r
299         public void Export(string path)\r
300         {\r
301             Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);\r
302 \r
303             // Header\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
306 \r
307             Writer.WriteStartElement("plist");\r
308             Writer.WriteStartElement("array");\r
309 \r
310             // Add New Preset Here. Can write multiple presets here if required in future.\r
311             WritePreset();\r
312 \r
313             // Footer\r
314             Writer.WriteEndElement();\r
315             Writer.WriteEndElement();\r
316 \r
317             Writer.WriteEndDocument();\r
318 \r
319             // Closeout\r
320             Writer.Close();\r
321         }\r
322         \r
323         /// <summary>\r
324         /// Write a Plist file\r
325         /// </summary>\r
326         private void WritePreset()\r
327         {\r
328             Writer.WriteStartElement("dict");\r
329             AudioListArrayDict();\r
330             AddEncodeSettings();\r
331 \r
332             Writer.WriteEndElement();\r
333         }\r
334 \r
335         /// <summary>\r
336         /// Add all the encode settings to the preset\r
337         /// </summary>\r
338         private void AddEncodeSettings()\r
339         {\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
383         }\r
384 \r
385         /// <summary>\r
386         /// Add Preset setting + value\r
387         /// </summary>\r
388         /// <param name="keyName"></param>\r
389         /// <param name="value"></param>\r
390         private void AddBooleanElement(string keyName, Boolean value)\r
391         {\r
392             Writer.WriteStartElement("key");\r
393             Writer.WriteString(keyName);\r
394             Writer.WriteEndElement();\r
395             if (value)\r
396             {\r
397                 Writer.WriteStartElement("true");\r
398                 Writer.WriteEndElement();\r
399             }\r
400             else\r
401             {\r
402                 Writer.WriteStartElement("false");\r
403                 Writer.WriteEndElement();\r
404             }\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="type"></param>\r
412         /// <param name="value"></param>\r
413         private void AddEncodeElement(string keyName, string type, string value)\r
414         {\r
415             Writer.WriteElementString("key", keyName);\r
416             Writer.WriteElementString(type, value);\r
417         }\r
418 \r
419         /// <summary>\r
420         /// Add List of audio tracks\r
421         /// </summary>\r
422         private void AudioListArrayDict()\r
423         {\r
424             Writer.WriteStartElement("key");\r
425             Writer.WriteString("AudioList");\r
426             Writer.WriteEndElement();\r
427 \r
428             Writer.WriteStartElement("array");\r
429             AddAudioItem();\r
430             AddAudioItem();\r
431             Writer.WriteEndElement();\r
432         }\r
433 \r
434         /// <summary>\r
435         /// Add List of audio tracks\r
436         /// </summary>\r
437         private void AddAudioItem()\r
438         {\r
439             int bitrate = 448;\r
440             string encoder = "AC3 Passthru";\r
441             string mixdown = "AC3 Passthru";\r
442             string sample = "Auto";\r
443             int track = 1;\r
444             double drc = 0.0;\r
445             string desc = "English (AC3) (5.1 ch)";\r
446 \r
447             Writer.WriteStartElement("dict");\r
448 \r
449             Writer.WriteElementString("key", "AudioBitrate");\r
450             Writer.WriteElementString("string", bitrate.ToString());\r
451 \r
452             Writer.WriteElementString("key", "AudioEncoder");\r
453             Writer.WriteElementString("string", encoder);\r
454 \r
455             Writer.WriteElementString("key", "AudioMixdown");\r
456             Writer.WriteElementString("string", mixdown);\r
457 \r
458             Writer.WriteElementString("key", "AudioSamplerate");\r
459             Writer.WriteElementString("string", sample);\r
460 \r
461             Writer.WriteElementString("key", "AudioTrack");\r
462             Writer.WriteElementString("integer", track.ToString());\r
463 \r
464             Writer.WriteElementString("key", "AudioTrackDRCSlider");\r
465             Writer.WriteElementString("real", drc.ToString());\r
466 \r
467             Writer.WriteElementString("key", "AudioTrackDescription");\r
468             Writer.WriteElementString("string", desc);\r
469 \r
470             Writer.WriteEndElement();\r
471         }\r
472     }\r
473 }