|  | @@ -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<LocalPlugin> _plugins;
 | 
	
		
			
				|  |  |          private readonly Version _minimumVersion;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        private IHttpClientFactory? _httpClientFactory;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private IHttpClientFactory HttpClientFactory
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            get
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                if (_httpClientFactory == null)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    _httpClientFactory = _appHost.Resolve<IHttpClientFactory>();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                return _httpClientFactory;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// Initializes a new instance of the <see cref="PluginManager"/> class.
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
	
		
			
				|  | @@ -351,15 +368,29 @@ namespace Emby.Server.Implementations.Plugins
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <inheritdoc/>
 | 
	
		
			
				|  |  | -        public bool GenerateManifest(PackageInfo packageInfo, Version version, string path)
 | 
	
		
			
				|  |  | +        public async Task<bool> 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);
 |