using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; namespace Handbrake.Functions { class QueryParser { // All the Main Window GUI options #region Varibles private string q_source; /// /// Returns a String /// Full path of the source. /// public string Source { get { return this.q_source; } } private string q_destination; /// /// Returns a String /// Full path of the destination. /// public string Destination { get { return this.q_destination; } } private int q_dvdTitle; /// /// Returns an Integer /// DVD Title number. /// public int DVDTitle { get { return this.q_dvdTitle; } } private string q_dvdChapters; /// /// Returns an String /// DVD Chapter number or chapter range. /// public string DVDChapters { get { return this.q_dvdChapters; } } private string q_videoEncoder; /// /// Returns an String /// The Video Encoder used. /// public string VideoEncoder { get { return this.q_videoEncoder; } } private string q_audioEncoder; /// /// Returns an String /// The Audio Encoder used. /// public string AudioEncoder { get { return this.q_audioEncoder; } } private int q_videoWidth; /// /// Returns an Integer /// The selected Width for the encoding. /// public int Width { get { return this.q_videoWidth; } } private int q_videoHeight; /// /// Returns an Integer /// The selected Height for the encoding. /// public int Height { get { return this.q_videoHeight; } } private string q_cropValues; /// /// Returns an String /// Cropping values. /// public string CropValues { get { return this.q_cropValues; } } private Boolean q_detelecine; /// /// Returns a boolean to indicate wither DeTelecine is on or off /// public Boolean DeTelecine { get { return this.q_detelecine; } } private Boolean q_deBlock; /// /// Returns a boolean to indicate wither DeBlock is on or off. /// public Boolean DeBlock { get { return this.q_deBlock; } } private string q_deinterlace; /// /// Returns a string with the De-Interlace option used. /// public string DeInterlace { get { return this.q_deinterlace; } } private string q_denoise; /// /// Returns a string with the DeNoise option used. /// public string DeNoise { get { return this.q_denoise; } } private Boolean q_anamorphic; /// /// Returns a boolean to indicate wither Anamorphic is on or off. /// public Boolean Anamorphic { get { return this.q_anamorphic; } } private Boolean q_chapterMarkers; /// /// Returns a boolean to indicate wither Chapter Markers is on or off. /// public Boolean ChapterMarkers { get { return this.q_chapterMarkers; } } private Boolean q_grayscale; /// /// Returns a boolean to indicate wither Grayscale is on or off. /// public Boolean Grayscale { get { return this.q_grayscale; } } private Boolean q_twoPass; /// /// Returns a boolean to indicate wither Two Pass Encoding is on or off. /// public Boolean TwoPass { get { return this.q_twoPass; } } private Boolean q_turboFirst; /// /// Returns a boolean to indicate wither Chapter Markers is on or off. /// public Boolean TurboFirstPass { get { return this.q_turboFirst; } } private Boolean q_largeMp4; /// /// Returns a boolean to indicate wither Larger MP4 files is on or off. /// public Boolean LargeMP4 { get { return this.q_largeMp4; } } private string q_videoFramerate; /// /// Returns a string with the video Framerate /// public string VideoFramerate { get { return this.q_videoFramerate; } } private string q_avgBitrate; /// /// Returns a string with the average video bitrate /// public string AverageVideoBitrate { get { return this.q_avgBitrate; } } private string q_videoTargetSize; /// /// Returns a string with the video target size /// public string VideoTargetSize { get { return this.q_videoTargetSize; } } private int q_videoQuality; /// /// Returns a int with the video quality value /// public int VideoQuality { get { return this.q_videoQuality; } } private Boolean q_crf; /// /// Returns a boolean to indicate if CRF is on or off. /// public Boolean CRF { get { return this.q_crf; } } private string q_audioBitrate; /// /// Returns a string with the audio bitrate /// public string AudioBitrate { get { return this.q_audioBitrate; } } private string q_audioSamplerate; /// /// Returns a string with the audio sample rate /// public string AudioSampleBitrate { get { return this.q_audioSamplerate; } } private string q_audioTrack1; /// /// Returns a string with the First selected Audio track /// public string AudioTrack1 { get { return this.q_audioTrack1; } } private string q_audioTrackMix; /// /// Returns a string with the First selected Audio track Mix /// public string AudioTrackMix { get { return this.q_audioTrackMix; } } private string q_subtitles; /// /// Returns a string with the selected subtitle track /// public string Subtitles { get { return this.q_subtitles; } } private string q_h264; /// /// Returns a string with the Advanced H264 query string /// public string H264Query { get { return this.q_h264; } } private Boolean q_verbose; /// /// Returns a string with the Advanced H264 query string /// public Boolean Verbose { get { return this.q_verbose; } } #endregion // Takes in a query which can be in any order and parses it. All varibles are then set so they can be used elsewhere. public static QueryParser Parse(String input) { QueryParser thisQuery = new QueryParser(); // Example Input // -i "C:\Documents and Settings\Scott\Desktop\Files\DVD\Test Image.iso" //-t 1 -c 3-5 -o "C:\test.mp4" -e x264 -E faac -w 720 -l 400 --crop 0:0:0:0 //-s 1 --deinterlace="1:-1:1" -g -m -b 2500 -2 -r 25 -T -4 --deblock --detelecine //--denoise=7:7:5:5 -x bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2 -B 160 -R 48 -a 1 -6 stereo -v //-q 0.45 -Q -S 2134 //Source Regex r1 = new Regex(@"(-i)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")"); Match source = r1.Match(input.Replace('"', '\"')); Match title = Regex.Match(input, @"-t ([0-9]*)"); Match chapters = Regex.Match(input, @"-c ([0-9-]*)"); //Destination Regex r2 = new Regex(@"(-o)(?:\s\"")([a-zA-Z0-9:\\\s\.]+)(?:\"")"); Match destination = r2.Match(input.Replace('"', '\"')); Match width = Regex.Match(input, @"-w ([0-9]*)"); Match height = Regex.Match(input, @"-l ([0-9]*)"); Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)"); Match audioEncoder = Regex.Match(input, @"-E ([a-zA-Z0-9]*)"); //Picture Settings Tab Match deinterlace = Regex.Match(input, @"--deinterlace=([0-9:-]*)"); // DOES NOT WORK. Needs Fixed Match denoise = Regex.Match(input, @"--denoise=([0-9:]*)"); Match deblock = Regex.Match(input, @"--deblock"); Match detelecine = Regex.Match(input, @"--detelecine"); Match anamorphic = Regex.Match(input, @"-p"); Match chapterMarkers = Regex.Match(input, @"-m"); Match crop = Regex.Match(input, @"--crop ([0-9]):([0-9]):([0-9]):([0-9])"); //Video Settings Tab Match videoFramerate = Regex.Match(input, @"-r ([0-9]*)"); Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)"); Match videoQuality = Regex.Match(input, @"-q ([0-9.]*)"); Match videoFilesize = Regex.Match(input, @"-S ([0-9.]*)"); Match CRF = Regex.Match(input, @"-Q"); Match twoPass = Regex.Match(input, @"-2"); Match turboFirstPass = Regex.Match(input, @"-T"); Match grayscale = Regex.Match(input, @"-g"); Match largerMp4 = Regex.Match(input, @"-4"); //Audio Settings Tab Match subtitles = Regex.Match(input, @"-s ([0-9]*)"); Match audioBitrate = Regex.Match(input, @"-B ([0-9]*)"); Match audioSampleRate = Regex.Match(input, @"-R ([0-9.]*)"); Match audioChannelsMix = Regex.Match(input, @"-6 ([a-zA-Z0-9]*)"); Match audioChannel = Regex.Match(input, @"-a ([0-9]*)"); //H264 Tab Match x264 = Regex.Match(input, @"-x ([a-zA-Z0-9=:-]*)"); //Program Options Match verbose = Regex.Match(input, @"-v"); // ### NOTES ### // The following code needs alot of error handling added to it at some point. // May be an idea to add additional options such as CPU etc later. try { //Source thisQuery.q_source = source.ToString(); thisQuery.q_dvdTitle = int.Parse(title.ToString().Replace("-t ", "")); thisQuery.q_dvdChapters = chapters.ToString(); //Destination thisQuery.q_destination = destination.ToString(); thisQuery.q_videoEncoder = videoEncoder.ToString(); thisQuery.q_audioEncoder = audioEncoder.ToString(); thisQuery.q_videoWidth = int.Parse(width.ToString().Replace("-w ", "")); thisQuery.q_videoHeight = int.Parse(height.ToString().Replace("-l ", "")); //Picture Settings Tab thisQuery.q_cropValues = crop.ToString(); thisQuery.q_detelecine = detelecine.Success; thisQuery.q_deBlock = deblock.Success; thisQuery.q_deinterlace = deinterlace.ToString(); thisQuery.q_denoise = denoise.ToString(); thisQuery.q_anamorphic = anamorphic.Success; thisQuery.q_chapterMarkers = chapterMarkers.Success; //Video Settings Tab thisQuery.q_grayscale = grayscale.Success; thisQuery.q_twoPass = twoPass.Success; thisQuery.q_turboFirst = turboFirstPass.Success; thisQuery.q_largeMp4 = largerMp4.Success; thisQuery.q_videoFramerate = videoFramerate.ToString(); thisQuery.q_avgBitrate = videoBitrate.ToString(); thisQuery.q_videoTargetSize = videoFilesize.ToString(); thisQuery.q_videoQuality = int.Parse(videoQuality.ToString()); thisQuery.q_crf = CRF.Success; //Audio Settings Tab thisQuery.q_audioBitrate = audioBitrate.ToString(); thisQuery.q_audioSamplerate = audioSampleRate.ToString(); thisQuery.q_audioTrack1 = audioChannel.ToString(); thisQuery.q_audioTrackMix = audioChannelsMix.ToString(); thisQuery.q_subtitles = subtitles.ToString(); //H264 Tab thisQuery.q_h264 = x264.ToString(); //Progam Options thisQuery.q_verbose = verbose.Success; } catch (Exception exc) { MessageBox.Show(exc.ToString()); } return thisQuery; } } }