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 "x264":\r
827                         videoEncoderConvertion = "H.264 (x264)";\r
828                         break;\r
829                     case "theora":\r
830                         videoEncoderConvertion = "VP3 (Theora)";\r
831                         break;\r
832                     default:\r
833                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
834                         break;\r
835                 }\r
836                 thisQuery.q_videoEncoder = videoEncoderConvertion;\r
837                 thisQuery.q_videoFramerate = videoFramerate.Success ? videoFramerate.ToString().Replace("-r ", "") : "Same as source";\r
838                 thisQuery.q_grayscale = grayscale.Success;\r
839                 thisQuery.q_twoPass = twoPass.Success;\r
840                 thisQuery.q_turboFirst = turboFirstPass.Success;\r
841                 \r
842                 if (videoBitrate.Success)\r
843                     thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");\r
844                 if (videoFilesize.Success)\r
845                     thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
846 \r
847                 if (videoQuality.Success)\r
848                 {\r
849                    float qConvert = float.Parse(videoQuality.ToString().Replace("-q ", ""), Culture);\r
850                     //qConvert = Math.Ceiling(qConvert);\r
851                     thisQuery.q_videoQuality = qConvert;\r
852                 }\r
853                 #endregion\r
854 \r
855                 #region Audio Tab\r
856 \r
857                 // Tracks\r
858                 if (noAudio.Success)\r
859                     thisQuery.q_audioTrack1 = "None";\r
860                 else if (audioTrack1.Success)\r
861                     thisQuery.q_audioTrack1 = "Automatic";\r
862 \r
863                 if (audioTrack2.Success)\r
864                 {\r
865                     string[] audioChan = audioTrack2.ToString().Split(',');\r
866                     thisQuery.q_audioTrack2 = audioChan[1];\r
867                 }\r
868                 else\r
869                     thisQuery.q_audioTrack2 = "None";\r
870 \r
871                 if (audioTrack3.Success)\r
872                 {\r
873                     string[] audioChan = audioTrack3.ToString().Split(',');\r
874                     thisQuery.q_audioTrack3 = audioChan[2];\r
875                 }\r
876                 else\r
877                     thisQuery.q_audioTrack3 = "None";\r
878 \r
879                 if (audioTrack4.Success)\r
880                 {\r
881                     string[] audioChan = audioTrack4.ToString().Split(',');\r
882                     thisQuery.q_audioTrack4 = audioChan[3];\r
883                 }\r
884                 else\r
885                     thisQuery.q_audioTrack4 = "None";\r
886 \r
887 \r
888                 // Mixdowns\r
889                 thisQuery.q_audioTrackMix1 = "Automatic";\r
890                 if (audioTrack1Mix.Success)\r
891                     thisQuery.q_audioTrackMix1 =\r
892                         getMixDown(audioTrack1Mix.ToString().Replace("-6 ", "").Replace(" ", ""));\r
893 \r
894                 thisQuery.q_audioTrackMix2 = "Automatic";\r
895                 if (audioTrack2Mix.Success)\r
896                 {\r
897                     string[] audio2mix = audioTrack2Mix.ToString().Split(',');\r
898                     thisQuery.q_audioTrackMix2 = getMixDown(audio2mix[1].Trim());\r
899                 }\r
900 \r
901                 thisQuery.q_audioTrackMix3 = "Automatic";\r
902                 if (audioTrack3Mix.Success)\r
903                 {\r
904                     string[] audio3mix = audioTrack3Mix.ToString().Split(',');\r
905                     thisQuery.q_audioTrackMix3 = getMixDown(audio3mix[2].Trim());\r
906                 }\r
907 \r
908                 thisQuery.q_audioTrackMix4 = "Automatic";\r
909                 if (audioTrack4Mix.Success)\r
910                 {\r
911                     string[] audio4mix = audioTrack4Mix.ToString().Split(',');\r
912                     thisQuery.q_audioTrackMix4 = getMixDown(audio4mix[3].Trim());\r
913                 }\r
914 \r
915 \r
916                 // Audio Encoders\r
917                 if (audioEncoder1.Success)\r
918                     thisQuery.q_audioEncoder1 = getAudioEncoder(audioEncoder1.ToString().Replace("-E ", ""));\r
919 \r
920                 if (audioEncoder2.Success)\r
921                 {\r
922                     string[] audio2enc = audioEncoder2.ToString().Split(',');\r
923                     thisQuery.q_audioEncoder2 = getAudioEncoder(audio2enc[1].Trim());\r
924                 }\r
925 \r
926                 if (audioEncoder3.Success)\r
927                 {\r
928                     string[] audio3enc = audioEncoder3.ToString().Split(',');\r
929                     thisQuery.q_audioEncoder3 = getAudioEncoder(audio3enc[2].Trim());\r
930                 }\r
931 \r
932                 if (audioEncoder4.Success)\r
933                 {\r
934                     string[] audio4enc = audioEncoder4.ToString().Split(',');\r
935                     thisQuery.q_audioEncoder4 = getAudioEncoder(audio4enc[3].Trim());\r
936                 }\r
937 \r
938 \r
939                 // Audio Bitrate\r
940                 thisQuery.q_audioBitrate1 = "";\r
941                 if (audioBitrate1.Success)\r
942                 {\r
943                     thisQuery.q_audioBitrate1 = audioBitrate1.ToString().Replace("-B ", "").Trim();\r
944                     if (audioBitrate1.ToString().Replace("-B ", "").Trim() == "0") thisQuery.q_audioBitrate1 = "Auto";\r
945                 }\r
946 \r
947                 thisQuery.q_audioBitrate2 = "";\r
948                 if (audioBitrate2.Success && audioTrack2.Success)\r
949                 {\r
950                     string[] audioBitrateSelect = audioBitrate2.ToString().Split(',');\r
951                     if (audioBitrateSelect[1].Trim() == "0") audioBitrateSelect[1] = "Auto";\r
952                     thisQuery.q_audioBitrate2 = audioBitrateSelect[1].Trim();\r
953                 }\r
954 \r
955                 thisQuery.q_audioBitrate3 = "";\r
956                 if (audioBitrate3.Success && audioTrack3.Success)\r
957                 {\r
958                     string[] audioBitrateSelect = audioBitrate3.ToString().Split(',');\r
959                     if (audioBitrateSelect[2].Trim() == "0") audioBitrateSelect[2] = "Auto";\r
960                     thisQuery.q_audioBitrate3 = audioBitrateSelect[2].Trim();\r
961                 }\r
962 \r
963                 thisQuery.q_audioBitrate4 = "";\r
964                 if (audioBitrate4.Success)\r
965                 {\r
966                     string[] audioBitrateSelect = audioBitrate4.ToString().Split(',');\r
967                     if (audioBitrateSelect[3].Trim() == "0") audioBitrateSelect[3] = "Auto";\r
968                     thisQuery.q_audioBitrate4 = audioBitrateSelect[3].Trim();\r
969                 }\r
970 \r
971 \r
972                 // Audio Sample Rate\r
973                 // Make sure to change 0 to Auto\r
974                 thisQuery.q_audioSamplerate1 = "Auto";\r
975                 if (audioSampleRate1.Success)\r
976                 {\r
977                     thisQuery.q_audioSamplerate1 = audioSampleRate1.ToString().Replace("-R ", "").Trim();\r
978                     if (thisQuery.q_audioSamplerate1 == "0") thisQuery.q_audioSamplerate1 = "Auto";\r
979                 }\r
980 \r
981 \r
982                 if (audioSampleRate2.Success)\r
983                 {\r
984                     string[] audioSRSelect = audioSampleRate2.ToString().Split(',');\r
985                     if (audioSRSelect[1] == "0") audioSRSelect[1] = "Auto";\r
986                     thisQuery.q_audioSamplerate2 = audioSRSelect[1].Trim();\r
987                 }\r
988 \r
989                 if (audioSampleRate3.Success)\r
990                 {\r
991                     string[] audioSRSelect = audioSampleRate3.ToString().Split(',');\r
992                     if (audioSRSelect[2] == "0") audioSRSelect[2] = "Auto";\r
993                     thisQuery.q_audioSamplerate3 = audioSRSelect[2].Trim();\r
994                 }\r
995 \r
996                 if (audioSampleRate4.Success)\r
997                 {\r
998                     string[] audioSRSelect = audioSampleRate4.ToString().Split(',');\r
999                     if (audioSRSelect[3] == "0") audioSRSelect[3] = "Auto";\r
1000                     thisQuery.q_audioSamplerate4 = audioSRSelect[3].Trim();\r
1001                 }\r
1002 \r
1003                 // DRC\r
1004                 float drcValue;\r
1005 \r
1006                 thisQuery.q_drc1 = 1;\r
1007                 if (drc1.Success)\r
1008                 {\r
1009                     string value = drc1.ToString().Replace("-D ", "");\r
1010                     float.TryParse(value, out drcValue);\r
1011                     thisQuery.q_drc1 = drcValue;\r
1012                 }\r
1013 \r
1014                 thisQuery.q_drc2 = 1;\r
1015                 if (drc2.Success)\r
1016                 {\r
1017                     string[] drcPoint = drc2.ToString().Split(',');\r
1018                     float.TryParse(drcPoint[1], out drcValue);\r
1019                     thisQuery.q_drc2 = drcValue;\r
1020                 }\r
1021 \r
1022                 thisQuery.q_drc3 = 1;\r
1023                 if (drc3.Success)\r
1024                 {\r
1025                     string[] drcPoint = drc3.ToString().Split(',');\r
1026                     float.TryParse(drcPoint[2], out drcValue);\r
1027                     thisQuery.q_drc3 = drcValue;\r
1028                 }\r
1029 \r
1030                 thisQuery.q_drc4 = 1;\r
1031                 if (drc4.Success)\r
1032                 {\r
1033                     string[] drcPoint = drc4.ToString().Split(',');\r
1034                     float.TryParse(drcPoint[3], out drcValue);\r
1035                     thisQuery.q_drc4 = drcValue;\r
1036                 }\r
1037 \r
1038                 // Subtitle Stuff\r
1039                 if (subtitles.Success)\r
1040                     thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");\r
1041                 else\r
1042                     thisQuery.q_subtitles = subScan.Success ? "Autoselect" : "None";\r
1043 \r
1044                 thisQuery.q_forcedSubs = forcedSubtitles.Success;\r
1045 \r
1046                 #endregion\r
1047 \r
1048                 #region Chapters Tab\r
1049                 if (chapterMarkersFileMode.Success || chapterMarkers.Success)\r
1050                     thisQuery.q_chapterMarkers = true;\r
1051                 #endregion\r
1052 \r
1053                 #region H.264 and other\r
1054 \r
1055                 //\r
1056                 //H264 Tab\r
1057                 //\r
1058                 if (x264.Success)\r
1059                     thisQuery.q_h264 = x264.ToString().Replace("-x ", "");\r
1060 \r
1061                 //\r
1062                 //Progam Options\r
1063                 //\r
1064                 thisQuery.q_verbose = verbose.Success;\r
1065 \r
1066                 #endregion\r
1067             }\r
1068             catch (Exception exc)\r
1069             {\r
1070                 MessageBox.Show(\r
1071                     "An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" +\r
1072                     exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1073             }\r
1074 \r
1075             #endregion\r
1076 \r
1077             return thisQuery;\r
1078         }\r
1079 \r
1080         private static string getMixDown(string mixdown)\r
1081         {\r
1082             switch (mixdown)\r
1083             {\r
1084                 case "mono":\r
1085                     return "Mono";\r
1086                 case "stereo":\r
1087                     return "Stereo";\r
1088                 case "dpl1":\r
1089                     return "Dolby Surround";\r
1090                 case "dpl2":\r
1091                     return "Dolby Pro Logic II";\r
1092                 case "6ch":\r
1093                     return "6 Channel Discrete";\r
1094                 default:\r
1095                     return "Automatic";\r
1096             }\r
1097         }\r
1098 \r
1099         private static string getAudioEncoder(string audioEnc)\r
1100         {\r
1101             switch (audioEnc)\r
1102             {\r
1103                 case "faac":\r
1104                     return "AAC";\r
1105                 case "lame":\r
1106                     return "MP3";\r
1107                 case "vorbis":\r
1108                     return "Vorbis";\r
1109                 case "ac3":\r
1110                     return "AC3";\r
1111                 default:\r
1112                     return "AAC";\r
1113             }\r
1114         }\r
1115     }\r
1116 }