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 \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.Width = int.Parse(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":\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             return queryParsed;\r
296         }\r
297 \r
298         /// <summary>\r
299         /// Export a preset to a Plist file readable by the Mac and Linux GUI's\r
300         /// </summary>\r
301         /// <param name="path"></param>\r
302         public void Export(string path)\r
303         {\r
304             Writer = new XmlTextWriter("C:\\test.xml", Encoding.UTF8);\r
305 \r
306             // Header\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
310 \r
311             Writer.WriteStartElement("plist");\r
312             Writer.WriteStartElement("array");\r
313 \r
314             // Add New Preset Here. Can write multiple presets here if required in future.\r
315             WritePreset();\r
316 \r
317             // Footer\r
318             Writer.WriteEndElement();\r
319             Writer.WriteEndElement();\r
320 \r
321             Writer.WriteEndDocument();\r
322 \r
323             // Closeout\r
324             Writer.Close();\r
325         }\r
326 \r
327         /// <summary>\r
328         /// Write a Plist file\r
329         /// </summary>\r
330         private void WritePreset()\r
331         {\r
332             Writer.WriteStartElement("dict");\r
333             AudioListArrayDict();\r
334             AddEncodeSettings();\r
335 \r
336             Writer.WriteEndElement();\r
337         }\r
338 \r
339         /// <summary>\r
340         /// Add all the encode settings to the preset\r
341         /// </summary>\r
342         private void AddEncodeSettings()\r
343         {\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
387         }\r
388 \r
389         /// <summary>\r
390         /// Add Preset setting + value\r
391         /// </summary>\r
392         /// <param name="keyName"></param>\r
393         /// <param name="value"></param>\r
394         private void AddBooleanElement(string keyName, bool value)\r
395         {\r
396             Writer.WriteStartElement("key");\r
397             Writer.WriteString(keyName);\r
398             Writer.WriteEndElement();\r
399             if (value)\r
400             {\r
401                 Writer.WriteStartElement("true");\r
402                 Writer.WriteEndElement();\r
403             }\r
404             else\r
405             {\r
406                 Writer.WriteStartElement("false");\r
407                 Writer.WriteEndElement();\r
408             }\r
409         }\r
410 \r
411         /// <summary>\r
412         /// Add Preset setting + value\r
413         /// </summary>\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
418         {\r
419             Writer.WriteElementString("key", keyName);\r
420             Writer.WriteElementString(type, value);\r
421         }\r
422 \r
423         /// <summary>\r
424         /// Add List of audio tracks\r
425         /// </summary>\r
426         private void AudioListArrayDict()\r
427         {\r
428             Writer.WriteStartElement("key");\r
429             Writer.WriteString("AudioList");\r
430             Writer.WriteEndElement();\r
431 \r
432             Writer.WriteStartElement("array");\r
433             AddAudioItem();\r
434             AddAudioItem();\r
435             Writer.WriteEndElement();\r
436         }\r
437 \r
438         /// <summary>\r
439         /// Add List of audio tracks\r
440         /// </summary>\r
441         private void AddAudioItem()\r
442         {\r
443             int bitrate = 448;\r
444             string encoder = "AC3 Passthru";\r
445             string mixdown = "AC3 Passthru";\r
446             string sample = "Auto";\r
447             int track = 1;\r
448             double drc = 0.0;\r
449             string desc = "English (AC3) (5.1 ch)";\r
450 \r
451             Writer.WriteStartElement("dict");\r
452 \r
453             Writer.WriteElementString("key", "AudioBitrate");\r
454             Writer.WriteElementString("string", bitrate.ToString());\r
455 \r
456             Writer.WriteElementString("key", "AudioEncoder");\r
457             Writer.WriteElementString("string", encoder);\r
458 \r
459             Writer.WriteElementString("key", "AudioMixdown");\r
460             Writer.WriteElementString("string", mixdown);\r
461 \r
462             Writer.WriteElementString("key", "AudioSamplerate");\r
463             Writer.WriteElementString("string", sample);\r
464 \r
465             Writer.WriteElementString("key", "AudioTrack");\r
466             Writer.WriteElementString("integer", track.ToString());\r
467 \r
468             Writer.WriteElementString("key", "AudioTrackDRCSlider");\r
469             Writer.WriteElementString("real", drc.ToString());\r
470 \r
471             Writer.WriteElementString("key", "AudioTrackDescription");\r
472             Writer.WriteElementString("string", desc);\r
473 \r
474             Writer.WriteEndElement();\r
475         }\r
476     }\r
477 }