private FFMpegInfo GetExistingVersion(FFMpegInfo info, string rootEncoderPath) { var encoderFilename = Path.GetFileName(info.EncoderPath); var probeFilename = Path.GetFileName(info.ProbePath); foreach (var directory in _fileSystem.GetDirectoryPaths(rootEncoderPath) .ToList()) { var allFiles = _fileSystem.GetFilePaths(directory, true).ToList(); var encoder = allFiles.FirstOrDefault(i => string.Equals(Path.GetFileName(i), encoderFilename, StringComparison.OrdinalIgnoreCase)); var probe = allFiles.FirstOrDefault(i => string.Equals(Path.GetFileName(i), probeFilename, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrWhiteSpace(encoder) && !string.IsNullOrWhiteSpace(probe)) { return(new FFMpegInfo { EncoderPath = encoder, ProbePath = probe, Version = Path.GetFileName(Path.GetDirectoryName(probe)) }); } } return(null); }
public async Task <FFMpegInfo> GetFFMpegInfo(StartupOptions options, IProgress <double> progress) { var customffMpegPath = options.GetOption("-ffmpeg"); var customffProbePath = options.GetOption("-ffprobe"); if (!string.IsNullOrWhiteSpace(customffMpegPath) && !string.IsNullOrWhiteSpace(customffProbePath)) { return(new FFMpegInfo { ProbePath = customffProbePath, EncoderPath = customffMpegPath, Version = "external" }); } var downloadInfo = _ffmpegInstallInfo; var version = downloadInfo.Version; if (string.Equals(version, "path", StringComparison.OrdinalIgnoreCase)) { return(new FFMpegInfo { ProbePath = downloadInfo.FFProbeFilename, EncoderPath = downloadInfo.FFMpegFilename, Version = version }); } if (string.Equals(version, "0", StringComparison.OrdinalIgnoreCase)) { return(new FFMpegInfo()); } var rootEncoderPath = Path.Combine(_appPaths.ProgramDataPath, "ffmpeg"); var versionedDirectoryPath = Path.Combine(rootEncoderPath, version); var info = new FFMpegInfo { ProbePath = Path.Combine(versionedDirectoryPath, downloadInfo.FFProbeFilename), EncoderPath = Path.Combine(versionedDirectoryPath, downloadInfo.FFMpegFilename), Version = version }; _fileSystem.CreateDirectory(versionedDirectoryPath); var excludeFromDeletions = new List <string> { versionedDirectoryPath }; if (!_fileSystem.FileExists(info.ProbePath) || !_fileSystem.FileExists(info.EncoderPath)) { // ffmpeg not present. See if there's an older version we can start with var existingVersion = GetExistingVersion(info, rootEncoderPath); // No older version. Need to download and block until complete if (existingVersion == null) { var success = await DownloadFFMpeg(downloadInfo, versionedDirectoryPath, progress).ConfigureAwait(false); if (!success) { return(new FFMpegInfo()); } } else { info = existingVersion; versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath); excludeFromDeletions.Add(versionedDirectoryPath); } } // Allow just one of these to be overridden, if desired. if (!string.IsNullOrWhiteSpace(customffMpegPath)) { info.EncoderPath = customffMpegPath; } if (!string.IsNullOrWhiteSpace(customffProbePath)) { info.EncoderPath = customffProbePath; } return(info); }
public FFMpegInfo GetFFMpegInfo(StartupOptions options) { var customffMpegPath = options.GetOption("-ffmpeg"); var customffProbePath = options.GetOption("-ffprobe"); if (!string.IsNullOrWhiteSpace(customffMpegPath) && !string.IsNullOrWhiteSpace(customffProbePath)) { return(new FFMpegInfo { ProbePath = customffProbePath, EncoderPath = customffMpegPath, Version = "external" }); } var downloadInfo = _ffmpegInstallInfo; var prebuiltFolder = _appPaths.ProgramSystemPath; var prebuiltffmpeg = Path.Combine(prebuiltFolder, downloadInfo.FFMpegFilename); var prebuiltffprobe = Path.Combine(prebuiltFolder, downloadInfo.FFProbeFilename); if (File.Exists(prebuiltffmpeg) && File.Exists(prebuiltffprobe)) { return(new FFMpegInfo { ProbePath = prebuiltffprobe, EncoderPath = prebuiltffmpeg, Version = "external" }); } var version = downloadInfo.Version; if (string.Equals(version, "0", StringComparison.OrdinalIgnoreCase)) { return(new FFMpegInfo()); } var rootEncoderPath = Path.Combine(_appPaths.ProgramDataPath, "ffmpeg"); var versionedDirectoryPath = Path.Combine(rootEncoderPath, version); var info = new FFMpegInfo { ProbePath = Path.Combine(versionedDirectoryPath, downloadInfo.FFProbeFilename), EncoderPath = Path.Combine(versionedDirectoryPath, downloadInfo.FFMpegFilename), Version = version }; Directory.CreateDirectory(versionedDirectoryPath); var excludeFromDeletions = new List <string> { versionedDirectoryPath }; if (!File.Exists(info.ProbePath) || !File.Exists(info.EncoderPath)) { // ffmpeg not present. See if there's an older version we can start with var existingVersion = GetExistingVersion(info, rootEncoderPath); // No older version. Need to download and block until complete if (existingVersion == null) { return(new FFMpegInfo()); } else { info = existingVersion; versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath); excludeFromDeletions.Add(versionedDirectoryPath); } } // Allow just one of these to be overridden, if desired. if (!string.IsNullOrWhiteSpace(customffMpegPath)) { info.EncoderPath = customffMpegPath; } if (!string.IsNullOrWhiteSpace(customffProbePath)) { info.ProbePath = customffProbePath; } return(info); }