|
@@ -8,6 +8,7 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
+using System.Reflection;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
@@ -23,13 +24,14 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
private readonly IZipClient _zipClient;
|
|
|
private readonly IFileSystem _fileSystem;
|
|
|
private readonly NativeEnvironment _environment;
|
|
|
+ private Assembly _ownerAssembly;
|
|
|
|
|
|
private readonly string[] _fontUrls =
|
|
|
{
|
|
|
"https://github.com/MediaBrowser/MediaBrowser.Resources/raw/master/ffmpeg/ARIALUNI.7z"
|
|
|
};
|
|
|
|
|
|
- public FFMpegDownloader(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IZipClient zipClient, IFileSystem fileSystem, NativeEnvironment environment)
|
|
|
+ public FFMpegDownloader(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IZipClient zipClient, IFileSystem fileSystem, NativeEnvironment environment, Assembly ownerAssembly)
|
|
|
{
|
|
|
_logger = logger;
|
|
|
_appPaths = appPaths;
|
|
@@ -37,6 +39,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
_zipClient = zipClient;
|
|
|
_fileSystem = fileSystem;
|
|
|
_environment = environment;
|
|
|
+ _ownerAssembly = ownerAssembly;
|
|
|
}
|
|
|
|
|
|
public async Task<FFMpegInfo> GetFFMpegInfo(NativeEnvironment environment, StartupOptions options, IProgress<double> progress)
|
|
@@ -78,11 +81,11 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
Version = version
|
|
|
};
|
|
|
|
|
|
- _fileSystem.CreateDirectory(versionedDirectoryPath);
|
|
|
+ _fileSystem.CreateDirectory(versionedDirectoryPath);
|
|
|
|
|
|
var excludeFromDeletions = new List<string> { versionedDirectoryPath };
|
|
|
|
|
|
- if (!_fileSystem.FileExists(info.ProbePath) || !_fileSystem.FileExists(info.EncoderPath))
|
|
|
+ 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);
|
|
@@ -106,7 +109,10 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- await DownloadFonts(versionedDirectoryPath).ConfigureAwait(false);
|
|
|
+ if (_environment.OperatingSystem == OperatingSystem.Windows)
|
|
|
+ {
|
|
|
+ await DownloadFonts(versionedDirectoryPath).ConfigureAwait(false);
|
|
|
+ }
|
|
|
|
|
|
DeleteOlderFolders(Path.GetDirectoryName(versionedDirectoryPath), excludeFromDeletions);
|
|
|
|
|
@@ -189,6 +195,21 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
|
|
|
private async Task DownloadFFMpeg(FFMpegDownloadInfo downloadinfo, string directory, IProgress<double> progress)
|
|
|
{
|
|
|
+ if (downloadinfo.IsEmbedded)
|
|
|
+ {
|
|
|
+ var tempFile = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString());
|
|
|
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(tempFile));
|
|
|
+
|
|
|
+ using (var stream = _ownerAssembly.GetManifestResourceStream(downloadinfo.DownloadUrls[0]))
|
|
|
+ {
|
|
|
+ using (var fs = _fileSystem.GetFileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, true))
|
|
|
+ {
|
|
|
+ await stream.CopyToAsync(fs).ConfigureAwait(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ExtractFFMpeg(downloadinfo, tempFile, directory);
|
|
|
+ }
|
|
|
+
|
|
|
foreach (var url in downloadinfo.DownloadUrls)
|
|
|
{
|
|
|
progress.Report(0);
|
|
@@ -216,10 +237,8 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
{
|
|
|
throw new ApplicationException("ffmpeg unvailable. Please install it and start the server with two command line arguments: -ffmpeg \"{PATH}\" and -ffprobe \"{PATH}\"");
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- throw new ApplicationException("Unable to download required components. Please try again later.");
|
|
|
- }
|
|
|
+
|
|
|
+ throw new ApplicationException("Unable to download required components. Please try again later.");
|
|
|
}
|
|
|
|
|
|
private void ExtractFFMpeg(FFMpegDownloadInfo downloadinfo, string tempFile, string targetFolder)
|
|
@@ -228,7 +247,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
|
|
|
var tempFolder = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString());
|
|
|
|
|
|
- _fileSystem.CreateDirectory(tempFolder);
|
|
|
+ _fileSystem.CreateDirectory(tempFolder);
|
|
|
|
|
|
try
|
|
|
{
|
|
@@ -247,7 +266,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
}))
|
|
|
{
|
|
|
var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
|
|
|
- _fileSystem.CopyFile(file, targetFile, true);
|
|
|
+ _fileSystem.CopyFile(file, targetFile, true);
|
|
|
SetFilePermissions(targetFile);
|
|
|
}
|
|
|
}
|
|
@@ -311,13 +330,13 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
{
|
|
|
var fontsDirectory = Path.Combine(targetPath, "fonts");
|
|
|
|
|
|
- _fileSystem.CreateDirectory(fontsDirectory);
|
|
|
+ _fileSystem.CreateDirectory(fontsDirectory);
|
|
|
|
|
|
const string fontFilename = "ARIALUNI.TTF";
|
|
|
|
|
|
var fontFile = Path.Combine(fontsDirectory, fontFilename);
|
|
|
|
|
|
- if (_fileSystem.FileExists(fontFile))
|
|
|
+ if (_fileSystem.FileExists(fontFile))
|
|
|
{
|
|
|
await WriteFontConfigFile(fontsDirectory).ConfigureAwait(false);
|
|
|
}
|
|
@@ -360,7 +379,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- _fileSystem.CopyFile(existingFile, Path.Combine(fontsDirectory, fontFilename), true);
|
|
|
+ _fileSystem.CopyFile(existingFile, Path.Combine(fontsDirectory, fontFilename), true);
|
|
|
return;
|
|
|
}
|
|
|
catch (IOException ex)
|
|
@@ -422,7 +441,7 @@ namespace MediaBrowser.Server.Startup.Common.FFMpeg
|
|
|
const string fontConfigFilename = "fonts.conf";
|
|
|
var fontConfigFile = Path.Combine(fontsDirectory, fontConfigFilename);
|
|
|
|
|
|
- if (!_fileSystem.FileExists(fontConfigFile))
|
|
|
+ if (!_fileSystem.FileExists(fontConfigFile))
|
|
|
{
|
|
|
var contents = string.Format("<?xml version=\"1.0\"?><fontconfig><dir>{0}</dir><alias><family>Arial</family><prefer>Arial Unicode MS</prefer></alias></fontconfig>", fontsDirectory);
|
|
|
|