From 9caf3119257544d6fb8fd3e1f1cb2b50eba7bd39 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 12 Feb 2021 22:33:10 +0900 Subject: handle plugin manifests automatically --- .../Plugins/PluginManager.cs | 56 +++++++++++++++------- 1 file changed, 39 insertions(+), 17 deletions(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index c26ccfd88..696133c9f 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -1,12 +1,13 @@ #nullable enable + using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Reflection; using System.Text; using System.Text.Json; -using System.Threading.Tasks; using MediaBrowser.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Json; @@ -14,6 +15,7 @@ using MediaBrowser.Common.Json.Converters; using MediaBrowser.Common.Plugins; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Plugins; +using MediaBrowser.Model.Updates; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -332,34 +334,54 @@ namespace Emby.Server.Implementations.Plugins ChangePluginState(plugin, PluginStatus.Malfunctioned); } - /// - /// Saves the manifest back to disk. - /// - /// The to save. - /// The path where to save the manifest. - /// True if successful. + /// public bool SaveManifest(PluginManifest manifest, string path) { - if (manifest == null) - { - return false; - } - try { var data = JsonSerializer.Serialize(manifest, _jsonOptions); File.WriteAllText(Path.Combine(path, "meta.json"), data); return true; } -#pragma warning disable CA1031 // Do not catch general exception types - catch (Exception e) -#pragma warning restore CA1031 // Do not catch general exception types + catch (ArgumentException e) { - _logger.LogWarning(e, "Unable to save plugin manifest. {Path}", path); + _logger.LogWarning(e, "Unable to save plugin manifest due to invalid value. {Path}", path); return false; } } + /// + public bool GenerateManifest(PackageInfo packageInfo, Version version, string path) + { + var versionInfo = packageInfo.Versions.First(v => v.Version == version.ToString()); + var url = packageInfo.ImageUrl ?? string.Empty; + var imageFilename = url.Substring(url.LastIndexOf('/') + 1, url.Length); + + using (var client = new WebClient()) + { + client.DownloadFile(url, Path.Join(path, imageFilename)); + } + + var manifest = new PluginManifest + { + Category = packageInfo.Category, + Changelog = versionInfo.Changelog ?? string.Empty, + Description = packageInfo.Description, + Id = new Guid(packageInfo.Id), + Name = packageInfo.Name, + Overview = packageInfo.Overview, + Owner = packageInfo.Owner, + TargetAbi = versionInfo.TargetAbi ?? string.Empty, + Timestamp = DateTime.Parse(versionInfo.Timestamp ?? string.Empty), + Version = versionInfo.Version, + Status = PluginStatus.Active, + AutoUpdate = true, + ImagePath = Path.Join(path, imageFilename) + }; + + return SaveManifest(manifest, path); + } + /// /// Changes a plugin's load status. /// @@ -410,7 +432,7 @@ namespace Emby.Server.Implementations.Plugins if (plugin == null) { // Create a dummy record for the providers. - // TODO: remove this code, if all provided have been released as separate plugins. + // TODO: remove this code once all provided have been released as separate plugins. plugin = new LocalPlugin( instance.AssemblyFilePath, true, -- cgit v1.2.3 From b18bb3d0de5e459b9bafbc3a67afe6204eca1b08 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 23 Feb 2021 19:22:20 +0900 Subject: update timestamp parse for plugins --- Emby.Server.Implementations/Plugins/PluginManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index 696133c9f..fec7bcb87 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -372,7 +372,7 @@ namespace Emby.Server.Implementations.Plugins Overview = packageInfo.Overview, Owner = packageInfo.Owner, TargetAbi = versionInfo.TargetAbi ?? string.Empty, - Timestamp = DateTime.Parse(versionInfo.Timestamp ?? string.Empty), + Timestamp = string.IsNullOrEmpty(versionInfo.Timestamp) ? DateTime.MinValue : DateTime.Parse(versionInfo.Timestamp), Version = versionInfo.Version, Status = PluginStatus.Active, AutoUpdate = true, -- cgit v1.2.3 From 64cc5889f2be0dae6b0425c569bd84f996a0e435 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 23 Feb 2021 23:11:17 +0900 Subject: add suggested changes --- .../Plugins/PluginManager.cs | 45 ++++++++++++++++++---- .../Updates/InstallationManager.cs | 4 +- MediaBrowser.Common/Plugins/IPluginManager.cs | 2 +- 3 files changed, 41 insertions(+), 10 deletions(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index fec7bcb87..b4ab55157 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -4,14 +4,16 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Reflection; using System.Text; using System.Text.Json; +using System.Threading.Tasks; using MediaBrowser.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Json; using MediaBrowser.Common.Json.Converters; +using MediaBrowser.Common.Net; using MediaBrowser.Common.Plugins; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Plugins; @@ -35,6 +37,21 @@ namespace Emby.Server.Implementations.Plugins private readonly IList _plugins; private readonly Version _minimumVersion; + private IHttpClientFactory? _httpClientFactory; + + private IHttpClientFactory HttpClientFactory + { + get + { + if (_httpClientFactory == null) + { + _httpClientFactory = _appHost.Resolve(); + } + + return _httpClientFactory; + } + } + /// /// Initializes a new instance of the class. /// @@ -351,15 +368,29 @@ namespace Emby.Server.Implementations.Plugins } /// - public bool GenerateManifest(PackageInfo packageInfo, Version version, string path) + public async Task GenerateManifest(PackageInfo packageInfo, Version version, string path) { + if (packageInfo == null) + { + return false; + } + var versionInfo = packageInfo.Versions.First(v => v.Version == version.ToString()); - var url = packageInfo.ImageUrl ?? string.Empty; - var imageFilename = url.Substring(url.LastIndexOf('/') + 1, url.Length); + var imagePath = string.Empty; - using (var client = new WebClient()) + if (!string.IsNullOrEmpty(packageInfo.ImageUrl)) { - client.DownloadFile(url, Path.Join(path, imageFilename)); + var url = new Uri(packageInfo.ImageUrl); + imagePath = Path.Join(path, url.Segments.Last()); + + await using var fileStream = File.OpenWrite(imagePath); + var downloadStream = await HttpClientFactory + .CreateClient(NamedClient.Default) + .GetStreamAsync(url) + .ConfigureAwait(false); + + await downloadStream.CopyToAsync(fileStream).ConfigureAwait(false); + await fileStream.DisposeAsync(); } var manifest = new PluginManifest @@ -376,7 +407,7 @@ namespace Emby.Server.Implementations.Plugins Version = versionInfo.Version, Status = PluginStatus.Active, AutoUpdate = true, - ImagePath = Path.Join(path, imageFilename) + ImagePath = imagePath }; return SaveManifest(manifest, path); diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 534c0aa4b..7af52ea65 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -194,7 +194,7 @@ namespace Emby.Server.Implementations.Updates var plugin = _pluginManager.GetPlugin(packageGuid, version.VersionNumber); if (plugin != null) { - _pluginManager.GenerateManifest(package, version.VersionNumber, plugin.Path); + await _pluginManager.GenerateManifest(package, version.VersionNumber, plugin.Path); } // Remove versions with a target ABI greater then the current application version. @@ -567,7 +567,7 @@ namespace Emby.Server.Implementations.Updates stream.Position = 0; _zipClient.ExtractAllFromZip(stream, targetDir, true); - _pluginManager.GenerateManifest(package.PackageInfo, package.Version, targetDir); + await _pluginManager.GenerateManifest(package.PackageInfo, package.Version, targetDir); _pluginManager.ImportPluginFrom(targetDir); } diff --git a/MediaBrowser.Common/Plugins/IPluginManager.cs b/MediaBrowser.Common/Plugins/IPluginManager.cs index 6f0a0fbfc..fc2fcb517 100644 --- a/MediaBrowser.Common/Plugins/IPluginManager.cs +++ b/MediaBrowser.Common/Plugins/IPluginManager.cs @@ -52,7 +52,7 @@ namespace MediaBrowser.Common.Plugins /// Version to be installed. /// The path where to save the manifest. /// True if successful. - bool GenerateManifest(PackageInfo packageInfo, Version version, string path); + Task GenerateManifest(PackageInfo packageInfo, Version version, string path); /// /// Imports plugin details from a folder. -- cgit v1.2.3 From 454deece13b138e5bcb694732b622be27cb6d204 Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 23 Feb 2021 23:36:49 +0900 Subject: improve performance in the wrong place Co-authored-by: Cody Robibero --- Emby.Server.Implementations/Plugins/PluginManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index b4ab55157..4dc2985d3 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -381,7 +381,7 @@ namespace Emby.Server.Implementations.Plugins if (!string.IsNullOrEmpty(packageInfo.ImageUrl)) { var url = new Uri(packageInfo.ImageUrl); - imagePath = Path.Join(path, url.Segments.Last()); + imagePath = Path.Join(path, url.Segments[^1]); await using var fileStream = File.OpenWrite(imagePath); var downloadStream = await HttpClientFactory -- cgit v1.2.3 From e9030a62fb9bc48f52b9f961d20e972ad300abeb Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 23 Feb 2021 23:37:32 +0900 Subject: remove useless call to dispose Co-authored-by: Cody Robibero --- Emby.Server.Implementations/Plugins/PluginManager.cs | 1 - 1 file changed, 1 deletion(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index 4dc2985d3..b0a8aba16 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -390,7 +390,6 @@ namespace Emby.Server.Implementations.Plugins .ConfigureAwait(false); await downloadStream.CopyToAsync(fileStream).ConfigureAwait(false); - await fileStream.DisposeAsync(); } var manifest = new PluginManifest -- cgit v1.2.3 From fb2d17824225e9849a45bc146fa6e09f3c71b1fb Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 23 Feb 2021 23:39:33 +0900 Subject: add await directive for image download Co-authored-by: Cody Robibero --- Emby.Server.Implementations/Plugins/PluginManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index b0a8aba16..d8dac6599 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -384,7 +384,7 @@ namespace Emby.Server.Implementations.Plugins imagePath = Path.Join(path, url.Segments[^1]); await using var fileStream = File.OpenWrite(imagePath); - var downloadStream = await HttpClientFactory + await using var downloadStream = await HttpClientFactory .CreateClient(NamedClient.Default) .GetStreamAsync(url) .ConfigureAwait(false); -- cgit v1.2.3 From 9bfe945f6c1f41ea3456ae27b1ad31a04f3cea3f Mon Sep 17 00:00:00 2001 From: dkanada Date: Wed, 24 Feb 2021 00:03:26 +0900 Subject: catch http exception and fix possible issues --- Emby.Server.Implementations/Plugins/PluginManager.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'Emby.Server.Implementations/Plugins') diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs index d8dac6599..7bc9f0a7e 100644 --- a/Emby.Server.Implementations/Plugins/PluginManager.cs +++ b/Emby.Server.Implementations/Plugins/PluginManager.cs @@ -384,12 +384,21 @@ namespace Emby.Server.Implementations.Plugins imagePath = Path.Join(path, url.Segments[^1]); await using var fileStream = File.OpenWrite(imagePath); - await using var downloadStream = await HttpClientFactory - .CreateClient(NamedClient.Default) - .GetStreamAsync(url) - .ConfigureAwait(false); - await downloadStream.CopyToAsync(fileStream).ConfigureAwait(false); + try + { + await using var downloadStream = await HttpClientFactory + .CreateClient(NamedClient.Default) + .GetStreamAsync(url) + .ConfigureAwait(false); + + await downloadStream.CopyToAsync(fileStream).ConfigureAwait(false); + } + catch (HttpRequestException ex) + { + _logger.LogError(ex, "Failed to download image to path {Path} on disk.", imagePath); + imagePath = string.Empty; + } } var manifest = new PluginManifest -- cgit v1.2.3