OSDN Git Service

translate some words in frmMain.cs
[handbrake-jp/handbrake-jp.git] / win / C# / Functions / QueryParser.cs
1 /*  QueryParser.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.Globalization;\r
9 using System.Text.RegularExpressions;\r
10 using System.Windows.Forms;\r
11 using System.Collections;\r
12 \r
13 namespace Handbrake.Functions\r
14 {\r
15     internal class QueryParser\r
16     {\r
17         private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
18 \r
19         #region Varibles\r
20 \r
21         // Source\r
22         public int DVDTitle { get; set; }\r
23         public int DVDChapterStart { get; set; }\r
24         public int DVDChapterFinish { get; set; }\r
25 \r
26         // Output Settings\r
27         public string Format { get; set; }\r
28         public Boolean LargeMP4 { get; set; }\r
29         public Boolean IpodAtom { get; set; }\r
30         public Boolean OptimizeMP4 { get; set; }\r
31 \r
32         // Picture Settings\r
33         public int Width { get; set; }\r
34         public int Height { get; set; }\r
35         public int MaxWidth { get; set; }\r
36         public int MaxHeight { get; set; }\r
37         public string CropValues { get; set; }\r
38         public string CropTop { get; set; }\r
39         public string CropBottom { get; set; }\r
40         public string CropLeft { get; set; }\r
41         public string CropRight { get; set; }\r
42         public int AnamorphicMode { get; set; }\r
43         public Boolean keepDisplayAsect { get; set; }\r
44         public double displayWidthValue { get; set; }\r
45         public int pixelAspectWidth { get; set; }\r
46         public int pixelAspectHeight { get; set; }\r
47         public int AnamorphicModulus { get; set; }\r
48 \r
49         // Video Filters\r
50         public string DeTelecine { get; set; }\r
51         public int DeBlock { get; set; }\r
52         public string DeInterlace { get; set; }\r
53         public string DeNoise { get; set; }\r
54         public string Decomb { get; set; }\r
55 \r
56         // Video Settings\r
57         public string VideoEncoder { get; set; }\r
58         public Boolean Grayscale { get; set; }\r
59         public Boolean TwoPass { get; set; }\r
60         public Boolean TurboFirstPass { get; set; }\r
61         public string VideoFramerate { get; set; }\r
62         public string AverageVideoBitrate { get; set; }\r
63         public string VideoTargetSize { get; set; }\r
64         public float VideoQuality { get; set; }\r
65 \r
66         // Audio Settings\r
67         public ArrayList AudioInformation { get; set; }\r
68         public string Subtitles { get; set; }\r
69         public Boolean ForcedSubtitles { get; set; }\r
70 \r
71         // Chapter Markers\r
72         public Boolean ChapterMarkers { get; set; }\r
73 \r
74         // Other\r
75         public string H264Query { get; set; }\r
76         public Boolean Verbose { get; set; }\r
77 \r
78         // Preset Information\r
79         public int PresetBuildNumber { get; set; }\r
80         public string PresetDescription { get; set; }\r
81         public string PresetName { get; set; }\r
82         public string Type { get; set; }\r
83         public Boolean UsesMaxPictureSettings { get; set; }\r
84         public Boolean UsesPictureFilters { get; set; }\r
85         public Boolean UsesPictureSettings { get; set; }\r
86 \r
87         #endregion\r
88 \r
89         /// <summary>\r
90         /// Takes in a query which can be in any order and parses it. \r
91         /// All varibles are then set so they can be used elsewhere.\r
92         /// </summary>\r
93         /// <param name="input">A ClI Query</param>\r
94         /// <returns>A Parsed Query</returns>\r
95         public static QueryParser Parse(String input)\r
96         {\r
97             var thisQuery = new QueryParser();\r
98 \r
99             #region Regular Expressions\r
100 \r
101             //Source\r
102             Match title = Regex.Match(input, @"-t ([0-9]*)");\r
103             Match chapters = Regex.Match(input, @"-c ([0-9-]*)");\r
104 \r
105             //Output Settings\r
106             Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");\r
107             Match grayscale = Regex.Match(input, @" -g");\r
108             Match largerMp4 = Regex.Match(input, @" -4");\r
109             Match ipodAtom = Regex.Match(input, @" -I");\r
110 \r
111             //Picture Settings Tab\r
112             Match width = Regex.Match(input, @"-w ([0-9]*)");\r
113             Match height = Regex.Match(input, @"-l ([0-9]*)");\r
114             Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");\r
115             Match maxHeight = Regex.Match(input, @"-Y ([0-9]*)");\r
116             Match crop = Regex.Match(input, @"--crop ([0-9]*):([0-9]*):([0-9]*):([0-9]*)");\r
117 \r
118             Match looseAnamorphic = Regex.Match(input, @"--loose-anamorphic");\r
119             Match strictAnamorphic = Regex.Match(input, @"--strict-anamorphic");\r
120             Match customAnamorphic = Regex.Match(input, @"--custom-anamorphic");\r
121 \r
122             Match keepDisplayAsect = Regex.Match(input, @"--keep-display-aspect");\r
123             Match displayWidth = Regex.Match(input, @"--display-width ([0-9*])");\r
124             Match pixelAspect = Regex.Match(input, @"--pixel-aspect ([0-9]*):([0-9]*)");\r
125             Match modulus = Regex.Match(input, @"--modulus ([0-9*])");\r
126 \r
127             // Picture Settings - Filters\r
128             Match decomb = Regex.Match(input, @" --decomb");\r
129             Match decombValue = Regex.Match(input, @" --decomb=\""([a-zA-Z0-9.:]*)\""");\r
130             Match deinterlace = Regex.Match(input, @"--deinterlace=\""([a-zA-Z0-9.:]*)\""");\r
131             Match denoise = Regex.Match(input, @"--denoise=\""([a-zA-Z0-9.:]*)\""");\r
132             Match deblock = Regex.Match(input, @"--deblock=([0-9:]*)");\r
133             Match detelecine = Regex.Match(input, @"--detelecine");\r
134             Match detelecineValue = Regex.Match(input, @" --detelecine=\""([a-zA-Z0-9.:]*)\""");\r
135 \r
136             //Video Settings Tab\r
137             Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");\r
138             Match videoFramerate = Regex.Match(input, @"-r ([0-9.]*)");\r
139             Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");\r
140             Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");\r
141             Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");\r
142             Match twoPass = Regex.Match(input, @" -2");\r
143             Match turboFirstPass = Regex.Match(input, @" -T");\r
144             Match optimizeMP4 = Regex.Match(input, @" -O");\r
145 \r
146             //Audio Settings Tab\r
147             Match noAudio = Regex.Match(input, @"-a none");\r
148             Match audioTracks = Regex.Match(input, @"-a ([0-9,]*)");\r
149             Match audioTrackMixes = Regex.Match(input, @"-6 ([0-9a-zA-Z,]*)");\r
150             Match audioEncoders = Regex.Match(input, @"-E ([a-zA-Z0-9+,]*)");\r
151             Match audioBitrates = Regex.Match(input, @"-B ([0-9a-zA-Z,]*)");       // Auto = a-z\r
152             Match audioSampleRates = Regex.Match(input, @"-R ([0-9a-zA-Z.,]*)");  // Auto = a-z\r
153             Match drcValues = Regex.Match(input, @"-D ([0-9.,]*)");\r
154 \r
155             Match subtitles = Regex.Match(input, @"-s ([0-9a-zA-Z]*)");\r
156             Match subScan = Regex.Match(input, @" -U");\r
157             Match forcedSubtitles = Regex.Match(input, @" -F");\r
158 \r
159             // Chapters Tab\r
160             Match chapterMarkers = Regex.Match(input, @" -m");\r
161             Match chapterMarkersFileMode = Regex.Match(input, @"--markers");\r
162 \r
163             //H264 Tab\r
164             Match x264 = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");\r
165 \r
166             //Program Options\r
167             Match verbose = Regex.Match(input, @" -v");\r
168 \r
169             #endregion\r
170 \r
171             #region Set Varibles\r
172 \r
173             try\r
174             {\r
175                 #region Source Tab\r
176 \r
177                 if (title.Success)\r
178                     thisQuery.DVDTitle = int.Parse(title.ToString().Replace("-t ", ""));\r
179 \r
180                 if (chapters.Success)\r
181                 {\r
182                     string[] actTitles = chapters.ToString().Replace("-c ", "").Split('-');\r
183                     thisQuery.DVDChapterStart = int.Parse(actTitles[0]);\r
184                     if (actTitles.Length > 1)\r
185                     {\r
186                         thisQuery.DVDChapterFinish = int.Parse(actTitles[1]);\r
187                     }\r
188 \r
189                     if ((thisQuery.DVDChapterStart == 1) && (thisQuery.DVDChapterFinish == 0))\r
190                         thisQuery.DVDChapterFinish = thisQuery.DVDChapterStart;\r
191                 }\r
192                 #endregion\r
193 \r
194                 #region Output Settings\r
195 \r
196                 if (format.Success)\r
197                     thisQuery.Format = format.ToString().Replace("-f ", "");\r
198                 thisQuery.LargeMP4 = largerMp4.Success;\r
199                 thisQuery.IpodAtom = ipodAtom.Success;\r
200                 thisQuery.OptimizeMP4 = optimizeMP4.Success;\r
201 \r
202                 #endregion\r
203 \r
204                 #region Picture Tab\r
205 \r
206                 if (width.Success)\r
207                     thisQuery.Width = int.Parse(width.Groups[0].Value.Replace("-w ", ""));\r
208 \r
209                 if (height.Success)\r
210                     thisQuery.Height = int.Parse(height.Groups[0].Value.Replace("-l ", ""));\r
211 \r
212                 if (maxWidth.Success)\r
213                     thisQuery.MaxWidth = int.Parse(maxWidth.Groups[0].Value.Replace("-X ", ""));\r
214 \r
215                 if (maxHeight.Success)\r
216                     thisQuery.MaxHeight = int.Parse(maxHeight.Groups[0].Value.Replace("-Y ", ""));\r
217 \r
218                 if (crop.Success)\r
219                 {\r
220                     thisQuery.CropValues = crop.ToString().Replace("--crop ", "");\r
221                     string[] actCropValues = thisQuery.CropValues.Split(':');\r
222                     thisQuery.CropTop = actCropValues[0];\r
223                     thisQuery.CropBottom = actCropValues[1];\r
224                     thisQuery.CropLeft = actCropValues[2];\r
225                     thisQuery.CropRight = actCropValues[3];\r
226                 }\r
227 \r
228                 if (strictAnamorphic.Success)\r
229                     thisQuery.AnamorphicMode = 1;\r
230                 else if (looseAnamorphic.Success)\r
231                     thisQuery.AnamorphicMode = 2;\r
232                 else if (customAnamorphic.Success)\r
233                     thisQuery.AnamorphicMode = 3;\r
234                 else\r
235                     thisQuery.AnamorphicMode = 0;\r
236 \r
237                 thisQuery.keepDisplayAsect = keepDisplayAsect.Success;\r
238 \r
239                 if (displayWidth.Success)\r
240                     thisQuery.displayWidthValue = double.Parse(displayWidth.Groups[0].Value.Replace("--display-width ", ""));\r
241 \r
242                 if (pixelAspect.Success)\r
243                     thisQuery.pixelAspectWidth = int.Parse(pixelAspect.Groups[1].Value.Replace("--pixel-aspect ", ""));\r
244 \r
245                 if (pixelAspect.Success && pixelAspect.Groups.Count >=3)\r
246                     thisQuery.pixelAspectHeight = int.Parse(pixelAspect.Groups[2].Value.Replace("--pixel-aspect ", ""));\r
247 \r
248                 if (modulus.Success)\r
249                     thisQuery.AnamorphicModulus = int.Parse(modulus.Groups[0].Value.Replace("--modulus ", ""));\r
250 \r
251 \r
252                 #endregion\r
253 \r
254                 #region Filters\r
255 \r
256                 thisQuery.Decomb = "Off";\r
257                 if (decomb.Success)\r
258                 {\r
259                     thisQuery.Decomb = "Default";\r
260                     if (decombValue.Success)\r
261                         thisQuery.Decomb = decombValue.ToString().Replace("--decomb=", "").Replace("\"", "");\r
262                 }\r
263 \r
264                 thisQuery.DeInterlace = "Off";\r
265                 if (deinterlace.Success)\r
266                 {\r
267                     thisQuery.DeInterlace = deinterlace.ToString().Replace("--deinterlace=", "").Replace("\"", "");\r
268                     thisQuery.DeInterlace = thisQuery.DeInterlace.Replace("fast", "Fast").Replace("slow", "Slow").Replace("slower", "Slower");\r
269                     thisQuery.DeInterlace = thisQuery.DeInterlace.Replace("slowest", "Slowest");\r
270                 }\r
271 \r
272                 thisQuery.DeNoise = "Off";\r
273                 if (denoise.Success)\r
274                 {\r
275                     thisQuery.DeNoise = denoise.ToString().Replace("--denoise=", "").Replace("\"", "");\r
276                     thisQuery.DeNoise = thisQuery.DeNoise.Replace("weak", "Weak").Replace("medium", "Medium").Replace("strong", "Strong");\r
277                 }\r
278 \r
279                 string deblockValue = "";\r
280                 thisQuery.DeBlock = 0;\r
281                 if (deblock.Success)\r
282                     deblockValue = deblock.ToString().Replace("--deblock=", "");\r
283 \r
284                 int dval = 0;\r
285                 if (deblockValue != "")\r
286                     int.TryParse(deblockValue, out dval);\r
287                 thisQuery.DeBlock = dval;\r
288 \r
289                 thisQuery.DeTelecine = "Off";\r
290                 if (detelecine.Success)\r
291                 {\r
292                     thisQuery.DeTelecine = "Default";\r
293                     if (detelecineValue.Success)\r
294                         thisQuery.DeTelecine = detelecineValue.ToString().Replace("--detelecine=", "").Replace("\"", "");\r
295                 }\r
296 \r
297                 #endregion\r
298 \r
299                 #region Video Settings Tab\r
300 \r
301                 string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");\r
302                 switch (videoEncoderConvertion)\r
303                 {\r
304                     case "ffmpeg":\r
305                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
306                         break;\r
307                     case "x264":\r
308                         videoEncoderConvertion = "H.264 (x264)";\r
309                         break;\r
310                     case "theora":\r
311                         videoEncoderConvertion = "VP3 (Theora)";\r
312                         break;\r
313                     default:\r
314                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
315                         break;\r
316                 }\r
317                 thisQuery.VideoEncoder = videoEncoderConvertion;\r
318                 thisQuery.VideoFramerate = videoFramerate.Success ? videoFramerate.ToString().Replace("-r ", "") : "Same as source";\r
319                 thisQuery.Grayscale = grayscale.Success;\r
320                 thisQuery.TwoPass = twoPass.Success;\r
321                 thisQuery.TurboFirstPass = turboFirstPass.Success;\r
322 \r
323                 if (videoBitrate.Success)\r
324                     thisQuery.AverageVideoBitrate = videoBitrate.ToString().Replace("-b ", "");\r
325                 if (videoFilesize.Success)\r
326                     thisQuery.VideoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
327 \r
328                 if (videoQuality.Success)\r
329                 {\r
330                     float qConvert = float.Parse(videoQuality.ToString().Replace("-q ", ""), Culture);\r
331                     thisQuery.VideoQuality = qConvert;\r
332                 }\r
333                 #endregion\r
334 \r
335                 #region Audio Tab\r
336                 // Find out how many tracks we need to add by checking how many encoders or audio tracks are selected.\r
337                 int encoderCount = 0;\r
338                 if (audioEncoders.Success)\r
339                 {\r
340                     string[] audioDataCounters = audioEncoders.ToString().Replace("-E ", "").Split(',');\r
341                     encoderCount = audioDataCounters.Length;\r
342                 }\r
343 \r
344                 // Get the data from the regular expression results\r
345                 string[] trackData = null;\r
346                 string[] trackMixes = null;\r
347                 string[] trackEncoders = null;\r
348                 string[] trackBitrates = null;\r
349                 string[] trackSamplerates = null;\r
350                 string[] trackDRCvalues = null;\r
351 \r
352                 if (audioTracks.Success)\r
353                     trackData = audioTracks.ToString().Replace("-a ", "").Split(',');\r
354                 if (audioTrackMixes.Success)\r
355                     trackMixes = audioTrackMixes.ToString().Replace("-6 ", "").Split(',');\r
356                 if (audioEncoders.Success)\r
357                     trackEncoders = audioEncoders.ToString().Replace("-E ", "").Split(',');\r
358                 if (audioBitrates.Success)\r
359                     trackBitrates = audioBitrates.ToString().Replace("-B ", "").Split(',');\r
360                 if (audioSampleRates.Success)\r
361                     trackSamplerates = audioSampleRates.ToString().Replace("-R ", "").Split(',');\r
362                 if (drcValues.Success)\r
363                     trackDRCvalues = drcValues.ToString().Replace("-D ", "").Split(',');\r
364 \r
365                 // Create new Audio Track Classes and store them in the ArrayList\r
366                 ArrayList AllAudioTrackInfo = new ArrayList();\r
367                 for (int x = 0; x < encoderCount; x++)\r
368                 {\r
369                     AudioTrack track = new AudioTrack();\r
370                     if (trackData != null)\r
371                         if (trackData.Length >= (x + 1))                         // Audio Track\r
372                             track.Track = trackData[x].Trim();\r
373 \r
374                     if (trackMixes != null)\r
375                         if (trackMixes.Length >= (x + 1))                        // Audio Mix\r
376                             track.MixDown = getMixDown(trackMixes[x].Trim());\r
377 \r
378                     if (trackEncoders != null)\r
379                         if (trackEncoders.Length >= (x + 1))                     // Audio Mix\r
380                             track.Encoder = getAudioEncoder(trackEncoders[x].Trim());\r
381 \r
382                     if (trackBitrates != null)\r
383                         if (trackBitrates.Length >= (x + 1))                     // Audio Encoder\r
384                             track.Bitrate = trackBitrates[x].Trim() == "auto" ? "Auto" : trackBitrates[x].Trim();\r
385 \r
386                     if (trackSamplerates != null)\r
387                         if (trackSamplerates.Length >= (x + 1))                  // Audio SampleRate\r
388                             track.SampleRate = trackSamplerates[x].Trim() == "0" ? "Auto" : trackSamplerates[x].Trim();\r
389 \r
390                     if (trackDRCvalues != null)\r
391                         if (trackDRCvalues.Length >= (x + 1))                   // Audio DRC Values\r
392                             track.DRC = trackDRCvalues[x].Trim();\r
393 \r
394                     AllAudioTrackInfo.Add(track);\r
395                 }\r
396                 thisQuery.AudioInformation = AllAudioTrackInfo;\r
397 \r
398                 // Subtitle Stuff\r
399                 if (subtitles.Success)\r
400                     thisQuery.Subtitles = subtitles.ToString().Replace("-s ", "");\r
401                 else\r
402                     thisQuery.Subtitles = subScan.Success ? "Autoselect" : "None";\r
403 \r
404                 thisQuery.ForcedSubtitles = forcedSubtitles.Success;\r
405                 #endregion\r
406 \r
407                 #region Chapters Tab\r
408                 if (chapterMarkersFileMode.Success || chapterMarkers.Success)\r
409                     thisQuery.ChapterMarkers = true;\r
410                 #endregion\r
411 \r
412                 #region H.264 and other\r
413 \r
414                 if (x264.Success)\r
415                     thisQuery.H264Query = x264.ToString().Replace("-x ", "");\r
416 \r
417                 thisQuery.Verbose = verbose.Success;\r
418 \r
419                 #endregion\r
420             }\r
421             catch (Exception exc)\r
422             {\r
423                 MessageBox.Show(\r
424                     "An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" +\r
425                     exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
426             }\r
427 \r
428             #endregion\r
429 \r
430             return thisQuery;\r
431         }\r
432         private static string getMixDown(string mixdown)\r
433         {\r
434             switch (mixdown.Trim())\r
435             {\r
436                 case "mono":\r
437                     return "\83\82\83m\83\89\83\8b";\r
438                 case "stereo":\r
439                     return "\83X\83e\83\8c\83I";\r
440                 case "dpl1":\r
441                     return "Dolby Surround";\r
442                 case "dpl2":\r
443                     return "Dolby Pro Logic II";\r
444                 case "6ch":\r
445                     return "5.1ch\83T\83\89\83E\83\93\83h";\r
446                 default:\r
447                     return "\8e©\93®";\r
448             }\r
449         }\r
450         private static string getAudioEncoder(string audioEnc)\r
451         {\r
452             switch (audioEnc)\r
453             {\r
454                 case "faac":\r
455                     return "AAC (faac)";\r
456                 case "lame":\r
457                     return "MP3 (lame)";\r
458                 case "vorbis":\r
459                     return "Vorbis (vorbis)";\r
460                 case "ac3":\r
461                     return "AC3\83p\83X\83X\83\8b\81[";\r
462                 case "dts":\r
463                     return "DTS\83p\83X\83X\83\8b\81[";\r
464                 default:\r
465                     return "AAC (faac)";\r
466             }\r
467         }\r
468     }\r
469 \r
470     public class AudioTrack\r
471     {\r
472         public AudioTrack()\r
473         {\r
474             // Default Values\r
475             Track = "\8e©\93®";\r
476             MixDown = "\8e©\93®";\r
477             SampleRate = "\8e©\93®";\r
478             Bitrate = "\8e©\93®";\r
479             DRC = "1";\r
480         }\r
481         public string Track { get; set; }\r
482         public string MixDown { get; set; }\r
483         public string Encoder { get; set; }\r
484         public string Bitrate { get; set; }\r
485         public string SampleRate { get; set; }\r
486         public string DRC { get; set; }\r
487     }\r
488 }