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  \r
783         public static QueryParser Parse(String input)\r
784         {\r
785             QueryParser thisQuery = new QueryParser();\r
786 \r
787             #region Regular Expressions\r
788             // Useful Destination Finder\r
789             //Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9?';!^%&*()_\-:\\\s\.]+)(?:\"")");\r
790             //Match source = r1.Match(input.Replace('"', '\"'));\r
791 \r
792             //Source\r
793             Match title = Regex.Match(input, @"-t ([0-9]*)");\r
794             Match chapters = Regex.Match(input, @"-c ([0-9-]*)");\r
795             Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");\r
796 \r
797             //Destination\r
798             Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");\r
799 \r
800             //Picture Settings Tab\r
801             Match width = Regex.Match(input, @"-w ([0-9]*)");\r
802             Match height = Regex.Match(input, @"-l ([0-9]*)");\r
803             Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");\r
804             Match maxHeight = Regex.Match(input, @"-Y ([0-9]*)");\r
805             Match deinterlace = Regex.Match(input, @"--deinterlace=\""([a-zA-Z]*)\""");\r
806             Match denoise = Regex.Match(input, @"--denoise=\""([a-zA-Z]*)\""");\r
807             Match deblock = Regex.Match(input, @"--deblock=([0-9]*)");\r
808             Match detelecine = Regex.Match(input, @"--detelecine");\r
809             Match anamorphic = Regex.Match(input, @" -p ");\r
810             Match chapterMarkers = Regex.Match(input, @" -m");\r
811             Match chapterMarkersFileMode = Regex.Match(input, @"--markers");\r
812             Match crop = Regex.Match(input, @"--crop ([0-9]*):([0-9]*):([0-9]*):([0-9]*)");\r
813             Match lanamorphic = Regex.Match(input, @" -P");\r
814             Match decomb = Regex.Match(input, @" --decomb");\r
815 \r
816             //Video Settings Tab\r
817             Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)");\r
818             Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");\r
819             Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)");\r
820             Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)");\r
821             Match twoPass = Regex.Match(input, @" -2");\r
822             Match turboFirstPass = Regex.Match(input, @" -T");\r
823             Match grayscale = Regex.Match(input, @" -g");\r
824             Match largerMp4 = Regex.Match(input, @" -4");\r
825             Match ipodAtom = Regex.Match(input, @" -I");\r
826             Match optimizeMP4 = Regex.Match(input, @" -O");\r
827 \r
828             //Audio Settings Tab\r
829             Match audioTrack1 = Regex.Match(input, @"-a ([0-9]*)");\r
830             Match audioTrack2 = Regex.Match(input, @"-a ([0-9]*),([0-9]*)");\r
831             Match audioTrack3 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*)");\r
832             Match audioTrack4 = Regex.Match(input, @"-a ([0-9]*),([0-9]*),([0-9]*),([0-9]*)");\r
833 \r
834             Match audioTrack1Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*)");  \r
835             Match audioTrack2Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
836             Match audioTrack3Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)");\r
837             Match audioTrack4Mix = Regex.Match(input, @"-6 ([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*),([0-9a-z0-9]*)"); \r
838 \r
839             Match audioEncoder1 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*)");\r
840             Match audioEncoder2 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
841             Match audioEncoder3 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
842             Match audioEncoder4 = Regex.Match(input, @"-E ([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*),([a-zA-Z0-9+]*)");\r
843 \r
844             Match audioBitrate1 = Regex.Match(input, @"-B ([0-9auto]*)");\r
845             Match audioBitrate2 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*)");\r
846             Match audioBitrate3 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*),([0-9auto]*)");\r
847             Match audioBitrate4 = Regex.Match(input, @"-B ([0-9auto]*),([0-9auto]*),([0-9auto]*),([0-9auto]*)");\r
848 \r
849             Match audioSampleRate1 = Regex.Match(input, @"-R ([0-9Auto.]*)");\r
850             Match audioSampleRate2 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*)");\r
851             Match audioSampleRate3 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*)");\r
852             Match audioSampleRate4 = Regex.Match(input, @"-R ([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*),([0-9Auto.]*)");\r
853 \r
854             Match drc1 = Regex.Match(input, @"-D ([0-9.]*)");\r
855             Match drc2 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*)");\r
856             Match drc3 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*),([0-9.]*)");\r
857             Match drc4 = Regex.Match(input, @"-D ([0-9.]*),([0-9.]*),([0-9.]*),([0-9.]*)");\r
858 \r
859             Match subtitles = Regex.Match(input, @"-s ([0-9a-zA-Z]*)");\r
860             Match subScan = Regex.Match(input, @" -U");\r
861             Match forcedSubtitles = Regex.Match(input, @" -F");\r
862 \r
863             //H264 Tab\r
864             Match x264 = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");\r
865 \r
866             //Program Options\r
867             Match verbose = Regex.Match(input, @" -v");\r
868             #endregion\r
869 \r
870             #region Set Varibles\r
871             try\r
872             {\r
873                 #region Source Tab\r
874                 if (title.Success != false)\r
875                             thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", ""));\r
876 \r
877                 if (chapters.Success != false)\r
878                 {\r
879                     string[] actTitles = new string[2];\r
880                     actTitles = chapters.ToString().Replace("-c ", "").Split('-');\r
881                     thisQuery.q_chaptersStart = int.Parse(actTitles[0]);\r
882                     if (actTitles.Length > 1)\r
883                     {\r
884                         thisQuery.q_chaptersFinish = int.Parse(actTitles[1]);\r
885                     }\r
886 \r
887                     if ((thisQuery.q_chaptersStart == 1) && (thisQuery.q_chaptersFinish == 0))\r
888                         thisQuery.q_chaptersFinish = thisQuery.q_chaptersStart;\r
889                 }\r
890 \r
891                 if (format.Success != false)\r
892                     thisQuery.q_format = format.ToString().Replace("-f ", "");\r
893 \r
894                 #endregion\r
895 \r
896                 #region Destination\r
897 \r
898                 string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");\r
899                 switch (videoEncoderConvertion)\r
900                 {\r
901                     case "ffmpeg":\r
902                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
903                         break;\r
904                     case "xvid":\r
905                         videoEncoderConvertion = "MPEG-4 (XviD)";\r
906                         break;\r
907                     case "x264":\r
908                         videoEncoderConvertion = "H.264 (x264)";\r
909                         break;\r
910                     case "theora":\r
911                         videoEncoderConvertion = "VP3 (Theora)";\r
912                         break;\r
913                     default:\r
914                         videoEncoderConvertion = "MPEG-4 (FFmpeg)";\r
915                         break;\r
916                 }\r
917                 thisQuery.q_videoEncoder = videoEncoderConvertion;\r
918 \r
919                 #endregion\r
920 \r
921                 #region Picture Tab\r
922 \r
923                 if (width.Success != false)\r
924                     thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", ""));\r
925 \r
926                 if (height.Success != false)\r
927                     thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", ""));\r
928 \r
929                 if (maxWidth.Success != false)\r
930                     thisQuery.q_maxWidth = int.Parse(maxWidth.ToString().Replace("-X ", ""));\r
931 \r
932                 if (maxHeight.Success != false)\r
933                     thisQuery.q_maxHeight = int.Parse(maxHeight.ToString().Replace("-Y ", ""));\r
934 \r
935                 if (crop.Success != false)\r
936                 {\r
937                     thisQuery.q_cropValues = crop.ToString().Replace("--crop ", "");\r
938                     string[] actCropValues = new string[3];\r
939                     actCropValues = thisQuery.q_cropValues.Split(':');\r
940                     thisQuery.q_croptop = actCropValues[0];\r
941                     thisQuery.q_cropbottom = actCropValues[1];\r
942                     thisQuery.q_cropLeft = actCropValues[2];\r
943                     thisQuery.q_cropRight = actCropValues[3];\r
944                 }\r
945 \r
946                 // Deblock Slider\r
947                 string deblockValue = "";\r
948                 thisQuery.q_deBlock = 0;\r
949                 if (deblock.Success != false)\r
950                     deblockValue = deblock.ToString().Replace("--deblock=", "");\r
951 \r
952                 if (deblockValue != "")\r
953                     int.TryParse(deblockValue, out thisQuery.q_deBlock);\r
954 \r
955                 thisQuery.q_detelecine = detelecine.Success;\r
956                 thisQuery.q_decomb = decomb.Success;\r
957 \r
958                 thisQuery.q_deinterlace = "None";\r
959                 if (deinterlace.Success != false)\r
960                 {\r
961                     switch (deinterlace.ToString().Replace("--deinterlace=", "").Replace("\"",""))\r
962                     {\r
963                         case "fast":\r
964                             thisQuery.q_deinterlace = "Fast";\r
965                             break;\r
966                         case "slow":\r
967                             thisQuery.q_deinterlace = "Slow";\r
968                             break;\r
969                         case "slower":\r
970                             thisQuery.q_deinterlace = "Slower";\r
971                             break;\r
972                         case "slowest":\r
973                             thisQuery.q_deinterlace = "Slowest";\r
974                             break;\r
975                         default:\r
976                             thisQuery.q_deinterlace = "None";\r
977                             break;\r
978                     }\r
979                 }\r
980 \r
981                 thisQuery.q_denoise = "None";\r
982                 if (denoise.Success != false)\r
983                 {\r
984                     switch (denoise.ToString().Replace("--denoise=", "").Replace("\"", ""))\r
985                     {\r
986                         case "weak":\r
987                             thisQuery.q_denoise = "Weak";\r
988                             break;\r
989                         case "medium":\r
990                             thisQuery.q_denoise = "Medium";\r
991                             break;\r
992                         case "strong":\r
993                             thisQuery.q_denoise = "Strong";\r
994                             break;\r
995                         default:\r
996                             thisQuery.q_denoise = "None";\r
997                             break;\r
998                     }\r
999 \r
1000                 }\r
1001                 thisQuery.q_anamorphic = anamorphic.Success;\r
1002                 if (chapterMarkersFileMode.Success == true || chapterMarkers.Success == true)\r
1003                     thisQuery.q_chapterMarkers = true;\r
1004                 \r
1005                 thisQuery.q_looseAnamorphic = lanamorphic.Success;\r
1006 \r
1007                 #endregion\r
1008      \r
1009                 #region Video Settings Tab\r
1010                 thisQuery.q_grayscale = grayscale.Success;\r
1011                 thisQuery.q_twoPass = twoPass.Success;\r
1012                 thisQuery.q_turboFirst = turboFirstPass.Success;\r
1013                 thisQuery.q_largeMp4 = largerMp4.Success;\r
1014                 if (videoFramerate.Success != false)\r
1015                     thisQuery.q_videoFramerate = videoFramerate.ToString().Replace("-r ", "");\r
1016                 else\r
1017                     thisQuery.q_videoFramerate = "Same as source";\r
1018 \r
1019                 if (videoBitrate.Success != false)\r
1020                     thisQuery.q_avgBitrate = videoBitrate.ToString().Replace("-b ", "");\r
1021                 if (videoFilesize.Success != false)\r
1022                     thisQuery.q_videoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
1023 \r
1024                 double qConvert = 0;\r
1025                 if (videoQuality.Success != false)\r
1026                 {\r
1027                     qConvert = double.Parse(videoQuality.ToString().Replace("-q ", ""), Culture) * 100;\r
1028                     qConvert = System.Math.Ceiling(qConvert);\r
1029                     thisQuery.q_videoQuality = int.Parse(qConvert.ToString());\r
1030                 }\r
1031                 thisQuery.q_ipodAtom = ipodAtom.Success;\r
1032                 thisQuery.q_optimizeMp4 = optimizeMP4.Success;\r
1033 \r
1034                 #endregion\r
1035 \r
1036                 #region Audio Tab\r
1037 \r
1038                 // Tracks\r
1039                 thisQuery.q_audioTrack1 = "Automatic";\r
1040 \r
1041                 if (audioTrack2.Success != false)\r
1042                 {\r
1043                     string[] audioChan = audioTrack2.ToString().Split(',');\r
1044                     thisQuery.q_audioTrack2 = audioChan[1];\r
1045                 }\r
1046                 else\r
1047                     thisQuery.q_audioTrack2 = "None";\r
1048 \r
1049                 if (audioTrack3.Success != false)\r
1050                 {\r
1051                     string[] audioChan = audioTrack3.ToString().Split(',');\r
1052                     thisQuery.q_audioTrack3 = audioChan[2];\r
1053                 }\r
1054                 else\r
1055                     thisQuery.q_audioTrack3 = "None";\r
1056 \r
1057                 if (audioTrack4.Success != false)\r
1058                 {\r
1059                     string[] audioChan = audioTrack4.ToString().Split(',');\r
1060                     thisQuery.q_audioTrack4 = audioChan[3];\r
1061                 }\r
1062                 else\r
1063                     thisQuery.q_audioTrack4 = "None";\r
1064 \r
1065     \r
1066                 // Mixdowns\r
1067                 thisQuery.q_audioTrackMix1 = "Automatic";\r
1068                 if (audioTrack1Mix.Success != false)\r
1069                     thisQuery.q_audioTrackMix1 = getMixDown(audioTrack1Mix.ToString().Replace("-6 ", "").Replace(" ", ""));\r
1070 \r
1071                 thisQuery.q_audioTrackMix2 = "Automatic";\r
1072                 if (audioTrack2Mix.Success != false)\r
1073                 {\r
1074                     string[] audio2mix = audioTrack2Mix.ToString().Split(',');\r
1075                     thisQuery.q_audioTrackMix2 = getMixDown(audio2mix[1].Trim());\r
1076                 }\r
1077 \r
1078                 thisQuery.q_audioTrackMix3 = "Automatic";\r
1079                 if (audioTrack3Mix.Success != false)\r
1080                 {\r
1081                     string[] audio3mix = audioTrack3Mix.ToString().Split(',');\r
1082                     thisQuery.q_audioTrackMix3 = getMixDown(audio3mix[2].Trim());\r
1083                 }\r
1084 \r
1085                 thisQuery.q_audioTrackMix4 = "Automatic";\r
1086                 if (audioTrack4Mix.Success != false)\r
1087                 {\r
1088                     string[] audio4mix = audioTrack4Mix.ToString().Split(',');\r
1089                     thisQuery.q_audioTrackMix4 = getMixDown(audio4mix[3].Trim());\r
1090                 }\r
1091                 \r
1092 \r
1093                 // Audio Encoders\r
1094                 if (audioEncoder1.Success != false)\r
1095                     thisQuery.q_audioEncoder1 = getAudioEncoder(audioEncoder1.ToString().Replace("-E ", ""));\r
1096 \r
1097                 if (audioEncoder2.Success != false)\r
1098                 {\r
1099                     string[] audio2enc = audioEncoder2.ToString().Split(',');\r
1100                     thisQuery.q_audioEncoder2 = getAudioEncoder(audio2enc[1].Trim());\r
1101                 }\r
1102 \r
1103                 if (audioEncoder3.Success != false)\r
1104                 {\r
1105                     string[] audio3enc = audioEncoder3.ToString().Split(',');\r
1106                     thisQuery.q_audioEncoder3 = getAudioEncoder(audio3enc[2].Trim());\r
1107                 }\r
1108 \r
1109                 if (audioEncoder4.Success != false)\r
1110                 {\r
1111                     string[] audio4enc = audioEncoder4.ToString().Split(',');\r
1112                     thisQuery.q_audioEncoder4 = getAudioEncoder(audio4enc[3].Trim());\r
1113                 }\r
1114 \r
1115 \r
1116                 // Audio Bitrate\r
1117                 thisQuery.q_audioBitrate1 = "";\r
1118                 if (audioBitrate1.Success != false)\r
1119                 {\r
1120                     thisQuery.q_audioBitrate1 = audioBitrate1.ToString().Replace("-B ", "").Trim();\r
1121                     if (audioBitrate1.ToString().Replace("-B ", "").Trim() == "0") thisQuery.q_audioBitrate1 = "Auto";\r
1122                 }\r
1123 \r
1124                 thisQuery.q_audioBitrate2 = "";\r
1125                 if (audioBitrate2.Success != false && audioTrack2.Success == true)\r
1126                 {\r
1127                     string[] audioBitrateSelect = audioBitrate2.ToString().Split(',');\r
1128                     if (audioBitrateSelect[1].Trim() == "0") audioBitrateSelect[1] = "Auto";\r
1129                     thisQuery.q_audioBitrate2 = audioBitrateSelect[1].Trim();                      \r
1130                 }\r
1131 \r
1132                 thisQuery.q_audioBitrate3 = "";\r
1133                 if (audioBitrate3.Success != false && audioTrack3.Success == true)\r
1134                 {\r
1135                     string[] audioBitrateSelect = audioBitrate3.ToString().Split(',');\r
1136                     if (audioBitrateSelect[2].Trim() == "0") audioBitrateSelect[2] = "Auto";\r
1137                     thisQuery.q_audioBitrate3 = audioBitrateSelect[2].Trim();\r
1138                 }\r
1139 \r
1140                 thisQuery.q_audioBitrate4 = "";\r
1141                 if (audioBitrate4.Success != false)\r
1142                 {\r
1143                     string[] audioBitrateSelect = audioBitrate4.ToString().Split(',');\r
1144                     if (audioBitrateSelect[3].Trim() == "0") audioBitrateSelect[3] = "Auto";\r
1145                     thisQuery.q_audioBitrate4 = audioBitrateSelect[3].Trim();\r
1146                 }\r
1147 \r
1148 \r
1149                 // Audio Sample Rate\r
1150                 // Make sure to change 0 to Auto\r
1151                 thisQuery.q_audioSamplerate1 = "Auto";\r
1152                 if (audioSampleRate1.Success != false)\r
1153                 {\r
1154                     thisQuery.q_audioSamplerate1 = audioSampleRate1.ToString().Replace("-R ", "").Trim();\r
1155                     if (thisQuery.q_audioSamplerate1 == "0") thisQuery.q_audioSamplerate1 = "Auto";\r
1156                 }\r
1157                     \r
1158 \r
1159                 if (audioSampleRate2.Success != false)\r
1160                 {\r
1161                     string[] audioSRSelect = audioSampleRate2.ToString().Split(',');\r
1162                     if (audioSRSelect[1] == "0") audioSRSelect[1] = "Auto";\r
1163                     thisQuery.q_audioSamplerate2 = audioSRSelect[1].Trim();\r
1164                 }\r
1165 \r
1166                 if (audioSampleRate3.Success != false)\r
1167                 {\r
1168                     string[] audioSRSelect = audioSampleRate3.ToString().Split(',');\r
1169                     if (audioSRSelect[2] == "0") audioSRSelect[2] = "Auto";\r
1170                     thisQuery.q_audioSamplerate3 = audioSRSelect[2].Trim();\r
1171                 }\r
1172 \r
1173                 if (audioSampleRate4.Success != false)\r
1174                 {\r
1175                     string[] audioSRSelect = audioSampleRate4.ToString().Split(',');\r
1176                     if (audioSRSelect[3] == "0") audioSRSelect[3] = "Auto";\r
1177                     thisQuery.q_audioSamplerate4 = audioSRSelect[3].Trim();\r
1178                 }\r
1179 \r
1180                 // DRC\r
1181                 float drcValue;\r
1182 \r
1183                 thisQuery.q_drc1 = 1;\r
1184                 if (drc1.Success != false)\r
1185                 {\r
1186                     string value = drc1.ToString().Replace("-D ", "");\r
1187                     float.TryParse(value, out drcValue);\r
1188                     thisQuery.q_drc1 = drcValue;\r
1189                 }\r
1190                \r
1191                 thisQuery.q_drc2 = 1;   \r
1192                 if (drc2.Success != false)\r
1193                 {\r
1194                     string[] drcPoint = drc2.ToString().Split(',');\r
1195                     float.TryParse(drcPoint[1], out drcValue);\r
1196                     thisQuery.q_drc2 = drcValue;\r
1197                 }\r
1198 \r
1199                 thisQuery.q_drc3 = 1;\r
1200                 if (drc3.Success != false)\r
1201                 {\r
1202                     string[] drcPoint = drc3.ToString().Split(',');\r
1203                     float.TryParse(drcPoint[2], out drcValue);\r
1204                     thisQuery.q_drc3 = drcValue;\r
1205                 }\r
1206 \r
1207                 thisQuery.q_drc4 = 1;\r
1208                 if (drc4.Success != false)\r
1209                 {\r
1210                     string[] drcPoint = drc4.ToString().Split(',');\r
1211                     float.TryParse(drcPoint[3], out drcValue);\r
1212                     thisQuery.q_drc4 = drcValue;\r
1213                 }\r
1214 \r
1215                 // Subtitle Stuff\r
1216                 if (subtitles.Success != false)\r
1217                     thisQuery.q_subtitles = subtitles.ToString().Replace("-s ", "");\r
1218                 else\r
1219                 {\r
1220                     if (subScan.Success)\r
1221                         thisQuery.q_subtitles = "Autoselect";\r
1222                     else\r
1223                         thisQuery.q_subtitles = "None";\r
1224                 }\r
1225 \r
1226                 thisQuery.q_forcedSubs = forcedSubtitles.Success;\r
1227 \r
1228                 #endregion\r
1229 \r
1230                 #region H.264 and other\r
1231                 //\r
1232                 //H264 Tab\r
1233                 //\r
1234                 if (x264.Success != false)\r
1235                     thisQuery.q_h264 = x264.ToString().Replace("-x ", "");\r
1236 \r
1237                 //\r
1238                 //Progam Options\r
1239                 //\r
1240                 thisQuery.q_verbose = verbose.Success;\r
1241                 #endregion\r
1242             }\r
1243             catch (Exception exc)\r
1244             {\r
1245                 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
1246             }\r
1247             #endregion\r
1248 \r
1249             return thisQuery;\r
1250         }\r
1251 \r
1252         private static string getMixDown(string mixdown)\r
1253         {\r
1254             switch (mixdown)\r
1255             {\r
1256                 case "mono":\r
1257                     return "Mono";\r
1258                 case "stereo":\r
1259                     return "Stereo";\r
1260                 case "dpl1":\r
1261                     return "Dolby Surround";\r
1262                 case "dpl2":\r
1263                     return "Dolby Pro Logic II";\r
1264                 case "6ch":\r
1265                     return "6 Channel Discrete";\r
1266                 default:\r
1267                     return "Automatic";\r
1268             }\r
1269         }\r
1270         private static string getAudioEncoder(string audioEnc)\r
1271         {\r
1272             switch (audioEnc)\r
1273             {\r
1274                 case "faac":\r
1275                     return "AAC";\r
1276                 case "lame":\r
1277                     return "MP3";\r
1278                 case "vorbis":\r
1279                     return "Vorbis";\r
1280                 case "ac3":\r
1281                     return "AC3";\r
1282                 default:\r
1283                     return "AAC";\r
1284             }\r
1285         }\r
1286     }\r
1287 }