OSDN Git Service

WinGui:
[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 string q_decomb;\r
91         private string q_deinterlace;\r
92         private string q_denoise;\r
93         private string 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 string 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 string 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 float 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 float 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         /// <summary>\r
613         /// Takes in a query which can be in any order and parses it. \r
614         /// All varibles are then set so they can be used elsewhere.\r
615         /// </summary>\r
616         /// <param name="input">A ClI Query</param>\r
617         /// <returns>A Parsed Query</returns>\r
618         public static QueryParser Parse(String input)\r
619         {\r
620             var thisQuery = new QueryParser();\r
621 \r
622             #region Regular Expressions\r
623 \r
624             // Useful Destination Finder\r
625             //Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9?';!^%&*()_\-:\\\s\.]+)(?:\"")");\r
626             //Match source = r1.Match(input.Replace('"', '\"'));\r
627 \r
628             //Source\r
629             Match title = Regex.Match(input, @"-t ([0-9]*)");\r
630             Match chapters = Regex.Match(input, @"-c ([0-9-]*)");\r
631            \r
632             //Output Settings\r
633             Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");\r
634             Match grayscale = Regex.Match(input, @" -g");\r
635             Match largerMp4 = Regex.Match(input, @" -4");\r
636             Match ipodAtom = Regex.Match(input, @" -I");\r
637 \r
638             //Picture Settings Tab\r
639             Match width = Regex.Match(input, @"-w ([0-9]*)");\r
640             Match height = Regex.Match(input, @"-l ([0-9]*)");\r
641             Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");\r
642             Match maxHeight = Regex.Match(input, @"-Y ([0-9]*)");\r
643             Match crop = Regex.Match(input, @"--crop ([0-9]*):([0-9]*):([0-9]*):([0-9]*)");\r
644             Match lanamorphic = Regex.Match(input, @" -P");\r
645             Match anamorphic = Regex.Match(input, @" -p ");\r
646 \r
647             // Picture Settings - Filters\r
648             Match decomb = Regex.Match(input, @" --decomb");\r
649             Match decombValue = Regex.Match(input, @" --decomb=\""([a-zA-Z0-9.:]*)\""");\r
650             Match deinterlace = Regex.Match(input, @"--deinterlace=\""([a-zA-Z0-9.:]*)\""");\r
651             Match denoise = Regex.Match(input, @"--denoise=\""([a-zA-Z0-9.:]*)\""");\r
652             Match deblock = Regex.Match(input, @"--deblock=([0-9:]*)");\r
653             Match detelecine = Regex.Match(input, @"--detelecine");\r
654             Match detelecineValue = Regex.Match(input, @" --detelecine=\""([a-zA-Z0-9.:]*)\""");\r
655 \r
656             //Video Settings Tab\r
657             Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");\r
658             Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");\r
659             Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");\r
660             Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");\r
661             Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");\r
662             Match twoPass = Regex.Match(input, @" -2");\r
663             Match turboFirstPass = Regex.Match(input, @" -T");\r
664             Match optimizeMP4 = Regex.Match(input, @" -O");\r
665 \r
666             //Audio Settings Tab\r
667             Match noAudio = Regex.Match(input, @"-a none");\r
668             Match audioTrack1 = Regex.Match(input, @"-a ([0-9]*)");\r
669             Match audioTrack2 = Regex.Match(input, @"-a ([0-9]*),([0-9]*)");\r
670             Match audioTrack3 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*)");\r
671             Match audioTrack4 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*),([0-9]*)");\r
672 \r
673             Match audioTrack1Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)");\r
674             Match audioTrack2Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
675             Match audioTrack3Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
676             Match audioTrack4Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
677 \r
678             Match audioEncoder1 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*)");\r
679             Match audioEncoder2 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
680             Match audioEncoder3 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
681             Match audioEncoder4 = Regex.Match(input, @"-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             // Chapters Tab\r
703             Match chapterMarkers = Regex.Match(input, @" -m");\r
704             Match chapterMarkersFileMode = Regex.Match(input, @"--markers");\r
705 \r
706             //H264 Tab\r
707             Match x264 = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");\r
708 \r
709             //Program Options\r
710             Match verbose = Regex.Match(input, @" -v");\r
711 \r
712             #endregion\r
713 \r
714             #region Set Varibles\r
715 \r
716             try\r
717             {\r
718                 #region Source Tab\r
719 \r
720                 if (title.Success)\r
721                     thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));\r
722 \r
723                 if (chapters.Success)\r
724                 {\r
725                     string[] actTitles = chapters.ToString().Replace("-c ", "").Split('-');\r
726                     thisQuery.q_chaptersStart = int.Parse(actTitles[0]);\r
727                     if (actTitles.Length > 1)\r
728                     {\r
729                         thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);\r
730                     }\r
731 \r
732                     if ((thisQuery.q_chaptersStart == 1) && (thisQuery.q_chaptersFinish == 0))\r
733                         thisQuery.q_chaptersFinish = thisQuery.q_chaptersStart;\r
734                 }\r
735                 #endregion\r
736 \r
737                 #region Output Settings\r
738 \r
739                 if (format.Success)\r
740                     thisQuery.q_format = format.ToString().Replace("-f ", "");\r
741                 thisQuery.q_largeMp4 = largerMp4.Success;\r
742                 thisQuery.q_ipodAtom = ipodAtom.Success;\r
743                 thisQuery.q_optimizeMp4 = optimizeMP4.Success;\r
744 \r
745                 #endregion\r
746 \r
747                 #region Picture Tab\r
748 \r
749                 if (width.Success)\r
750                     thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));\r
751 \r
752                 if (height.Success)\r
753                     thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));\r
754 \r
755                 if (maxWidth.Success)\r
756                     thisQuery.q_maxWidth = int.Parse(maxWidth.ToString().Replace("-X ", ""));\r
757 \r
758                 if (maxHeight.Success)\r
759                     thisQuery.q_maxHeight = int.Parse(maxHeight.ToString().Replace("-Y ", ""));\r
760 \r
761                 if (crop.Success)\r
762                 {\r
763                     thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");\r
764                     string[] actCropValues = thisQuery.q_cropValues.Split(':');\r
765                     thisQuery.q_croptop = actCropValues[0];\r
766                     thisQuery.q_cropbottom = actCropValues[1];\r
767                     thisQuery.q_cropLeft = actCropValues[2];\r
768                     thisQuery.q_cropRight = actCropValues[3];\r
769                 }\r
770                 \r
771                 thisQuery.q_anamorphic = anamorphic.Success;\r
772                 thisQuery.q_looseAnamorphic = lanamorphic.Success;\r
773 \r
774                 #endregion\r
775 \r
776                 #region Filters\r
777 \r
778                 thisQuery.q_decomb = "Off";\r
779                 if (decomb.Success)\r
780                 {\r
781                     thisQuery.q_decomb = "Default";\r
782                     if (decombValue.Success)\r
783                         thisQuery.q_decomb = decombValue.ToString().Replace("--decomb=", "").Replace("\"", "");\r
784                 }\r
785 \r
786                 thisQuery.q_deinterlace = "None";\r
787                 if (deinterlace.Success)\r
788                 {\r
789                     thisQuery.q_deinterlace = deinterlace.ToString().Replace("--deinterlace=", "").Replace("\"", "");\r
790                     thisQuery.q_deinterlace = thisQuery.q_deinterlace.Replace("fast", "Fast").Replace("slow", "Slow").Replace("slower", "Slower");\r
791                     thisQuery.q_deinterlace = thisQuery.q_deinterlace.Replace("slowest", "Slowest");\r
792                 }\r
793 \r
794                 thisQuery.q_denoise = "None";\r
795                 if (denoise.Success)\r
796                 {\r
797                     thisQuery.q_denoise = denoise.ToString().Replace("--denoise=", "").Replace("\"", "");\r
798                     thisQuery.q_denoise = thisQuery.q_denoise.Replace("weak", "Weak").Replace("medium", "Medium").Replace("strong", "Strong");\r
799                 }\r
800 \r
801                 string deblockValue = "";\r
802                 thisQuery.q_deBlock = 0;\r
803                 if (deblock.Success)\r
804                     deblockValue = deblock.ToString().Replace("--deblock=", "");\r
805                 if (deblockValue != "")\r
806                     int.TryParse(deblockValue, out thisQuery.q_deBlock);\r
807 \r
808                 thisQuery.q_detelecine = "Off";\r
809                 if (detelecine.Success)\r
810                 {\r
811                     thisQuery.q_detelecine = "Default";\r
812                     if (detelecineValue.Success)\r
813                         thisQuery.q_detelecine = detelecineValue.ToString().Replace("--detelecine=", "").Replace("\"", "");\r
814                 }\r
815 \r
816                 #endregion\r
817 \r
818                 #region Video Settings Tab\r
819 \r
820                 string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");\r
821                 switch (videoEncoderConvertion)\r
822                 {\r
823                     case "ffmpeg":\r
824                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
825                         break;\r
826                     case "xvid":\r
827                         videoEncoderConvertion = "MPEG-4 (XviD)";\r
828                         break;\r
829                     case "x264":\r
830                         videoEncoderConvertion = "H.264 (x264)";\r
831                         break;\r
832                     case "theora":\r
833                         videoEncoderConvertion = "VP3 (Theora)";\r
834                         break;\r
835                     default:\r
836                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
837                         break;\r
838                 }\r
839                 thisQuery.q_videoEncoder = videoEncoderConvertion;\r
840                 thisQuery.q_videoFramerate = videoFramerate.Success ? videoFramerate.ToString().Replace("-r ", "") : "Same as source";\r
841                 thisQuery.q_grayscale = grayscale.Success;\r
842                 thisQuery.q_twoPass = twoPass.Success;\r
843                 thisQuery.q_turboFirst = turboFirstPass.Success;\r
844                 \r
845                 if (videoBitrate.Success)\r
846                     thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");\r
847                 if (videoFilesize.Success)\r
848                     thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
849 \r
850                 if (videoQuality.Success)\r
851                 {\r
852                    float qConvert = float.Parse(videoQuality.ToString().Replace("-q ", ""), Culture);\r
853                     //qConvert = Math.Ceiling(qConvert);\r
854                     thisQuery.q_videoQuality = qConvert;\r
855                 }\r
856                 #endregion\r
857 \r
858                 #region Audio Tab\r
859 \r
860                 // Tracks\r
861                 if (noAudio.Success)\r
862                     thisQuery.q_audioTrack1 = "None";\r
863                 else if (audioTrack1.Success)\r
864                     thisQuery.q_audioTrack1 = "Automatic";\r
865 \r
866                 if (audioTrack2.Success)\r
867                 {\r
868                     string[] audioChan = audioTrack2.ToString().Split(',');\r
869                     thisQuery.q_audioTrack2 = audioChan[1];\r
870                 }\r
871                 else\r
872                     thisQuery.q_audioTrack2 = "None";\r
873 \r
874                 if (audioTrack3.Success)\r
875                 {\r
876                     string[] audioChan = audioTrack3.ToString().Split(',');\r
877                     thisQuery.q_audioTrack3 = audioChan[2];\r
878                 }\r
879                 else\r
880                     thisQuery.q_audioTrack3 = "None";\r
881 \r
882                 if (audioTrack4.Success)\r
883                 {\r
884                     string[] audioChan = audioTrack4.ToString().Split(',');\r
885                     thisQuery.q_audioTrack4 = audioChan[3];\r
886                 }\r
887                 else\r
888                     thisQuery.q_audioTrack4 = "None";\r
889 \r
890 \r
891                 // Mixdowns\r
892                 thisQuery.q_audioTrackMix1 = "Automatic";\r
893                 if (audioTrack1Mix.Success)\r
894                     thisQuery.q_audioTrackMix1 =\r
895                         getMixDown(audioTrack1Mix.ToString().Replace("-6 ", "").Replace(" ", ""));\r
896 \r
897                 thisQuery.q_audioTrackMix2 = "Automatic";\r
898                 if (audioTrack2Mix.Success)\r
899                 {\r
900                     string[] audio2mix = audioTrack2Mix.ToString().Split(',');\r
901                     thisQuery.q_audioTrackMix2 = getMixDown(audio2mix[1].Trim());\r
902                 }\r
903 \r
904                 thisQuery.q_audioTrackMix3 = "Automatic";\r
905                 if (audioTrack3Mix.Success)\r
906                 {\r
907                     string[] audio3mix = audioTrack3Mix.ToString().Split(',');\r
908                     thisQuery.q_audioTrackMix3 = getMixDown(audio3mix[2].Trim());\r
909                 }\r
910 \r
911                 thisQuery.q_audioTrackMix4 = "Automatic";\r
912                 if (audioTrack4Mix.Success)\r
913                 {\r
914                     string[] audio4mix = audioTrack4Mix.ToString().Split(',');\r
915                     thisQuery.q_audioTrackMix4 = getMixDown(audio4mix[3].Trim());\r
916                 }\r
917 \r
918 \r
919                 // Audio Encoders\r
920                 if (audioEncoder1.Success)\r
921                     thisQuery.q_audioEncoder1 = getAudioEncoder(audioEncoder1.ToString().Replace("-E ", ""));\r
922 \r
923                 if (audioEncoder2.Success)\r
924                 {\r
925                     string[] audio2enc = audioEncoder2.ToString().Split(',');\r
926                     thisQuery.q_audioEncoder2 = getAudioEncoder(audio2enc[1].Trim());\r
927                 }\r
928 \r
929                 if (audioEncoder3.Success)\r
930                 {\r
931                     string[] audio3enc = audioEncoder3.ToString().Split(',');\r
932                     thisQuery.q_audioEncoder3 = getAudioEncoder(audio3enc[2].Trim());\r
933                 }\r
934 \r
935                 if (audioEncoder4.Success)\r
936                 {\r
937                     string[] audio4enc = audioEncoder4.ToString().Split(',');\r
938                     thisQuery.q_audioEncoder4 = getAudioEncoder(audio4enc[3].Trim());\r
939                 }\r
940 \r
941 \r
942                 // Audio Bitrate\r
943                 thisQuery.q_audioBitrate1 = "";\r
944                 if (audioBitrate1.Success)\r
945                 {\r
946                     thisQuery.q_audioBitrate1 = audioBitrate1.ToString().Replace("-B ", "").Trim();\r
947                     if (audioBitrate1.ToString().Replace("-B ", "").Trim() == "0") thisQuery.q_audioBitrate1 = "Auto";\r
948                 }\r
949 \r
950                 thisQuery.q_audioBitrate2 = "";\r
951                 if (audioBitrate2.Success && audioTrack2.Success)\r
952                 {\r
953                     string[] audioBitrateSelect = audioBitrate2.ToString().Split(',');\r
954                     if (audioBitrateSelect[1].Trim() == "0") audioBitrateSelect[1] = "Auto";\r
955                     thisQuery.q_audioBitrate2 = audioBitrateSelect[1].Trim();\r
956                 }\r
957 \r
958                 thisQuery.q_audioBitrate3 = "";\r
959                 if (audioBitrate3.Success && audioTrack3.Success)\r
960                 {\r
961                     string[] audioBitrateSelect = audioBitrate3.ToString().Split(',');\r
962                     if (audioBitrateSelect[2].Trim() == "0") audioBitrateSelect[2] = "Auto";\r
963                     thisQuery.q_audioBitrate3 = audioBitrateSelect[2].Trim();\r
964                 }\r
965 \r
966                 thisQuery.q_audioBitrate4 = "";\r
967                 if (audioBitrate4.Success)\r
968                 {\r
969                     string[] audioBitrateSelect = audioBitrate4.ToString().Split(',');\r
970                     if (audioBitrateSelect[3].Trim() == "0") audioBitrateSelect[3] = "Auto";\r
971                     thisQuery.q_audioBitrate4 = audioBitrateSelect[3].Trim();\r
972                 }\r
973 \r
974 \r
975                 // Audio Sample Rate\r
976                 // Make sure to change 0 to Auto\r
977                 thisQuery.q_audioSamplerate1 = "Auto";\r
978                 if (audioSampleRate1.Success)\r
979                 {\r
980                     thisQuery.q_audioSamplerate1 = audioSampleRate1.ToString().Replace("-R ", "").Trim();\r
981                     if (thisQuery.q_audioSamplerate1 == "0") thisQuery.q_audioSamplerate1 = "Auto";\r
982                 }\r
983 \r
984 \r
985                 if (audioSampleRate2.Success)\r
986                 {\r
987                     string[] audioSRSelect = audioSampleRate2.ToString().Split(',');\r
988                     if (audioSRSelect[1] == "0") audioSRSelect[1] = "Auto";\r
989                     thisQuery.q_audioSamplerate2 = audioSRSelect[1].Trim();\r
990                 }\r
991 \r
992                 if (audioSampleRate3.Success)\r
993                 {\r
994                     string[] audioSRSelect = audioSampleRate3.ToString().Split(',');\r
995                     if (audioSRSelect[2] == "0") audioSRSelect[2] = "Auto";\r
996                     thisQuery.q_audioSamplerate3 = audioSRSelect[2].Trim();\r
997                 }\r
998 \r
999                 if (audioSampleRate4.Success)\r
1000                 {\r
1001                     string[] audioSRSelect = audioSampleRate4.ToString().Split(',');\r
1002                     if (audioSRSelect[3] == "0") audioSRSelect[3] = "Auto";\r
1003                     thisQuery.q_audioSamplerate4 = audioSRSelect[3].Trim();\r
1004                 }\r
1005 \r
1006                 // DRC\r
1007                 float drcValue;\r
1008 \r
1009                 thisQuery.q_drc1 = 1;\r
1010                 if (drc1.Success)\r
1011                 {\r
1012                     string value = drc1.ToString().Replace("-D ", "");\r
1013                     float.TryParse(value, out drcValue);\r
1014                     thisQuery.q_drc1 = drcValue;\r
1015                 }\r
1016 \r
1017                 thisQuery.q_drc2 = 1;\r
1018                 if (drc2.Success)\r
1019                 {\r
1020                     string[] drcPoint = drc2.ToString().Split(',');\r
1021                     float.TryParse(drcPoint[1], out drcValue);\r
1022                     thisQuery.q_drc2 = drcValue;\r
1023                 }\r
1024 \r
1025                 thisQuery.q_drc3 = 1;\r
1026                 if (drc3.Success)\r
1027                 {\r
1028                     string[] drcPoint = drc3.ToString().Split(',');\r
1029                     float.TryParse(drcPoint[2], out drcValue);\r
1030                     thisQuery.q_drc3 = drcValue;\r
1031                 }\r
1032 \r
1033                 thisQuery.q_drc4 = 1;\r
1034                 if (drc4.Success)\r
1035                 {\r
1036                     string[] drcPoint = drc4.ToString().Split(',');\r
1037                     float.TryParse(drcPoint[3], out drcValue);\r
1038                     thisQuery.q_drc4 = drcValue;\r
1039                 }\r
1040 \r
1041                 // Subtitle Stuff\r
1042                 if (subtitles.Success)\r
1043                     thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");\r
1044                 else\r
1045                     thisQuery.q_subtitles = subScan.Success ? "Autoselect" : "None";\r
1046 \r
1047                 thisQuery.q_forcedSubs = forcedSubtitles.Success;\r
1048 \r
1049                 #endregion\r
1050 \r
1051                 #region Chapters Tab\r
1052                 if (chapterMarkersFileMode.Success || chapterMarkers.Success)\r
1053                     thisQuery.q_chapterMarkers = true;\r
1054                 #endregion\r
1055 \r
1056                 #region H.264 and other\r
1057 \r
1058                 //\r
1059                 //H264 Tab\r
1060                 //\r
1061                 if (x264.Success)\r
1062                     thisQuery.q_h264 = x264.ToString().Replace("-x ", "");\r
1063 \r
1064                 //\r
1065                 //Progam Options\r
1066                 //\r
1067                 thisQuery.q_verbose = verbose.Success;\r
1068 \r
1069                 #endregion\r
1070             }\r
1071             catch (Exception exc)\r
1072             {\r
1073                 MessageBox.Show(\r
1074                     "An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" +\r
1075                     exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1076             }\r
1077 \r
1078             #endregion\r
1079 \r
1080             return thisQuery;\r
1081         }\r
1082 \r
1083         private static string getMixDown(string mixdown)\r
1084         {\r
1085             switch (mixdown)\r
1086             {\r
1087                 case "mono":\r
1088                     return "Mono";\r
1089                 case "stereo":\r
1090                     return "Stereo";\r
1091                 case "dpl1":\r
1092                     return "Dolby Surround";\r
1093                 case "dpl2":\r
1094                     return "Dolby Pro Logic II";\r
1095                 case "6ch":\r
1096                     return "6 Channel Discrete";\r
1097                 default:\r
1098                     return "Automatic";\r
1099             }\r
1100         }\r
1101 \r
1102         private static string getAudioEncoder(string audioEnc)\r
1103         {\r
1104             switch (audioEnc)\r
1105             {\r
1106                 case "faac":\r
1107                     return "AAC";\r
1108                 case "lame":\r
1109                     return "MP3";\r
1110                 case "vorbis":\r
1111                     return "Vorbis";\r
1112                 case "ac3":\r
1113                     return "AC3";\r
1114                 default:\r
1115                     return "AAC";\r
1116             }\r
1117         }\r
1118     }\r
1119 }