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;
}
}
}