private FFMpegInfo GetExistingVersion(FFMpegInfo info, string rootEncoderPath) { var encoderFilename = Path.GetFileName(info.EncoderPath); var probeFilename = Path.GetFileName(info.ProbePath); foreach (var directory in Directory.EnumerateDirectories(rootEncoderPath, "*", SearchOption.TopDirectoryOnly) .ToList()) { var allFiles = Directory.EnumerateFiles(directory, "*", SearchOption.AllDirectories).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 void Validate(FFMpegInfo info) { _logger.Info("FFMpeg: {0}", info.EncoderPath); _logger.Info("FFProbe: {0}", info.ProbePath); string cacheKey; try { cacheKey = new FileInfo(info.EncoderPath).Length.ToString(CultureInfo.InvariantCulture).GetMD5().ToString("N"); } catch (IOException) { // This could happen if ffmpeg is coming from a Path variable and we don't have the full path cacheKey = Guid.NewGuid().ToString("N"); } catch { cacheKey = Guid.NewGuid().ToString("N"); } var cachePath = Path.Combine(_appPaths.CachePath, "1" + cacheKey); ValidateCodecs(info.EncoderPath, cachePath); }
public Tuple<List<string>,List<string>> Validate(FFMpegInfo info) { _logger.Info("FFMpeg: {0}", info.EncoderPath); _logger.Info("FFProbe: {0}", info.ProbePath); var decoders = GetDecoders(info.EncoderPath); var encoders = GetEncoders(info.EncoderPath); return new Tuple<List<string>, List<string>>(decoders, encoders); }
public Tuple <List <string>, List <string> > Validate(FFMpegInfo info) { _logger.Info("FFMpeg: {0}", info.EncoderPath); _logger.Info("FFProbe: {0}", info.ProbePath); var decoders = GetDecoders(info.EncoderPath); var encoders = GetEncoders(info.EncoderPath); return(new Tuple <List <string>, List <string> >(decoders, encoders)); }
public async Task<FFMpegInfo> GetFFMpegInfo(NativeEnvironment environment, 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 = "custom" }; } var downloadInfo = FFMpegDownloadInfo.GetInfo(environment); var version = downloadInfo.Version; if (string.Equals(version, "path", StringComparison.OrdinalIgnoreCase)) { return new FFMpegInfo { ProbePath = downloadInfo.FFProbeFilename, EncoderPath = downloadInfo.FFMpegFilename, Version = version }; } 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) { await DownloadFFMpeg(downloadInfo, versionedDirectoryPath, progress).ConfigureAwait(false); } else { // Older version found. // Start with that. Download new version in the background. var newPath = versionedDirectoryPath; Task.Run(() => DownloadFFMpegInBackground(downloadInfo, newPath)); info = existingVersion; versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath); excludeFromDeletions.Add(versionedDirectoryPath); } } await DownloadFonts(versionedDirectoryPath).ConfigureAwait(false); DeleteOlderFolders(Path.GetDirectoryName(versionedDirectoryPath), excludeFromDeletions); // 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; }
private FFMpegInfo GetExistingVersion(FFMpegInfo info, string rootEncoderPath) { var encoderFilename = Path.GetFileName(info.EncoderPath); var probeFilename = Path.GetFileName(info.ProbePath); foreach (var directory in Directory.EnumerateDirectories(rootEncoderPath, "*", SearchOption.TopDirectoryOnly) .ToList()) { var allFiles = Directory.EnumerateFiles(directory, "*", SearchOption.AllDirectories).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(NativeEnvironment environment, 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 = "custom" }); } var downloadInfo = FFMpegDownloadInfo.GetInfo(environment); var version = downloadInfo.Version; if (string.Equals(version, "path", StringComparison.OrdinalIgnoreCase)) { return(new FFMpegInfo { ProbePath = downloadInfo.FFProbeFilename, EncoderPath = downloadInfo.FFMpegFilename, Version = version }); } 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) { await DownloadFFMpeg(downloadInfo, versionedDirectoryPath, progress).ConfigureAwait(false); } else { // Older version found. // Start with that. Download new version in the background. var newPath = versionedDirectoryPath; Task.Run(() => DownloadFFMpegInBackground(downloadInfo, newPath)); info = existingVersion; versionedDirectoryPath = Path.GetDirectoryName(info.EncoderPath); excludeFromDeletions.Add(versionedDirectoryPath); } } await DownloadFonts(versionedDirectoryPath).ConfigureAwait(false); DeleteOlderFolders(Path.GetDirectoryName(versionedDirectoryPath), excludeFromDeletions); return(info); }
public async Task <FFMpegInfo> GetFFMpegInfo(NativeEnvironment environment, 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); } } if (_environment.OperatingSystem == OperatingSystem.Windows) { await DownloadFonts(versionedDirectoryPath).ConfigureAwait(false); } DeleteOlderFolders(Path.GetDirectoryName(versionedDirectoryPath), excludeFromDeletions); // 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); }