diff options
4 files changed, 34 insertions, 50 deletions
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index d408e082a..4991db8e2 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -230,8 +230,6 @@ <EmbeddedResource Include="MediaEncoder\readme.txt" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="MediaEncoder\fonts\ARIALUNI.TTF" /> - <EmbeddedResource Include="MediaEncoder\fonts\fonts.conf" /> <EmbeddedResource Include="MediaEncoder\ffmpeg20130813.zip" /> <None Include="packages.config" /> </ItemGroup> diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs index f5b5ea6c0..6c2e9606a 100644 --- a/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs +++ b/MediaBrowser.Server.Implementations/MediaEncoder/MediaEncoder.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; +using MediaBrowser.Common.Net; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; @@ -47,6 +48,8 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// <value>The json serializer.</value> private readonly IJsonSerializer _jsonSerializer; + private readonly IHttpClient _httpClient; + /// <summary> /// The video image resource pool /// </summary> @@ -81,12 +84,13 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder /// <param name="appPaths">The app paths.</param> /// <param name="jsonSerializer">The json serializer.</param> public MediaEncoder(ILogger logger, IZipClient zipClient, IApplicationPaths appPaths, - IJsonSerializer jsonSerializer) + IJsonSerializer jsonSerializer, IHttpClient httpClient) { _logger = logger; _zipClient = zipClient; _appPaths = appPaths; _jsonSerializer = jsonSerializer; + _httpClient = httpClient; // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | @@ -201,15 +205,16 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder _zipClient.ExtractAll(resourceStream, targetPath, false); } - ExtractFonts(assembly, targetPath); + ExtractFonts(targetPath); } + private const string FontUrl = "https://www.dropbox.com/s/9nb76tybcsw5xrk/ARIALUNI.zip?dl=1"; + /// <summary> /// Extracts the fonts. /// </summary> - /// <param name="assembly">The assembly.</param> /// <param name="targetPath">The target path.</param> - private async void ExtractFonts(Assembly assembly, string targetPath) + private async void ExtractFonts(string targetPath) { var fontsDirectory = Path.Combine(targetPath, "fonts"); @@ -224,54 +229,44 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder if (!File.Exists(fontFile)) { - using (var stream = assembly.GetManifestResourceStream(GetType().Namespace + ".fonts." + fontFilename)) + var tempFile = await _httpClient.GetTempFile(new HttpRequestOptions { - using ( - var fileStream = new FileStream(fontFile, FileMode.Create, FileAccess.Write, FileShare.Read, - StreamDefaults.DefaultFileStreamBufferSize, - FileOptions.Asynchronous)) - { - await stream.CopyToAsync(fileStream).ConfigureAwait(false); - } + Url = FontUrl, + Progress = new Progress<double>() + }); + + _zipClient.ExtractAll(tempFile, fontsDirectory, true); + + try + { + File.Delete(tempFile); + } + catch (IOException ex) + { + // Log this, but don't let it fail the operation + _logger.ErrorException("Error deleting temp file {0}", ex, tempFile); } } - await ExtractFontConfigFile(assembly, fontsDirectory).ConfigureAwait(false); + await WriteFontConfigFile(fontsDirectory).ConfigureAwait(false); } - /// <summary> - /// Extracts the font config file. - /// </summary> - /// <param name="assembly">The assembly.</param> - /// <param name="fontsDirectory">The fonts directory.</param> - /// <returns>Task.</returns> - private async Task ExtractFontConfigFile(Assembly assembly, string fontsDirectory) + private async Task WriteFontConfigFile(string fontsDirectory) { const string fontConfigFilename = "fonts.conf"; var fontConfigFile = Path.Combine(fontsDirectory, fontConfigFilename); if (!File.Exists(fontConfigFile)) { - using ( - var stream = assembly.GetManifestResourceStream(GetType().Namespace + ".fonts." + fontConfigFilename) - ) - { - using (var streamReader = new StreamReader(stream)) - { - var contents = await streamReader.ReadToEndAsync().ConfigureAwait(false); + var contents = string.Format("<?xml version=\"1.0\"?><fontconfig><dir>{0}</dir><alias><family>Arial</family><prefer>Arial Unicode MS</prefer></alias></fontconfig>", fontsDirectory); - contents = contents.Replace("<dir></dir>", "<dir>" + fontsDirectory + "</dir>"); + var bytes = Encoding.UTF8.GetBytes(contents); - var bytes = Encoding.UTF8.GetBytes(contents); - - using ( - var fileStream = new FileStream(fontConfigFile, FileMode.Create, FileAccess.Write, - FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, - FileOptions.Asynchronous)) - { - await fileStream.WriteAsync(bytes, 0, bytes.Length); - } - } + using (var fileStream = new FileStream(fontConfigFile, FileMode.Create, FileAccess.Write, + FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, + FileOptions.Asynchronous)) + { + await fileStream.WriteAsync(bytes, 0, bytes.Length); } } } diff --git a/MediaBrowser.Server.Implementations/MediaEncoder/fonts/fonts.conf b/MediaBrowser.Server.Implementations/MediaEncoder/fonts/fonts.conf deleted file mode 100644 index 648bdb7b2..000000000 --- a/MediaBrowser.Server.Implementations/MediaEncoder/fonts/fonts.conf +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0"?> -<fontconfig> - -<dir></dir> - <alias> - <family>Arial</family> - <prefer>Arial Unicode MS</prefer> - </alias> -</fontconfig>
\ No newline at end of file diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 099b9a3df..eb8a73049 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -272,7 +272,7 @@ namespace MediaBrowser.ServerApplication RegisterSingleInstance<ILibrarySearchEngine>(() => new LuceneSearchEngine(ApplicationPaths, LogManager, LibraryManager)); - MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ZipClient, ApplicationPaths, JsonSerializer); + MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ZipClient, ApplicationPaths, JsonSerializer, HttpClient); RegisterSingleInstance(MediaEncoder); var clientConnectionManager = new SessionManager(UserDataRepository, ServerConfigurationManager, Logger, UserRepository); |
