Add CD Audio extraction job.
This commit is contained in:
parent
8ca9734298
commit
73cecd2722
@ -13,6 +13,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
private ConversionState state = ConversionState.Unknown;
|
private ConversionState state = ConversionState.Unknown;
|
||||||
private string errorMessage = string.Empty;
|
private string errorMessage = string.Empty;
|
||||||
private string initialInputPath = string.Empty;
|
private string initialInputPath = string.Empty;
|
||||||
|
private string userState = string.Empty;
|
||||||
|
|
||||||
public ConversionJob()
|
public ConversionJob()
|
||||||
{
|
{
|
||||||
@ -75,6 +76,20 @@ namespace FileConverter.ConversionJobs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string UserState
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.userState;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected set
|
||||||
|
{
|
||||||
|
this.userState = value;
|
||||||
|
this.NotifyPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public float Progress
|
public float Progress
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -103,7 +118,20 @@ namespace FileConverter.ConversionJobs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PrepareConversion(string inputFilePath)
|
protected virtual InputPostConversionAction InputPostConversionAction
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (this.ConversionPreset == null)
|
||||||
|
{
|
||||||
|
return InputPostConversionAction.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.ConversionPreset.InputPostConversionAction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrepareConversion(string inputFilePath, string outputFilePath = null)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(inputFilePath))
|
if (string.IsNullOrEmpty(inputFilePath))
|
||||||
{
|
{
|
||||||
@ -120,17 +148,17 @@ namespace FileConverter.ConversionJobs
|
|||||||
string extensionCategory = PathHelpers.GetExtensionCategory(extension);
|
string extensionCategory = PathHelpers.GetExtensionCategory(extension);
|
||||||
if (!PathHelpers.IsOutputTypeCompatibleWithCategory(this.ConversionPreset.OutputType, extensionCategory))
|
if (!PathHelpers.IsOutputTypeCompatibleWithCategory(this.ConversionPreset.OutputType, extensionCategory))
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("The input file type is not compatible with the output file type.");
|
this.ConversionFailed("The input file type is not compatible with the output file type.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.initialInputPath = inputFilePath;
|
this.initialInputPath = inputFilePath;
|
||||||
this.InputFilePath = inputFilePath;
|
this.InputFilePath = inputFilePath;
|
||||||
this.OutputFilePath = this.ConversionPreset.GenerateOutputFilePath(inputFilePath);
|
this.OutputFilePath = outputFilePath ?? this.ConversionPreset.GenerateOutputFilePath(inputFilePath);
|
||||||
|
|
||||||
if (!PathHelpers.IsPathValid(this.OutputFilePath))
|
if (!PathHelpers.IsPathValid(this.OutputFilePath))
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("Invalid output path generated by output file path template.");
|
this.ConversionFailed("Invalid output path generated by output file path template.");
|
||||||
Diagnostics.Log(string.Format("Invalid output path generated: {0} from input: {1}.", this.OutputFilePath, this.InputFilePath));
|
Diagnostics.Log(string.Format("Invalid output path generated: {0} from input: {1}.", this.OutputFilePath, this.InputFilePath));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -164,7 +192,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("Invalid output path generated by output file path template.");
|
this.ConversionFailed("Invalid output path generated by output file path template.");
|
||||||
Diagnostics.Log(string.Format("Can't create directories for path {0}", this.OutputFilePath));
|
Diagnostics.Log(string.Format("Can't create directories for path {0}", this.OutputFilePath));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -179,7 +207,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("Can't generate a valid output filename.");
|
this.ConversionFailed("Can't generate a valid output filename.");
|
||||||
Diagnostics.Log(exception.Message);
|
Diagnostics.Log(exception.Message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -190,6 +218,8 @@ namespace FileConverter.ConversionJobs
|
|||||||
{
|
{
|
||||||
this.State = ConversionState.Ready;
|
this.State = ConversionState.Ready;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.UserState = "In Queue";
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartConvertion()
|
public void StartConvertion()
|
||||||
@ -207,7 +237,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
Diagnostics.Log("Convert file {0} to {1}.", this.InputFilePath, this.OutputFilePath);
|
Diagnostics.Log("Convert file {0} to {1}.", this.InputFilePath, this.OutputFilePath);
|
||||||
|
|
||||||
this.State = ConversionState.InProgress;
|
this.State = ConversionState.InProgress;
|
||||||
|
|
||||||
this.Convert();
|
this.Convert();
|
||||||
|
|
||||||
if (this.State != ConversionState.Failed)
|
if (this.State != ConversionState.Failed)
|
||||||
@ -229,7 +259,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
Diagnostics.Log("Conversion Succeed!");
|
Diagnostics.Log("Conversion Succeed!");
|
||||||
|
|
||||||
// Apply the input post conversion action.
|
// Apply the input post conversion action.
|
||||||
switch (this.ConversionPreset.InputPostConversionAction)
|
switch (this.InputPostConversionAction)
|
||||||
{
|
{
|
||||||
case InputPostConversionAction.None:
|
case InputPostConversionAction.None:
|
||||||
break;
|
break;
|
||||||
@ -258,12 +288,14 @@ namespace FileConverter.ConversionJobs
|
|||||||
|
|
||||||
this.Progress = 1f;
|
this.Progress = 1f;
|
||||||
this.State = ConversionState.Done;
|
this.State = ConversionState.Done;
|
||||||
|
this.UserState = "Done";
|
||||||
Diagnostics.Log("Conversion Done!");
|
Diagnostics.Log("Conversion Done!");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void ConvertionFailed(string exitingMessage)
|
protected void ConversionFailed(string exitingMessage)
|
||||||
{
|
{
|
||||||
this.State = ConversionState.Failed;
|
this.State = ConversionState.Failed;
|
||||||
|
this.UserState = "Failed";
|
||||||
this.ErrorMessage = exitingMessage;
|
this.ErrorMessage = exitingMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,9 +4,20 @@ namespace FileConverter.ConversionJobs
|
|||||||
{
|
{
|
||||||
public static class ConversionJobFactory
|
public static class ConversionJobFactory
|
||||||
{
|
{
|
||||||
public static ConversionJob Create(ConversionPreset conversionPreset)
|
public static ConversionJob Create(ConversionPreset conversionPreset, string inputFilePath)
|
||||||
{
|
{
|
||||||
ConversionJob conversionJob = new ConversionJob_FFMPEG(conversionPreset);
|
ConversionJob conversionJob = null;
|
||||||
|
|
||||||
|
string extension = System.IO.Path.GetExtension(inputFilePath);
|
||||||
|
extension = extension.ToLowerInvariant().Substring(1, extension.Length - 1);
|
||||||
|
if (extension == "cda")
|
||||||
|
{
|
||||||
|
conversionJob = new ConversionJob_ExtractCDA(conversionPreset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
conversionJob = new ConversionJob_FFMPEG(conversionPreset);
|
||||||
|
}
|
||||||
|
|
||||||
return conversionJob;
|
return conversionJob;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,205 @@
|
|||||||
|
// <copyright file="ConversionJob_ExtractCDA.cs" company="AAllard">License: http://www.gnu.org/licenses/gpl.html GPL version 3.</copyright>
|
||||||
|
|
||||||
|
namespace FileConverter.ConversionJobs
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
using Ripper;
|
||||||
|
|
||||||
|
using WaveLib;
|
||||||
|
using Yeti.MMedia;
|
||||||
|
|
||||||
|
public class ConversionJob_ExtractCDA : ConversionJob
|
||||||
|
{
|
||||||
|
private Ripper.CDDrive cdDrive;
|
||||||
|
private int cdaTrackNumber = -1;
|
||||||
|
private WaveWriter waveWriter;
|
||||||
|
private string intermediateFilePath;
|
||||||
|
private ConversionJob compressionConversionJob;
|
||||||
|
private System.Threading.Thread compressionThread;
|
||||||
|
|
||||||
|
public ConversionJob_ExtractCDA() : base()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConversionJob_ExtractCDA(ConversionPreset conversionPreset) : base(conversionPreset)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override InputPostConversionAction InputPostConversionAction
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return InputPostConversionAction.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
if (this.ConversionPreset == null)
|
||||||
|
{
|
||||||
|
throw new Exception("The conversion preset must be valid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve and check drive letter.
|
||||||
|
string pathDriveLetter = PathHelpers.GetPathDriveLetter(this.InputFilePath);
|
||||||
|
if (pathDriveLetter.Length == 0)
|
||||||
|
{
|
||||||
|
this.ConversionFailed("Can't retrieve input path drive letter.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char driveLetter = pathDriveLetter[0];
|
||||||
|
|
||||||
|
this.cdDrive = new Ripper.CDDrive();
|
||||||
|
this.cdDrive.CDRemoved += new EventHandler(this.CdDriveCdRemoved);
|
||||||
|
|
||||||
|
bool driveLetterFound = false;
|
||||||
|
char[] driveLetters = Ripper.CDDrive.GetCDDriveLetters();
|
||||||
|
for (int index = 0; index < driveLetters.Length; index++)
|
||||||
|
{
|
||||||
|
driveLetterFound |= driveLetters[index] == driveLetter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!driveLetterFound)
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("Invalid drive letter {0}.", driveLetter));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve and track number.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.cdaTrackNumber = PathHelpers.GetCDATrackNumber(this.InputFilePath);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("Can't retrieve the track number from input path '{0}'.", this.InputFilePath));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.cdDrive.IsOpened)
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("CD drive already used."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.cdDrive.Open(driveLetter))
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("Fail to open cd drive {0}.", driveLetter));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate intermediate file path.
|
||||||
|
string fileName = Path.GetFileName(this.OutputFilePath);
|
||||||
|
string tempPath = Path.GetTempPath();
|
||||||
|
this.intermediateFilePath = PathHelpers.GenerateUniquePath(tempPath + fileName + ".wav");
|
||||||
|
|
||||||
|
// Sub conversion job (for compression).
|
||||||
|
this.compressionConversionJob = ConversionJobFactory.Create(this.ConversionPreset, this.intermediateFilePath);
|
||||||
|
this.compressionConversionJob.PrepareConversion(this.intermediateFilePath, this.OutputFilePath);
|
||||||
|
this.compressionThread = new Thread(this.CompressAsync);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Convert()
|
||||||
|
{
|
||||||
|
if (this.ConversionPreset == null)
|
||||||
|
{
|
||||||
|
throw new Exception("The conversion preset must be valid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Diagnostics.Log("Starting CDA extraction.");
|
||||||
|
|
||||||
|
this.UserState = "Extraction";
|
||||||
|
|
||||||
|
if (!this.cdDrive.IsCDReady())
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("CD drive is not ready."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.cdDrive.Refresh())
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("Can't refresh CD drive data."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.cdDrive.LockCD())
|
||||||
|
{
|
||||||
|
this.ConversionFailed(string.Format("Can't lock cd."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WaveFormat waveFormat = new WaveFormat(44100, 16, 2);
|
||||||
|
|
||||||
|
using (Stream waveStream = new FileStream(this.intermediateFilePath, FileMode.Create, FileAccess.Write))
|
||||||
|
using (this.waveWriter = new WaveWriter(waveStream, waveFormat, this.cdDrive.TrackSize(this.cdaTrackNumber)))
|
||||||
|
{
|
||||||
|
this.cdDrive.ReadTrack(this.cdaTrackNumber, this.WriteWaveData, this.CdReadProgress);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.waveWriter = null;
|
||||||
|
|
||||||
|
this.cdDrive.UnLockCD();
|
||||||
|
|
||||||
|
this.cdDrive.Close();
|
||||||
|
|
||||||
|
if (!File.Exists(this.intermediateFilePath))
|
||||||
|
{
|
||||||
|
this.ConversionFailed("Extraction failed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Diagnostics.Log("CDA extracted to {0}.", this.intermediateFilePath);
|
||||||
|
Diagnostics.Log(string.Empty);
|
||||||
|
Diagnostics.Log("Start compression.");
|
||||||
|
|
||||||
|
this.UserState = "Conversion";
|
||||||
|
|
||||||
|
this.compressionThread.Start();
|
||||||
|
|
||||||
|
while (this.compressionConversionJob.State != ConversionState.Done &&
|
||||||
|
this.compressionConversionJob.State != ConversionState.Failed)
|
||||||
|
{
|
||||||
|
this.Progress = this.compressionConversionJob.Progress;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.compressionConversionJob.State == ConversionState.Failed)
|
||||||
|
{
|
||||||
|
this.ConversionFailed(this.compressionConversionJob.ErrorMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Diagnostics.Log(string.Empty);
|
||||||
|
Diagnostics.Log("Delete intermediate file {0}.", this.intermediateFilePath);
|
||||||
|
|
||||||
|
File.Delete(this.intermediateFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WriteWaveData(object sender, DataReadEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
this.waveWriter?.Write(eventArgs.Data, 0, (int)eventArgs.DataSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CdReadProgress(object sender, ReadProgressEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
this.Progress = (float)eventArgs.BytesRead / (float)eventArgs.Bytes2Read;
|
||||||
|
|
||||||
|
eventArgs.CancelRead |= this.State != ConversionState.InProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CdDriveCdRemoved(object sender, System.EventArgs eventArgs)
|
||||||
|
{
|
||||||
|
this.ConversionFailed("The CD has been ejected.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CompressAsync()
|
||||||
|
{
|
||||||
|
this.compressionConversionJob.StartConvertion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -249,6 +249,5 @@ namespace FileConverter.ConversionJobs
|
|||||||
|
|
||||||
throw new Exception("Unknown VBR bitrate.");
|
throw new Exception("Unknown VBR bitrate.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
string ffmpegPath = string.Format("{0}\\ffmpeg.exe", applicationDirectory);
|
string ffmpegPath = string.Format("{0}\\ffmpeg.exe", applicationDirectory);
|
||||||
if (!System.IO.File.Exists(ffmpegPath))
|
if (!System.IO.File.Exists(ffmpegPath))
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("Can't find ffmpeg executable. You should try to reinstall the application.");
|
this.ConversionFailed("Can't find ffmpeg executable. You should try to reinstall the application.");
|
||||||
Diagnostics.Log("Can't find ffmpeg executable ({0}). Try to reinstall the application.", ffmpegPath);
|
Diagnostics.Log("Can't find ffmpeg executable ({0}). Try to reinstall the application.", ffmpegPath);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -164,9 +164,10 @@ namespace FileConverter.ConversionJobs
|
|||||||
throw new Exception("The conversion preset must be valid.");
|
throw new Exception("The conversion preset must be valid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Diagnostics.Log("Convert file {0} to {1}.", this.InputFilePath, this.OutputFilePath);
|
this.UserState = "Conversion";
|
||||||
Diagnostics.Log(string.Empty);
|
|
||||||
Diagnostics.Log("Execute command: {0} {1}.", this.ffmpegProcessStartInfo.FileName, this.ffmpegProcessStartInfo.Arguments);
|
Diagnostics.Log("Execute command: {0} {1}.", this.ffmpegProcessStartInfo.FileName, this.ffmpegProcessStartInfo.Arguments);
|
||||||
|
Diagnostics.Log(string.Empty);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -189,7 +190,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
this.ConvertionFailed("Failed to launch FFMPEG process.");
|
this.ConversionFailed("Failed to launch FFMPEG process.");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,7 +228,7 @@ namespace FileConverter.ConversionJobs
|
|||||||
|
|
||||||
if (input.Contains("Exiting."))
|
if (input.Contains("Exiting."))
|
||||||
{
|
{
|
||||||
this.ConvertionFailed(input);
|
this.ConversionFailed(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,10 @@
|
|||||||
<Reference Include="Accessibility" />
|
<Reference Include="Accessibility" />
|
||||||
<Reference Include="PresentationUI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
<Reference Include="PresentationUI, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
|
||||||
<Reference Include="ReachFramework" />
|
<Reference Include="ReachFramework" />
|
||||||
|
<Reference Include="Ripper, Version=1.0.5806.33932, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\Middleware\Ripper.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Deployment" />
|
<Reference Include="System.Deployment" />
|
||||||
@ -67,6 +71,9 @@
|
|||||||
<Reference Include="WindowsBase" />
|
<Reference Include="WindowsBase" />
|
||||||
<Reference Include="PresentationCore" />
|
<Reference Include="PresentationCore" />
|
||||||
<Reference Include="PresentationFramework" />
|
<Reference Include="PresentationFramework" />
|
||||||
|
<Reference Include="yeti.mmedia">
|
||||||
|
<HintPath>..\..\Middleware\yeti.mmedia.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ApplicationDefinition Include="Application.xaml">
|
<ApplicationDefinition Include="Application.xaml">
|
||||||
@ -76,6 +83,7 @@
|
|||||||
<Compile Include="Controls\EncodingQualitySliderControl.xaml.cs">
|
<Compile Include="Controls\EncodingQualitySliderControl.xaml.cs">
|
||||||
<DependentUpon>EncodingQualitySliderControl.xaml</DependentUpon>
|
<DependentUpon>EncodingQualitySliderControl.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="ConversionJobs\ConversionJob_ExtractCDA.cs" />
|
||||||
<Compile Include="ConversionJobs\ConversionJobFactory.cs" />
|
<Compile Include="ConversionJobs\ConversionJobFactory.cs" />
|
||||||
<Compile Include="ConversionJobs\ConversionJob_FFMPEG.Converters.cs" />
|
<Compile Include="ConversionJobs\ConversionJob_FFMPEG.Converters.cs" />
|
||||||
<Compile Include="ConversionJobs\ConversionJob_FFMPEG.cs" />
|
<Compile Include="ConversionJobs\ConversionJob_FFMPEG.cs" />
|
||||||
|
@ -8,6 +8,7 @@ namespace FileConverter
|
|||||||
public static class PathHelpers
|
public static class PathHelpers
|
||||||
{
|
{
|
||||||
private static Regex driveLetterRegex = new Regex(@"[a-zA-Z]:\\");
|
private static Regex driveLetterRegex = new Regex(@"[a-zA-Z]:\\");
|
||||||
|
private static Regex cdaTrackNumberRegex = new Regex(@"[a-zA-Z]:\\Track([0-9]+)\.cda");
|
||||||
private static Regex pathRegex = new Regex(@"^[a-zA-Z]:\\(?:[^\\/:*?""<>|\r\n]+\\)*[^\.\\/:*?""<>|\r\n][^\\/:*?""<>|\r\n]*$");
|
private static Regex pathRegex = new Regex(@"^[a-zA-Z]:\\(?:[^\\/:*?""<>|\r\n]+\\)*[^\.\\/:*?""<>|\r\n][^\\/:*?""<>|\r\n]*$");
|
||||||
private static Regex filenameRegex = new Regex(@"[^\\]*", RegexOptions.RightToLeft);
|
private static Regex filenameRegex = new Regex(@"[^\\]*", RegexOptions.RightToLeft);
|
||||||
private static Regex directoryRegex = new Regex(@"(?:([^\\]*)\\)*");
|
private static Regex directoryRegex = new Regex(@"(?:([^\\]*)\\)*");
|
||||||
@ -17,6 +18,18 @@ namespace FileConverter
|
|||||||
return PathHelpers.driveLetterRegex.IsMatch(path);
|
return PathHelpers.driveLetterRegex.IsMatch(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetPathDriveLetter(string path)
|
||||||
|
{
|
||||||
|
return PathHelpers.driveLetterRegex.Match(path).Groups[0].Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int GetCDATrackNumber(string path)
|
||||||
|
{
|
||||||
|
Match match = PathHelpers.cdaTrackNumberRegex.Match(path);
|
||||||
|
string stringNumber = match.Groups[1].Value;
|
||||||
|
return int.Parse(stringNumber);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool IsPathValid(string path)
|
public static bool IsPathValid(string path)
|
||||||
{
|
{
|
||||||
return PathHelpers.pathRegex.IsMatch(path);
|
return PathHelpers.pathRegex.IsMatch(path);
|
||||||
@ -88,7 +101,6 @@ namespace FileConverter
|
|||||||
case "png":
|
case "png":
|
||||||
case "tiff":
|
case "tiff":
|
||||||
return InputCategoryNames.Image;
|
return InputCategoryNames.Image;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return InputCategoryNames.Misc;
|
return InputCategoryNames.Misc;
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
<TextBlock Text="{Binding ErrorMessage}" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" />
|
<TextBlock Text="{Binding ErrorMessage}" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding State}" FontWeight="Bold" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" />
|
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding UserState}" FontWeight="Bold" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" />
|
||||||
|
|
||||||
<ProgressBar Grid.Row="1" Grid.Column="1" Height="18" Width="Auto" Minimum="0" Maximum="1" SmallChange="0.001" Value="{Binding Progress, Mode=OneWay}" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" MinWidth="100" LargeChange="0.1" />
|
<ProgressBar Grid.Row="1" Grid.Column="1" Height="18" Width="Auto" Minimum="0" Maximum="1" SmallChange="0.001" Value="{Binding Progress, Mode=OneWay}" Foreground="{Binding State, ConverterParameter=Foreground, Converter={StaticResource ConversionStateToColor}}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" MinWidth="100" LargeChange="0.1" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2012
|
# Visual Studio 14
|
||||||
|
VisualStudioVersion = 14.0.23107.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileConverter", "Application\FileConverter\FileConverter.csproj", "{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileConverter", "Application\FileConverter\FileConverter.csproj", "{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{F14673DF-DF38-44B4-AB1D-99A59182C24C}"
|
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{F14673DF-DF38-44B4-AB1D-99A59182C24C}"
|
||||||
@ -9,32 +11,44 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileConverterExtension", "A
|
|||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
Debug|x86 = Debug|x86
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x64.Build.0 = Debug|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x86.Build.0 = Debug|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x64.ActiveCfg = Release|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x64.Build.0 = Release|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x86.ActiveCfg = Release|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x86.Build.0 = Release|Any CPU
|
{D27A76D2-43E4-43CC-9DA3-334B0B46F4E5}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x64.ActiveCfg = Debug|x64
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x64.Build.0 = Debug|x64
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x64.Build.0 = Debug|x64
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x86.ActiveCfg = Debug|x86
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x86.Build.0 = Debug|x86
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x64.ActiveCfg = Release|x64
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x64.ActiveCfg = Release|x64
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x64.Build.0 = Release|x64
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x64.Build.0 = Release|x64
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x86.ActiveCfg = Release|x86
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x86.ActiveCfg = Release|x86
|
||||||
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x86.Build.0 = Release|x86
|
{F14673DF-DF38-44B4-AB1D-99A59182C24C}.Release|x86.Build.0 = Release|x86
|
||||||
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x64.Build.0 = Debug|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x86.Build.0 = Debug|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x64.ActiveCfg = Release|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x64.Build.0 = Release|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x86.ActiveCfg = Release|Any CPU
|
{0C44CA69-42D6-4357-BDFD-83069D1ABA2F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
<Component Id="RegistryEntries" Guid="{C3EF3D67-0206-4DBD-B2EA-78FF2E290093}">
|
<Component Id="RegistryEntries" Guid="{C3EF3D67-0206-4DBD-B2EA-78FF2E290093}">
|
||||||
<RegistryKey Root="HKCU" Key="Software\FileConverter">
|
<RegistryKey Root="HKCU" Key="Software\FileConverter">
|
||||||
<RegistryValue Name="Path" Type="string" Value="[INSTALLFOLDER]FileConverter.exe"/>
|
<RegistryValue Name="Path" Type="string" Value="[INSTALLFOLDER]FileConverter.exe"/>
|
||||||
<RegistryValue Name="CompatibleInputExtensions" Type="string" Value="aac;aiff;ape;avi;bmp;flac;flv;jpg;jpeg;m4a;mkv;mov;mp3;mp4;ogg;png;tiff;wav;wma"/>
|
<RegistryValue Name="CompatibleInputExtensions" Type="string" Value="aac;aiff;ape;avi;bmp;cda;flac;flv;jpg;jpeg;m4a;mkv;mov;mp3;mp4;ogg;png;tiff;wav;wma"/>
|
||||||
</RegistryKey>
|
</RegistryKey>
|
||||||
|
|
||||||
<RegistryKey Root="HKCU" Key="Software\FileConverter\aiff">
|
<RegistryKey Root="HKCU" Key="Software\FileConverter\aiff">
|
||||||
|
BIN
Middleware/Ripper.dll
Normal file
BIN
Middleware/Ripper.dll
Normal file
Binary file not shown.
BIN
Middleware/yeti.mmedia.dll
Normal file
BIN
Middleware/yeti.mmedia.dll
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user