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