OSDN Git Service

f189e1bbc40056c0c5808e483f64662870a61589
[handbrake-jp/handbrake-jp-git.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 \r
12 namespace Handbrake.Functions\r
13 {\r
14     internal class QueryParser\r
15     {\r
16         private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
17 \r
18         #region Varibles\r
19 \r
20         #region Source\r
21 \r
22         private int q_chaptersFinish;\r
23         private int q_chaptersStart;\r
24         private int q_dvdTitle;\r
25 \r
26         /// <summary>\r
27         /// Returns an Integer\r
28         /// DVD Title number.\r
29         /// </summary>\r
30         public int DVDTitle\r
31         {\r
32             get { return q_dvdTitle; }\r
33         }\r
34 \r
35         /// <summary>\r
36         /// Returns an Int\r
37         /// DVD Chapter number or chapter range.\r
38         /// </summary>\r
39         public int DVDChapterStart\r
40         {\r
41             get { return q_chaptersStart; }\r
42         }\r
43 \r
44         /// <summary>\r
45         /// Returns an Int\r
46         /// DVD Chapter number or chapter range.\r
47         /// </summary>\r
48         public int DVDChapterFinish\r
49         {\r
50             get { return q_chaptersFinish; }\r
51         }\r
52 \r
53         #endregion\r
54 \r
55         #region Destination\r
56 \r
57         private string q_format;\r
58         private string q_videoEncoder;\r
59 \r
60         /// <summary>\r
61         /// Returns a String \r
62         /// Full path of the destination.\r
63         /// </summary>\r
64         public string Format\r
65         {\r
66             get { return q_format; }\r
67         }\r
68 \r
69         /// <summary>\r
70         /// Returns an String\r
71         /// The Video Encoder used.\r
72         /// </summary>\r
73         public string VideoEncoder\r
74         {\r
75             get { return q_videoEncoder; }\r
76         }\r
77 \r
78         #endregion\r
79 \r
80         #region Picture Settings\r
81 \r
82         private Boolean q_anamorphic;\r
83         private Boolean q_chapterMarkers;\r
84         private string q_cropbottom;\r
85         private string q_cropLeft;\r
86         private string q_cropRight;\r
87         private string q_croptop;\r
88         private string q_cropValues;\r
89         private int q_deBlock;\r
90         private Boolean q_decomb;\r
91         private string q_deinterlace;\r
92         private string q_denoise;\r
93         private Boolean q_detelecine;\r
94         private Boolean q_looseAnamorphic;\r
95         private int q_maxHeight;\r
96         private int q_maxWidth;\r
97         private int q_videoHeight;\r
98         private int q_videoWidth;\r
99 \r
100         /// <summary>\r
101         /// Returns an Int\r
102         /// The selected Width for the encoding.\r
103         /// </summary>\r
104         public int Width\r
105         {\r
106             get { return q_videoWidth; }\r
107         }\r
108 \r
109         /// <summary>\r
110         /// Returns an Int\r
111         /// The selected Height for the encoding.\r
112         /// </summary>\r
113         public int Height\r
114         {\r
115             get { return q_videoHeight; }\r
116         }\r
117 \r
118         /// <summary>\r
119         /// Returns an Int\r
120         /// The selected Width for the encoding.\r
121         /// </summary>\r
122         public int MaxWidth\r
123         {\r
124             get { return q_maxWidth; }\r
125         }\r
126 \r
127         /// <summary>\r
128         /// Returns an Int\r
129         /// The selected Height for the encoding.\r
130         /// </summary>\r
131         public int MaxHeight\r
132         {\r
133             get { return q_maxHeight; }\r
134         }\r
135 \r
136         /// <summary>\r
137         /// Returns an String\r
138         /// Cropping values.\r
139         /// </summary>\r
140         public string CropValues\r
141         {\r
142             get { return q_cropValues; }\r
143         }\r
144 \r
145         /// <summary>\r
146         /// Returns an String\r
147         /// Cropping values.\r
148         /// </summary>\r
149         public string CropTop\r
150         {\r
151             get { return q_croptop; }\r
152         }\r
153 \r
154         /// <summary>\r
155         /// Returns an String\r
156         /// Cropping values.\r
157         /// </summary>\r
158         public string CropBottom\r
159         {\r
160             get { return q_cropbottom; }\r
161         }\r
162 \r
163         /// <summary>\r
164         /// Returns an String\r
165         /// Cropping values.\r
166         /// </summary>\r
167         public string CropLeft\r
168         {\r
169             get { return q_cropLeft; }\r
170         }\r
171 \r
172         /// <summary>\r
173         /// Returns an String\r
174         /// Cropping values.\r
175         /// </summary>\r
176         public string CropRight\r
177         {\r
178             get { return q_cropRight; }\r
179         }\r
180 \r
181         /// <summary>\r
182         /// Returns a boolean to indicate wither DeTelecine is on or off\r
183         /// </summary>\r
184         public Boolean DeTelecine\r
185         {\r
186             get { return q_detelecine; }\r
187         }\r
188 \r
189         /// <summary>\r
190         /// Returns a boolean to indicate wither DeBlock is on or off.\r
191         /// </summary>\r
192         public int DeBlock\r
193         {\r
194             get { return q_deBlock; }\r
195         }\r
196 \r
197         /// <summary>\r
198         /// Returns a string with the De-Interlace option used.\r
199         /// </summary>\r
200         public string DeInterlace\r
201         {\r
202             get { return q_deinterlace; }\r
203         }\r
204 \r
205         /// <summary>\r
206         /// Returns a string with the DeNoise option used.\r
207         /// </summary>\r
208         public string DeNoise\r
209         {\r
210             get { return q_denoise; }\r
211         }\r
212 \r
213         /// <summary>\r
214         /// Returns a string with the DeNoise option used.\r
215         /// </summary>\r
216         public Boolean Decomb\r
217         {\r
218             get { return q_decomb; }\r
219         }\r
220 \r
221         /// <summary>\r
222         /// Returns a boolean to indicate wither Anamorphic is on or off.\r
223         /// </summary>\r
224         public Boolean Anamorphic\r
225         {\r
226             get { return q_anamorphic; }\r
227         }\r
228 \r
229         /// <summary>\r
230         /// Returns a boolean to indicate wither Anamorphic is on or off.\r
231         /// </summary>\r
232         public Boolean LooseAnamorphic\r
233         {\r
234             get { return q_looseAnamorphic; }\r
235         }\r
236 \r
237         /// <summary>\r
238         /// Returns a boolean to indicate wither Chapter Markers is on or off.\r
239         /// </summary>\r
240         public Boolean ChapterMarkers\r
241         {\r
242             get { return q_chapterMarkers; }\r
243         }\r
244 \r
245         #endregion\r
246 \r
247         #region Video Settings\r
248 \r
249         private string q_avgBitrate;\r
250         private Boolean q_grayscale;\r
251         private Boolean q_ipodAtom;\r
252         private Boolean q_largeMp4;\r
253         private Boolean q_optimizeMp4;\r
254         private Boolean q_turboFirst;\r
255 \r
256         private Boolean q_twoPass;\r
257         private string q_videoFramerate;\r
258         private int q_videoQuality;\r
259         private string q_videoTargetSize;\r
260 \r
261         /// <summary>\r
262         /// Returns a boolean to indicate wither Grayscale is on or off.\r
263         /// </summary>\r
264         public Boolean Grayscale\r
265         {\r
266             get { return q_grayscale; }\r
267         }\r
268 \r
269         /// <summary>\r
270         /// Returns a boolean to indicate wither Two Pass Encoding is on or off.\r
271         /// </summary>\r
272         public Boolean TwoPass\r
273         {\r
274             get { return q_twoPass; }\r
275         }\r
276 \r
277         /// <summary>\r
278         /// Returns a boolean to indicate wither Chapter Markers is on or off.\r
279         /// </summary>\r
280         public Boolean TurboFirstPass\r
281         {\r
282             get { return q_turboFirst; }\r
283         }\r
284 \r
285         /// <summary>\r
286         /// Returns a boolean to indicate wither Larger MP4 files is on or off.\r
287         /// </summary>\r
288         public Boolean LargeMP4\r
289         {\r
290             get { return q_largeMp4; }\r
291         }\r
292 \r
293         /// <summary>\r
294         /// Returns a boolean to indicate wither Larger MP4 files is on or off.\r
295         /// </summary>\r
296         public Boolean IpodAtom\r
297         {\r
298             get { return q_ipodAtom; }\r
299         }\r
300 \r
301         /// <summary>\r
302         /// Returns a boolean to indicate wither Larger MP4 files is on or off.\r
303         /// </summary>\r
304         public Boolean OptimizeMP4\r
305         {\r
306             get { return q_optimizeMp4; }\r
307         }\r
308 \r
309         /// <summary>\r
310         /// Returns a string with the video Framerate\r
311         /// </summary>\r
312         public string VideoFramerate\r
313         {\r
314             get { return q_videoFramerate; }\r
315         }\r
316 \r
317         /// <summary>\r
318         /// Returns a string with the average video bitrate\r
319         /// </summary>\r
320         public string AverageVideoBitrate\r
321         {\r
322             get { return q_avgBitrate; }\r
323         }\r
324 \r
325         /// <summary>\r
326         /// Returns a string with the video target size\r
327         /// </summary>\r
328         public string VideoTargetSize\r
329         {\r
330             get { return q_videoTargetSize; }\r
331         }\r
332 \r
333         /// <summary>\r
334         /// Returns a int with the video quality value\r
335         /// </summary>\r
336         public int VideoQuality\r
337         {\r
338             get { return q_videoQuality; }\r
339         }\r
340 \r
341         #endregion\r
342 \r
343         #region Audio Settings\r
344 \r
345         private string q_audioBitrate1;\r
346         private string q_audioBitrate2;\r
347         private string q_audioBitrate3;\r
348         private string q_audioBitrate4;\r
349         private string q_audioEncoder1;\r
350         private string q_audioEncoder2;\r
351         private string q_audioEncoder3;\r
352         private string q_audioEncoder4;\r
353         private string q_audioSamplerate1;\r
354         private string q_audioSamplerate2;\r
355         private string q_audioSamplerate3;\r
356         private string q_audioSamplerate4;\r
357         private string q_audioTrack1;\r
358         private string q_audioTrack2;\r
359         private string q_audioTrack3;\r
360         private string q_audioTrack4;\r
361         private string q_audioTrackMix1;\r
362         private string q_audioTrackMix2;\r
363         private string q_audioTrackMix3;\r
364         private string q_audioTrackMix4;\r
365         private double q_drc1;\r
366         private double q_drc2;\r
367         private double q_drc3;\r
368         private double q_drc4;\r
369         private Boolean q_forcedSubs;\r
370         private string q_subtitles;\r
371 \r
372         /// <summary>\r
373         /// Returns a string with the selected Audio track\r
374         /// </summary>\r
375         public string AudioTrack1\r
376         {\r
377             get { return q_audioTrack1; }\r
378         }\r
379 \r
380         /// <summary>\r
381         /// Returns a string with the selected Audio track\r
382         /// </summary>\r
383         public string AudioTrack2\r
384         {\r
385             get { return q_audioTrack2; }\r
386         }\r
387 \r
388         /// <summary>\r
389         /// Returns a string with the selected Audio track\r
390         /// </summary>\r
391         public string AudioTrack3\r
392         {\r
393             get { return q_audioTrack3; }\r
394         }\r
395 \r
396         /// <summary>\r
397         /// Returns a string with the selected Audio track\r
398         /// </summary>\r
399         public string AudioTrack4\r
400         {\r
401             get { return q_audioTrack4; }\r
402         }\r
403 \r
404         /// <summary>\r
405         /// Returns a string with the First selected Audio track Mix\r
406         /// </summary>\r
407         public string AudioTrackMix1\r
408         {\r
409             get { return q_audioTrackMix1; }\r
410         }\r
411 \r
412         /// <summary>\r
413         /// Returns a string with the First selected Audio track Mix\r
414         /// </summary>\r
415         public string AudioTrackMix2\r
416         {\r
417             get { return q_audioTrackMix2; }\r
418         }\r
419 \r
420         /// <summary>\r
421         /// Returns a string with the First selected Audio track Mix\r
422         /// </summary>\r
423         public string AudioTrackMix3\r
424         {\r
425             get { return q_audioTrackMix3; }\r
426         }\r
427 \r
428         /// <summary>\r
429         /// Returns a string with the First selected Audio track Mix\r
430         /// </summary>\r
431         public string AudioTrackMix4\r
432         {\r
433             get { return q_audioTrackMix4; }\r
434         }\r
435 \r
436         /// <summary>\r
437         /// Returns an String\r
438         /// The Audio Encoder used.\r
439         /// </summary>\r
440         public string AudioEncoder1\r
441         {\r
442             get { return q_audioEncoder1; }\r
443         }\r
444 \r
445         /// <summary>\r
446         /// Returns an String\r
447         /// The Audio Encoder used.\r
448         /// </summary>\r
449         public string AudioEncoder2\r
450         {\r
451             get { return q_audioEncoder2; }\r
452         }\r
453 \r
454         /// <summary>\r
455         /// Returns an String\r
456         /// The Audio Encoder used.\r
457         /// </summary>\r
458         public string AudioEncoder3\r
459         {\r
460             get { return q_audioEncoder3; }\r
461         }\r
462 \r
463         /// <summary>\r
464         /// Returns an String\r
465         /// The Audio Encoder used.\r
466         /// </summary>\r
467         public string AudioEncoder4\r
468         {\r
469             get { return q_audioEncoder4; }\r
470         }\r
471 \r
472         /// <summary>\r
473         /// Returns a string with the audio bitrate\r
474         /// </summary>\r
475         public string AudioBitrate1\r
476         {\r
477             get { return q_audioBitrate1; }\r
478         }\r
479 \r
480         /// <summary>\r
481         /// Returns a string with the audio bitrate\r
482         /// </summary>\r
483         public string AudioBitrate2\r
484         {\r
485             get { return q_audioBitrate2; }\r
486         }\r
487 \r
488         /// <summary>\r
489         /// Returns a string with the audio bitrate\r
490         /// </summary>\r
491         public string AudioBitrate3\r
492         {\r
493             get { return q_audioBitrate3; }\r
494         }\r
495 \r
496         /// <summary>\r
497         /// Returns a string with the audio bitrate\r
498         /// </summary>\r
499         public string AudioBitrate4\r
500         {\r
501             get { return q_audioBitrate4; }\r
502         }\r
503 \r
504         /// <summary>\r
505         /// Returns a string with the audio sample rate\r
506         /// </summary>\r
507         public string AudioSamplerate1\r
508         {\r
509             get { return q_audioSamplerate1; }\r
510         }\r
511 \r
512         /// <summary>\r
513         /// Returns a string with the audio sample rate\r
514         /// </summary>\r
515         public string AudioSamplerate2\r
516         {\r
517             get { return q_audioSamplerate2; }\r
518         }\r
519 \r
520         /// <summary>\r
521         /// Returns a string with the audio sample rate\r
522         /// </summary>\r
523         public string AudioSamplerate3\r
524         {\r
525             get { return q_audioSamplerate3; }\r
526         }\r
527 \r
528         /// <summary>\r
529         /// Returns a string with the audio sample rate\r
530         /// </summary>\r
531         public string AudioSamplerate4\r
532         {\r
533             get { return q_audioSamplerate4; }\r
534         }\r
535 \r
536         /// <summary>\r
537         /// Returns a string with the selected subtitle track\r
538         /// </summary>\r
539         public double DRC1\r
540         {\r
541             get { return q_drc1; }\r
542         }\r
543 \r
544         /// <summary>\r
545         /// Returns a string with the selected subtitle track\r
546         /// </summary>\r
547         public double DRC2\r
548         {\r
549             get { return q_drc2; }\r
550         }\r
551 \r
552         /// <summary>\r
553         /// Returns a string with the selected subtitle track\r
554         /// </summary>\r
555         public double DRC3\r
556         {\r
557             get { return q_drc3; }\r
558         }\r
559 \r
560         /// <summary>\r
561         /// Returns a string with the selected subtitle track\r
562         /// </summary>\r
563         public double DRC4\r
564         {\r
565             get { return q_drc4; }\r
566         }\r
567 \r
568         /// <summary>\r
569         /// Returns a string with the selected subtitle track\r
570         /// </summary>\r
571         public string Subtitles\r
572         {\r
573             get { return q_subtitles; }\r
574         }\r
575 \r
576         /// <summary>\r
577         /// Returns a string with the selected subtitle track\r
578         /// </summary>\r
579         public Boolean ForcedSubtitles\r
580         {\r
581             get { return q_forcedSubs; }\r
582         }\r
583 \r
584         #endregion\r
585 \r
586         #region Other\r
587 \r
588         private string q_h264;\r
589         private Boolean q_verbose;\r
590 \r
591         /// <summary>\r
592         /// Returns a string with the Advanced H264 query string\r
593         /// </summary>\r
594         public string H264Query\r
595         {\r
596             get { return q_h264; }\r
597         }\r
598 \r
599         /// <summary>\r
600         /// Returns a string with the Advanced H264 query string\r
601         /// </summary>\r
602         public Boolean Verbose\r
603         {\r
604             get { return q_verbose; }\r
605         }\r
606 \r
607         #endregion\r
608 \r
609         #endregion\r
610 \r
611         // All the Main Window GUI options\r
612 \r
613         /// <summary>\r
614         /// Takes in a query which can be in any order and parses it. \r
615         /// All varibles are then set so they can be used elsewhere.\r
616         /// </summary>\r
617         /// <param name="input">A ClI Query</param>\r
618         /// <returns>A Parsed Query</returns>\r
619         public static QueryParser Parse(String input)\r
620         {\r
621             var thisQuery = new QueryParser();\r
622 \r
623             #region Regular Expressions\r
624 \r
625             // Useful Destination Finder\r
626             //Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9?';!^%&*()_\-:\\\s\.]+)(?:\"")");\r
627             //Match source = r1.Match(input.Replace('"', '\"'));\r
628 \r
629             //Source\r
630             Match title = Regex.Match(input, @"-t ([0-9]*)");\r
631             Match chapters = Regex.Match(input, @"-c ([0-9-]*)");\r
632             Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");\r
633 \r
634             //Destination\r
635             Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");\r
636 \r
637             //Picture Settings Tab\r
638             Match width = Regex.Match(input, @"-w ([0-9]*)");\r
639             Match height = Regex.Match(input, @"-l ([0-9]*)");\r
640             Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");\r
641             Match maxHeight = Regex.Match(input, @"-Y ([0-9]*)");\r
642             Match deinterlace = Regex.Match(input, @"--deinterlace=\""([a-zA-Z]*)\""");\r
643             Match denoise = Regex.Match(input, @"--denoise=\""([a-zA-Z]*)\""");\r
644             Match deblock = Regex.Match(input, @"--deblock=([0-9]*)");\r
645             Match detelecine = Regex.Match(input, @"--detelecine");\r
646             Match anamorphic = Regex.Match(input, @" -p ");\r
647             Match chapterMarkers = Regex.Match(input, @" -m");\r
648             Match chapterMarkersFileMode = Regex.Match(input, @"--markers");\r
649             Match crop = Regex.Match(input, @"--crop ([0-9]*):([0-9]*):([0-9]*):([0-9]*)");\r
650             Match lanamorphic = Regex.Match(input, @" -P");\r
651             Match decomb = Regex.Match(input, @" --decomb");\r
652 \r
653             //Video Settings Tab\r
654             Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");\r
655             Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");\r
656             Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");\r
657             Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");\r
658             Match twoPass = Regex.Match(input, @" -2");\r
659             Match turboFirstPass = Regex.Match(input, @" -T");\r
660             Match grayscale = Regex.Match(input, @" -g");\r
661             Match largerMp4 = Regex.Match(input, @" -4");\r
662             Match ipodAtom = Regex.Match(input, @" -I");\r
663             Match optimizeMP4 = Regex.Match(input, @" -O");\r
664 \r
665             //Audio Settings Tab\r
666             Match noAudio = Regex.Match(input, @"-a none");\r
667             Match audioTrack1 = Regex.Match(input, @"-a ([0-9]*)");\r
668             Match audioTrack2 = Regex.Match(input, @"-a ([0-9]*),([0-9]*)");\r
669             Match audioTrack3 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*)");\r
670             Match audioTrack4 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*),([0-9]*)");\r
671 \r
672             Match audioTrack1Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)");\r
673             Match audioTrack2Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
674             Match audioTrack3Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
675             Match audioTrack4Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
676 \r
677             Match audioEncoder1 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*)");\r
678             Match audioEncoder2 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
679             Match audioEncoder3 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
680             Match audioEncoder4 = Regex.Match(input,\r
681                                               @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
682 \r
683             Match audioBitrate1 = Regex.Match(input, @"-B ([0-9auto]*)");\r
684             Match audioBitrate2 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*)");\r
685             Match audioBitrate3 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*),([0-9auto]*)");\r
686             Match audioBitrate4 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*),([0-9auto]*),([0-9auto]*)");\r
687 \r
688             Match audioSampleRate1 = Regex.Match(input, @"-R ([0-9Auto.]*)");\r
689             Match audioSampleRate2 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*)");\r
690             Match audioSampleRate3 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*)");\r
691             Match audioSampleRate4 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*)");\r
692 \r
693             Match drc1 = Regex.Match(input, @"-D ([0-9.]*)");\r
694             Match drc2 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*)");\r
695             Match drc3 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*),([0-9.]*)");\r
696             Match drc4 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*),([0-9.]*),([0-9.]*)");\r
697 \r
698             Match subtitles = Regex.Match(input, @"-s ([0-9a-zA-Z]*)");\r
699             Match subScan = Regex.Match(input, @" -U");\r
700             Match forcedSubtitles = Regex.Match(input, @" -F");\r
701 \r
702             //H264 Tab\r
703             Match x264 = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");\r
704 \r
705             //Program Options\r
706             Match verbose = Regex.Match(input, @" -v");\r
707 \r
708             #endregion\r
709 \r
710             #region Set Varibles\r
711 \r
712             try\r
713             {\r
714                 #region Source Tab\r
715 \r
716                 if (title.Success)\r
717                     thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));\r
718 \r
719                 if (chapters.Success)\r
720                 {\r
721                     string[] actTitles = chapters.ToString().Replace("-c ", "").Split('-');\r
722                     thisQuery.q_chaptersStart = int.Parse(actTitles[0]);\r
723                     if (actTitles.Length > 1)\r
724                     {\r
725                         thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);\r
726                     }\r
727 \r
728                     if ((thisQuery.q_chaptersStart == 1) && (thisQuery.q_chaptersFinish == 0))\r
729                         thisQuery.q_chaptersFinish = thisQuery.q_chaptersStart;\r
730                 }\r
731 \r
732                 if (format.Success)\r
733                     thisQuery.q_format = format.ToString().Replace("-f ", "");\r
734 \r
735                 #endregion\r
736 \r
737                 #region Destination\r
738 \r
739                 string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");\r
740                 switch (videoEncoderConvertion)\r
741                 {\r
742                     case "ffmpeg":\r
743                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
744                         break;\r
745                     case "xvid":\r
746                         videoEncoderConvertion = "MPEG-4 (XviD)";\r
747                         break;\r
748                     case "x264":\r
749                         videoEncoderConvertion = "H.264 (x264)";\r
750                         break;\r
751                     case "theora":\r
752                         videoEncoderConvertion = "VP3 (Theora)";\r
753                         break;\r
754                     default:\r
755                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
756                         break;\r
757                 }\r
758                 thisQuery.q_videoEncoder = videoEncoderConvertion;\r
759 \r
760                 #endregion\r
761 \r
762                 #region Picture Tab\r
763 \r
764                 if (width.Success)\r
765                     thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));\r
766 \r
767                 if (height.Success)\r
768                     thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));\r
769 \r
770                 if (maxWidth.Success)\r
771                     thisQuery.q_maxWidth = int.Parse(maxWidth.ToString().Replace("-X ", ""));\r
772 \r
773                 if (maxHeight.Success)\r
774                     thisQuery.q_maxHeight = int.Parse(maxHeight.ToString().Replace("-Y ", ""));\r
775 \r
776                 if (crop.Success)\r
777                 {\r
778                     thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");\r
779                     string[] actCropValues = thisQuery.q_cropValues.Split(':');\r
780                     thisQuery.q_croptop = actCropValues[0];\r
781                     thisQuery.q_cropbottom = actCropValues[1];\r
782                     thisQuery.q_cropLeft = actCropValues[2];\r
783                     thisQuery.q_cropRight = actCropValues[3];\r
784                 }\r
785 \r
786                 // Deblock Slider\r
787                 string deblockValue = "";\r
788                 thisQuery.q_deBlock = 0;\r
789                 if (deblock.Success)\r
790                     deblockValue = deblock.ToString().Replace("--deblock=", "");\r
791 \r
792                 if (deblockValue != "")\r
793                     int.TryParse(deblockValue, out thisQuery.q_deBlock);\r
794 \r
795                 thisQuery.q_detelecine = detelecine.Success;\r
796                 thisQuery.q_decomb = decomb.Success;\r
797 \r
798                 thisQuery.q_deinterlace = "None";\r
799                 if (deinterlace.Success)\r
800                 {\r
801                     switch (deinterlace.ToString().Replace("--deinterlace=", "").Replace("\"", ""))\r
802                     {\r
803                         case "fast":\r
804                             thisQuery.q_deinterlace = "Fast";\r
805                             break;\r
806                         case "slow":\r
807                             thisQuery.q_deinterlace = "Slow";\r
808                             break;\r
809                         case "slower":\r
810                             thisQuery.q_deinterlace = "Slower";\r
811                             break;\r
812                         case "slowest":\r
813                             thisQuery.q_deinterlace = "Slowest";\r
814                             break;\r
815                         default:\r
816                             thisQuery.q_deinterlace = "None";\r
817                             break;\r
818                     }\r
819                 }\r
820 \r
821                 thisQuery.q_denoise = "None";\r
822                 if (denoise.Success)\r
823                 {\r
824                     switch (denoise.ToString().Replace("--denoise=", "").Replace("\"", ""))\r
825                     {\r
826                         case "weak":\r
827                             thisQuery.q_denoise = "Weak";\r
828                             break;\r
829                         case "medium":\r
830                             thisQuery.q_denoise = "Medium";\r
831                             break;\r
832                         case "strong":\r
833                             thisQuery.q_denoise = "Strong";\r
834                             break;\r
835                         default:\r
836                             thisQuery.q_denoise = "None";\r
837                             break;\r
838                     }\r
839                 }\r
840                 thisQuery.q_anamorphic = anamorphic.Success;\r
841                 if (chapterMarkersFileMode.Success || chapterMarkers.Success)\r
842                     thisQuery.q_chapterMarkers = true;\r
843 \r
844                 thisQuery.q_looseAnamorphic = lanamorphic.Success;\r
845 \r
846                 #endregion\r
847 \r
848                 #region Video Settings Tab\r
849 \r
850                 thisQuery.q_grayscale = grayscale.Success;\r
851                 thisQuery.q_twoPass = twoPass.Success;\r
852                 thisQuery.q_turboFirst = turboFirstPass.Success;\r
853                 thisQuery.q_largeMp4 = largerMp4.Success;\r
854                 thisQuery.q_videoFramerate = videoFramerate.Success ? videoFramerate.ToString().Replace("-r ", "") : "Same as source";\r
855 \r
856                 if (videoBitrate.Success)\r
857                     thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");\r
858                 if (videoFilesize.Success)\r
859                     thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
860 \r
861                 double qConvert;\r
862                 if (videoQuality.Success)\r
863                 {\r
864                     qConvert = double.Parse(videoQuality.ToString().Replace("-q ", ""), Culture)*100;\r
865                     qConvert = Math.Ceiling(qConvert);\r
866                     thisQuery.q_videoQuality = int.Parse(qConvert.ToString());\r
867                 }\r
868                 thisQuery.q_ipodAtom = ipodAtom.Success;\r
869                 thisQuery.q_optimizeMp4 = optimizeMP4.Success;\r
870 \r
871                 #endregion\r
872 \r
873                 #region Audio Tab\r
874 \r
875                 // Tracks\r
876                 if (noAudio.Success)\r
877                     thisQuery.q_audioTrack1 = "None";\r
878                 else if (audioTrack1.Success)\r
879                     thisQuery.q_audioTrack1 = "Automatic";\r
880 \r
881                 if (audioTrack2.Success)\r
882                 {\r
883                     string[] audioChan = audioTrack2.ToString().Split(',');\r
884                     thisQuery.q_audioTrack2 = audioChan[1];\r
885                 }\r
886                 else\r
887                     thisQuery.q_audioTrack2 = "None";\r
888 \r
889                 if (audioTrack3.Success)\r
890                 {\r
891                     string[] audioChan = audioTrack3.ToString().Split(',');\r
892                     thisQuery.q_audioTrack3 = audioChan[2];\r
893                 }\r
894                 else\r
895                     thisQuery.q_audioTrack3 = "None";\r
896 \r
897                 if (audioTrack4.Success)\r
898                 {\r
899                     string[] audioChan = audioTrack4.ToString().Split(',');\r
900                     thisQuery.q_audioTrack4 = audioChan[3];\r
901                 }\r
902                 else\r
903                     thisQuery.q_audioTrack4 = "None";\r
904 \r
905 \r
906                 // Mixdowns\r
907                 thisQuery.q_audioTrackMix1 = "Automatic";\r
908                 if (audioTrack1Mix.Success)\r
909                     thisQuery.q_audioTrackMix1 =\r
910                         getMixDown(audioTrack1Mix.ToString().Replace("-6 ", "").Replace(" ", ""));\r
911 \r
912                 thisQuery.q_audioTrackMix2 = "Automatic";\r
913                 if (audioTrack2Mix.Success)\r
914                 {\r
915                     string[] audio2mix = audioTrack2Mix.ToString().Split(',');\r
916                     thisQuery.q_audioTrackMix2 = getMixDown(audio2mix[1].Trim());\r
917                 }\r
918 \r
919                 thisQuery.q_audioTrackMix3 = "Automatic";\r
920                 if (audioTrack3Mix.Success)\r
921                 {\r
922                     string[] audio3mix = audioTrack3Mix.ToString().Split(',');\r
923                     thisQuery.q_audioTrackMix3 = getMixDown(audio3mix[2].Trim());\r
924                 }\r
925 \r
926                 thisQuery.q_audioTrackMix4 = "Automatic";\r
927                 if (audioTrack4Mix.Success)\r
928                 {\r
929                     string[] audio4mix = audioTrack4Mix.ToString().Split(',');\r
930                     thisQuery.q_audioTrackMix4 = getMixDown(audio4mix[3].Trim());\r
931                 }\r
932 \r
933 \r
934                 // Audio Encoders\r
935                 if (audioEncoder1.Success)\r
936                     thisQuery.q_audioEncoder1 = getAudioEncoder(audioEncoder1.ToString().Replace("-E ", ""));\r
937 \r
938                 if (audioEncoder2.Success)\r
939                 {\r
940                     string[] audio2enc = audioEncoder2.ToString().Split(',');\r
941                     thisQuery.q_audioEncoder2 = getAudioEncoder(audio2enc[1].Trim());\r
942                 }\r
943 \r
944                 if (audioEncoder3.Success)\r
945                 {\r
946                     string[] audio3enc = audioEncoder3.ToString().Split(',');\r
947                     thisQuery.q_audioEncoder3 = getAudioEncoder(audio3enc[2].Trim());\r
948                 }\r
949 \r
950                 if (audioEncoder4.Success)\r
951                 {\r
952                     string[] audio4enc = audioEncoder4.ToString().Split(',');\r
953                     thisQuery.q_audioEncoder4 = getAudioEncoder(audio4enc[3].Trim());\r
954                 }\r
955 \r
956 \r
957                 // Audio Bitrate\r
958                 thisQuery.q_audioBitrate1 = "";\r
959                 if (audioBitrate1.Success)\r
960                 {\r
961                     thisQuery.q_audioBitrate1 = audioBitrate1.ToString().Replace("-B ", "").Trim();\r
962                     if (audioBitrate1.ToString().Replace("-B ", "").Trim() == "0") thisQuery.q_audioBitrate1 = "Auto";\r
963                 }\r
964 \r
965                 thisQuery.q_audioBitrate2 = "";\r
966                 if (audioBitrate2.Success && audioTrack2.Success)\r
967                 {\r
968                     string[] audioBitrateSelect = audioBitrate2.ToString().Split(',');\r
969                     if (audioBitrateSelect[1].Trim() == "0") audioBitrateSelect[1] = "Auto";\r
970                     thisQuery.q_audioBitrate2 = audioBitrateSelect[1].Trim();\r
971                 }\r
972 \r
973                 thisQuery.q_audioBitrate3 = "";\r
974                 if (audioBitrate3.Success && audioTrack3.Success)\r
975                 {\r
976                     string[] audioBitrateSelect = audioBitrate3.ToString().Split(',');\r
977                     if (audioBitrateSelect[2].Trim() == "0") audioBitrateSelect[2] = "Auto";\r
978                     thisQuery.q_audioBitrate3 = audioBitrateSelect[2].Trim();\r
979                 }\r
980 \r
981                 thisQuery.q_audioBitrate4 = "";\r
982                 if (audioBitrate4.Success)\r
983                 {\r
984                     string[] audioBitrateSelect = audioBitrate4.ToString().Split(',');\r
985                     if (audioBitrateSelect[3].Trim() == "0") audioBitrateSelect[3] = "Auto";\r
986                     thisQuery.q_audioBitrate4 = audioBitrateSelect[3].Trim();\r
987                 }\r
988 \r
989 \r
990                 // Audio Sample Rate\r
991                 // Make sure to change 0 to Auto\r
992                 thisQuery.q_audioSamplerate1 = "Auto";\r
993                 if (audioSampleRate1.Success)\r
994                 {\r
995                     thisQuery.q_audioSamplerate1 = audioSampleRate1.ToString().Replace("-R ", "").Trim();\r
996                     if (thisQuery.q_audioSamplerate1 == "0") thisQuery.q_audioSamplerate1 = "Auto";\r
997                 }\r
998 \r
999 \r
1000                 if (audioSampleRate2.Success)\r
1001                 {\r
1002                     string[] audioSRSelect = audioSampleRate2.ToString().Split(',');\r
1003                     if (audioSRSelect[1] == "0") audioSRSelect[1] = "Auto";\r
1004                     thisQuery.q_audioSamplerate2 = audioSRSelect[1].Trim();\r
1005                 }\r
1006 \r
1007                 if (audioSampleRate3.Success)\r
1008                 {\r
1009                     string[] audioSRSelect = audioSampleRate3.ToString().Split(',');\r
1010                     if (audioSRSelect[2] == "0") audioSRSelect[2] = "Auto";\r
1011                     thisQuery.q_audioSamplerate3 = audioSRSelect[2].Trim();\r
1012                 }\r
1013 \r
1014                 if (audioSampleRate4.Success)\r
1015                 {\r
1016                     string[] audioSRSelect = audioSampleRate4.ToString().Split(',');\r
1017                     if (audioSRSelect[3] == "0") audioSRSelect[3] = "Auto";\r
1018                     thisQuery.q_audioSamplerate4 = audioSRSelect[3].Trim();\r
1019                 }\r
1020 \r
1021                 // DRC\r
1022                 float drcValue;\r
1023 \r
1024                 thisQuery.q_drc1 = 1;\r
1025                 if (drc1.Success)\r
1026                 {\r
1027                     string value = drc1.ToString().Replace("-D ", "");\r
1028                     float.TryParse(value, out drcValue);\r
1029                     thisQuery.q_drc1 = drcValue;\r
1030                 }\r
1031 \r
1032                 thisQuery.q_drc2 = 1;\r
1033                 if (drc2.Success)\r
1034                 {\r
1035                     string[] drcPoint = drc2.ToString().Split(',');\r
1036                     float.TryParse(drcPoint[1], out drcValue);\r
1037                     thisQuery.q_drc2 = drcValue;\r
1038                 }\r
1039 \r
1040                 thisQuery.q_drc3 = 1;\r
1041                 if (drc3.Success)\r
1042                 {\r
1043                     string[] drcPoint = drc3.ToString().Split(',');\r
1044                     float.TryParse(drcPoint[2], out drcValue);\r
1045                     thisQuery.q_drc3 = drcValue;\r
1046                 }\r
1047 \r
1048                 thisQuery.q_drc4 = 1;\r
1049                 if (drc4.Success)\r
1050                 {\r
1051                     string[] drcPoint = drc4.ToString().Split(',');\r
1052                     float.TryParse(drcPoint[3], out drcValue);\r
1053                     thisQuery.q_drc4 = drcValue;\r
1054                 }\r
1055 \r
1056                 // Subtitle Stuff\r
1057                 if (subtitles.Success)\r
1058                     thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");\r
1059                 else\r
1060                 {\r
1061                     if (subScan.Success)\r
1062                         thisQuery.q_subtitles = "Autoselect";\r
1063                     else\r
1064                         thisQuery.q_subtitles = "None";\r
1065                 }\r
1066 \r
1067                 thisQuery.q_forcedSubs = forcedSubtitles.Success;\r
1068 \r
1069                 #endregion\r
1070 \r
1071                 #region H.264 and other\r
1072 \r
1073                 //\r
1074                 //H264 Tab\r
1075                 //\r
1076                 if (x264.Success)\r
1077                     thisQuery.q_h264 = x264.ToString().Replace("-x ", "");\r
1078 \r
1079                 //\r
1080                 //Progam Options\r
1081                 //\r
1082                 thisQuery.q_verbose = verbose.Success;\r
1083 \r
1084                 #endregion\r
1085             }\r
1086             catch (Exception exc)\r
1087             {\r
1088                 MessageBox.Show(\r
1089                     "An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" +\r
1090                     exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1091             }\r
1092 \r
1093             #endregion\r
1094 \r
1095             return thisQuery;\r
1096         }\r
1097 \r
1098         private static string getMixDown(string mixdown)\r
1099         {\r
1100             switch (mixdown)\r
1101             {\r
1102                 case "mono":\r
1103                     return "Mono";\r
1104                 case "stereo":\r
1105                     return "Stereo";\r
1106                 case "dpl1":\r
1107                     return "Dolby Surround";\r
1108                 case "dpl2":\r
1109                     return "Dolby Pro Logic II";\r
1110                 case "6ch":\r
1111                     return "6 Channel Discrete";\r
1112                 default:\r
1113                     return "Automatic";\r
1114             }\r
1115         }\r
1116 \r
1117         private static string getAudioEncoder(string audioEnc)\r
1118         {\r
1119             switch (audioEnc)\r
1120             {\r
1121                 case "faac":\r
1122                     return "AAC";\r
1123                 case "lame":\r
1124                     return "MP3";\r
1125                 case "vorbis":\r
1126                     return "Vorbis";\r
1127                 case "ac3":\r
1128                     return "AC3";\r
1129                 default:\r
1130                     return "AAC";\r
1131             }\r
1132         }\r
1133     }\r
1134 }