瀏覽代碼

Fix all warnings in MediaBrowser.Providers

Bond_009 2 年之前
父節點
當前提交
b934b346e1
共有 21 個文件被更改,包括 194 次插入165 次删除
  1. 2 1
      MediaBrowser.Providers/Manager/ImageSaver.cs
  2. 23 17
      MediaBrowser.Providers/Manager/ItemImageProvider.cs
  3. 11 8
      MediaBrowser.Providers/Manager/ProviderManager.cs
  4. 0 4
      MediaBrowser.Providers/MediaBrowser.Providers.csproj
  5. 1 1
      MediaBrowser.Providers/MediaInfo/EmbeddedImageProvider.cs
  6. 2 2
      MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
  7. 12 11
      MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumImageProvider.cs
  8. 22 14
      MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumProvider.cs
  9. 8 5
      MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistImageProvider.cs
  10. 25 17
      MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistProvider.cs
  11. 19 17
      MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs
  12. 20 8
      MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs
  13. 9 3
      MediaBrowser.Providers/Plugins/StudioImages/StudiosImageProvider.cs
  14. 2 2
      MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs
  15. 3 3
      MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieImageProvider.cs
  16. 1 6
      MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonImageProvider.cs
  17. 1 5
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs
  18. 1 5
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonImageProvider.cs
  19. 3 3
      MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs
  20. 19 29
      MediaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs
  21. 10 4
      MediaBrowser.Providers/Subtitles/SubtitleManager.cs

+ 2 - 1
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -264,7 +264,8 @@ namespace MediaBrowser.Providers.Manager
                 var fileStreamOptions = AsyncFile.WriteOptions;
                 fileStreamOptions.Mode = FileMode.Create;
                 fileStreamOptions.PreallocationSize = source.Length;
-                await using (var fs = new FileStream(path, fileStreamOptions))
+                var fs = new FileStream(path, fileStreamOptions);
+                await using (fs.ConfigureAwait(false))
                 {
                     await source.CopyToAsync(fs, cancellationToken).ConfigureAwait(false);
                 }

+ 23 - 17
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -502,15 +502,17 @@ namespace MediaBrowser.Providers.Manager
                         break;
                     }
 
-                    await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-
-                    await _providerManager.SaveImage(
-                        item,
-                        stream,
-                        response.Content.Headers.ContentType?.MediaType,
-                        type,
-                        null,
-                        cancellationToken).ConfigureAwait(false);
+                    var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+                    await using (stream.ConfigureAwait(false))
+                    {
+                        await _providerManager.SaveImage(
+                            item,
+                            stream,
+                            response.Content.Headers.ContentType?.MediaType,
+                            type,
+                            null,
+                            cancellationToken).ConfigureAwait(false);
+                    }
 
                     result.UpdateType |= ItemUpdateType.ImageUpdate;
                     return true;
@@ -626,14 +628,18 @@ namespace MediaBrowser.Providers.Manager
                         }
                     }
 
-                    await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-                    await _providerManager.SaveImage(
-                        item,
-                        stream,
-                        response.Content.Headers.ContentType?.MediaType,
-                        imageType,
-                        null,
-                        cancellationToken).ConfigureAwait(false);
+                    var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+                    await using (stream.ConfigureAwait(false))
+                    {
+                        await _providerManager.SaveImage(
+                            item,
+                            stream,
+                            response.Content.Headers.ContentType?.MediaType,
+                            imageType,
+                            null,
+                            cancellationToken).ConfigureAwait(false);
+                    }
+
                     result.UpdateType |= ItemUpdateType.ImageUpdate;
                 }
                 catch (HttpRequestException)

+ 11 - 8
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -182,14 +182,17 @@ namespace MediaBrowser.Providers.Manager
                 contentType = MimeTypes.GetMimeType(url);
             }
 
-            await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-            await SaveImage(
-                item,
-                stream,
-                contentType,
-                type,
-                imageIndex,
-                cancellationToken).ConfigureAwait(false);
+            var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+            await using (stream.ConfigureAwait(false))
+            {
+                await SaveImage(
+                    item,
+                    stream,
+                    contentType,
+                    type,
+                    imageIndex,
+                    cancellationToken).ConfigureAwait(false);
+            }
         }
 
         /// <inheritdoc/>

+ 0 - 4
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -34,10 +34,6 @@
     <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
-    <CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
-  </PropertyGroup>
-
   <!-- Code Analyzers-->
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
     <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.3">

+ 1 - 1
MediaBrowser.Providers/MediaInfo/EmbeddedImageProvider.cs

@@ -140,7 +140,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
             if (attachmentStream is not null)
             {
-                return await ExtractAttachment(item, attachmentStream, mediaSource, cancellationToken);
+                return await ExtractAttachment(item, attachmentStream, mediaSource, cancellationToken).ConfigureAwait(false);
             }
 
             // Fall back to EmbeddedImage streams

+ 2 - 2
MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs

@@ -557,7 +557,7 @@ namespace MediaBrowser.Providers.MediaInfo
             CancellationToken cancellationToken)
         {
             var startIndex = currentStreams.Count == 0 ? 0 : (currentStreams.Select(i => i.Index).Max() + 1);
-            var externalSubtitleStreams = await _subtitleResolver.GetExternalStreamsAsync(video, startIndex, options.DirectoryService, false, cancellationToken);
+            var externalSubtitleStreams = await _subtitleResolver.GetExternalStreamsAsync(video, startIndex, options.DirectoryService, false, cancellationToken).ConfigureAwait(false);
 
             var enableSubtitleDownloading = options.MetadataRefreshMode == MetadataRefreshMode.Default ||
                                             options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh;
@@ -611,7 +611,7 @@ namespace MediaBrowser.Providers.MediaInfo
                 // Rescan
                 if (downloadedLanguages.Count > 0)
                 {
-                    externalSubtitleStreams = await _subtitleResolver.GetExternalStreamsAsync(video, startIndex, options.DirectoryService, true, cancellationToken);
+                    externalSubtitleStreams = await _subtitleResolver.GetExternalStreamsAsync(video, startIndex, options.DirectoryService, true, cancellationToken).ConfigureAwait(false);
                 }
             }
 

+ 12 - 11
MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumImageProvider.cs

@@ -4,6 +4,7 @@
 
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using System.Net.Http;
 using System.Text.Json;
 using System.Threading;
@@ -42,11 +43,8 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
         /// <inheritdoc />
         public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
         {
-            return new List<ImageType>
-            {
-                ImageType.Primary,
-                ImageType.Disc
-            };
+            yield return ImageType.Primary;
+            yield return ImageType.Disc;
         }
 
         /// <inheritdoc />
@@ -60,16 +58,19 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
 
                 var path = AudioDbAlbumProvider.GetAlbumInfoPath(_config.ApplicationPaths, id);
 
-                await using FileStream jsonStream = AsyncFile.OpenRead(path);
-                var obj = await JsonSerializer.DeserializeAsync<AudioDbAlbumProvider.RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-
-                if (obj is not null && obj.album is not null && obj.album.Count > 0)
+                FileStream jsonStream = AsyncFile.OpenRead(path);
+                await using (jsonStream.ConfigureAwait(false))
                 {
-                    return GetImages(obj.album[0]);
+                    var obj = await JsonSerializer.DeserializeAsync<AudioDbAlbumProvider.RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+
+                    if (obj is not null && obj.album is not null && obj.album.Count > 0)
+                    {
+                        return GetImages(obj.album[0]);
+                    }
                 }
             }
 
-            return new List<RemoteImageInfo>();
+            return Enumerable.Empty<RemoteImageInfo>();
         }
 
         private IEnumerable<RemoteImageInfo> GetImages(AudioDbAlbumProvider.Album item)

+ 22 - 14
MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumProvider.cs

@@ -68,14 +68,17 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
 
                 var path = GetAlbumInfoPath(_config.ApplicationPaths, id);
 
-                await using FileStream jsonStream = AsyncFile.OpenRead(path);
-                var obj = await JsonSerializer.DeserializeAsync<RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-
-                if (obj is not null && obj.album is not null && obj.album.Count > 0)
+                FileStream jsonStream = AsyncFile.OpenRead(path);
+                await using (jsonStream.ConfigureAwait(false))
                 {
-                    result.Item = new MusicAlbum();
-                    result.HasMetadata = true;
-                    ProcessResult(result.Item, obj.album[0], info.MetadataLanguage);
+                    var obj = await JsonSerializer.DeserializeAsync<RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+
+                    if (obj is not null && obj.album is not null && obj.album.Count > 0)
+                    {
+                        result.Item = new MusicAlbum();
+                        result.HasMetadata = true;
+                        ProcessResult(result.Item, obj.album[0], info.MetadataLanguage);
+                    }
                 }
             }
 
@@ -173,13 +176,18 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
             Directory.CreateDirectory(Path.GetDirectoryName(path));
 
             using var response = await _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken).ConfigureAwait(false);
-            await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-
-            var fileStreamOptions = AsyncFile.WriteOptions;
-            fileStreamOptions.Mode = FileMode.Create;
-            fileStreamOptions.PreallocationSize = stream.Length;
-            await using var xmlFileStream = new FileStream(path, fileStreamOptions);
-            await stream.CopyToAsync(xmlFileStream, cancellationToken).ConfigureAwait(false);
+            var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+            await using (stream.ConfigureAwait(false))
+            {
+                var fileStreamOptions = AsyncFile.WriteOptions;
+                fileStreamOptions.Mode = FileMode.Create;
+                fileStreamOptions.PreallocationSize = stream.Length;
+                var xmlFileStream = new FileStream(path, fileStreamOptions);
+                await using (xmlFileStream.ConfigureAwait(false))
+                {
+                    await stream.CopyToAsync(xmlFileStream, cancellationToken).ConfigureAwait(false);
+                }
+            }
         }
 
         private static string GetAlbumDataPath(IApplicationPaths appPaths, string musicBrainzReleaseGroupId)

+ 8 - 5
MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistImageProvider.cs

@@ -62,12 +62,15 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
 
                 var path = AudioDbArtistProvider.GetArtistInfoPath(_config.ApplicationPaths, id);
 
-                await using FileStream jsonStream = AsyncFile.OpenRead(path);
-                var obj = await JsonSerializer.DeserializeAsync<AudioDbArtistProvider.RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-
-                if (obj is not null && obj.artists is not null && obj.artists.Count > 0)
+                FileStream jsonStream = AsyncFile.OpenRead(path);
+                await using (jsonStream.ConfigureAwait(false))
                 {
-                    return GetImages(obj.artists[0]);
+                    var obj = await JsonSerializer.DeserializeAsync<AudioDbArtistProvider.RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+
+                    if (obj is not null && obj.artists is not null && obj.artists.Count > 0)
+                    {
+                        return GetImages(obj.artists[0]);
+                    }
                 }
             }
 

+ 25 - 17
MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistProvider.cs

@@ -67,14 +67,17 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
 
                 var path = GetArtistInfoPath(_config.ApplicationPaths, id);
 
-                await using FileStream jsonStream = AsyncFile.OpenRead(path);
-                var obj = await JsonSerializer.DeserializeAsync<RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-
-                if (obj is not null && obj.artists is not null && obj.artists.Count > 0)
+                FileStream jsonStream = AsyncFile.OpenRead(path);
+                await using (jsonStream.ConfigureAwait(false))
                 {
-                    result.Item = new MusicArtist();
-                    result.HasMetadata = true;
-                    ProcessResult(result.Item, obj.artists[0], info.MetadataLanguage);
+                    var obj = await JsonSerializer.DeserializeAsync<RootObject>(jsonStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+
+                    if (obj is not null && obj.artists is not null && obj.artists.Count > 0)
+                    {
+                        result.Item = new MusicArtist();
+                        result.HasMetadata = true;
+                        ProcessResult(result.Item, obj.artists[0], info.MetadataLanguage);
+                    }
                 }
             }
 
@@ -151,16 +154,21 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
 
             using var response = await _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken).ConfigureAwait(false);
             response.EnsureSuccessStatusCode();
-            await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-
-            var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
-            Directory.CreateDirectory(Path.GetDirectoryName(path));
-
-            var fileStreamOptions = AsyncFile.WriteOptions;
-            fileStreamOptions.Mode = FileMode.Create;
-            fileStreamOptions.PreallocationSize = stream.Length;
-            await using var xmlFileStream = new FileStream(path, fileStreamOptions);
-            await stream.CopyToAsync(xmlFileStream, cancellationToken).ConfigureAwait(false);
+            var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+            await using (stream.ConfigureAwait(false))
+            {
+                var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
+                Directory.CreateDirectory(Path.GetDirectoryName(path));
+
+                var fileStreamOptions = AsyncFile.WriteOptions;
+                fileStreamOptions.Mode = FileMode.Create;
+                fileStreamOptions.PreallocationSize = stream.Length;
+                var xmlFileStream = new FileStream(path, fileStreamOptions);
+                await using (xmlFileStream.ConfigureAwait(false))
+                {
+                    await stream.CopyToAsync(xmlFileStream, cancellationToken).ConfigureAwait(false);
+                }
+            }
         }
 
         /// <summary>

+ 19 - 17
MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs

@@ -137,29 +137,31 @@ namespace MediaBrowser.Providers.Plugins.Omdb
             var url = OmdbProvider.GetOmdbUrl(urlQuery.ToString());
 
             using var response = await _httpClientFactory.CreateClient(NamedClient.Default).GetAsync(url, cancellationToken).ConfigureAwait(false);
-            await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
-
-            if (isSearch)
+            var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
+            await using (stream.ConfigureAwait(false))
             {
-                var searchResultList = await JsonSerializer.DeserializeAsync<SearchResultList>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-                if (searchResultList?.Search is not null)
+                if (isSearch)
                 {
-                    var resultCount = searchResultList.Search.Count;
-                    var result = new RemoteSearchResult[resultCount];
-                    for (var i = 0; i < resultCount; i++)
+                    var searchResultList = await JsonSerializer.DeserializeAsync<SearchResultList>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+                    if (searchResultList?.Search is not null)
                     {
-                        result[i] = ResultToMetadataResult(searchResultList.Search[i], searchInfo, indexNumberEnd);
+                        var resultCount = searchResultList.Search.Count;
+                        var result = new RemoteSearchResult[resultCount];
+                        for (var i = 0; i < resultCount; i++)
+                        {
+                            result[i] = ResultToMetadataResult(searchResultList.Search[i], searchInfo, indexNumberEnd);
+                        }
+
+                        return result;
                     }
-
-                    return result;
                 }
-            }
-            else
-            {
-                var result = await JsonSerializer.DeserializeAsync<SearchResult>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
-                if (string.Equals(result?.Response, "true", StringComparison.OrdinalIgnoreCase))
+                else
                 {
-                    return new[] { ResultToMetadataResult(result, searchInfo, indexNumberEnd) };
+                    var result = await JsonSerializer.DeserializeAsync<SearchResult>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+                    if (string.Equals(result?.Response, "true", StringComparison.OrdinalIgnoreCase))
+                    {
+                        return new[] { ResultToMetadataResult(result, searchInfo, indexNumberEnd) };
+                    }
                 }
             }
 

+ 20 - 8
MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs

@@ -234,15 +234,21 @@ namespace MediaBrowser.Providers.Plugins.Omdb
         internal async Task<RootObject> GetRootObject(string imdbId, CancellationToken cancellationToken)
         {
             var path = await EnsureItemInfo(imdbId, cancellationToken).ConfigureAwait(false);
-            await using var stream = AsyncFile.OpenRead(path);
-            return await JsonSerializer.DeserializeAsync<RootObject>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            var stream = AsyncFile.OpenRead(path);
+            await using (stream.ConfigureAwait(false))
+            {
+                return await JsonSerializer.DeserializeAsync<RootObject>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            }
         }
 
         internal async Task<SeasonRootObject> GetSeasonRootObject(string imdbId, int seasonId, CancellationToken cancellationToken)
         {
             var path = await EnsureSeasonInfo(imdbId, seasonId, cancellationToken).ConfigureAwait(false);
-            await using var stream = AsyncFile.OpenRead(path);
-            return await JsonSerializer.DeserializeAsync<SeasonRootObject>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            var stream = AsyncFile.OpenRead(path);
+            await using (stream.ConfigureAwait(false))
+            {
+                return await JsonSerializer.DeserializeAsync<SeasonRootObject>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            }
         }
 
         /// <summary>Gets OMDB URL.</summary>
@@ -317,8 +323,11 @@ namespace MediaBrowser.Providers.Plugins.Omdb
                     imdbParam));
 
             var rootObject = await _httpClientFactory.CreateClient(NamedClient.Default).GetFromJsonAsync<RootObject>(url, _jsonOptions, cancellationToken).ConfigureAwait(false);
-            await using FileStream jsonFileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
-            await JsonSerializer.SerializeAsync(jsonFileStream, rootObject, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            FileStream jsonFileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
+            await using (jsonFileStream.ConfigureAwait(false))
+            {
+                await JsonSerializer.SerializeAsync(jsonFileStream, rootObject, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            }
 
             return path;
         }
@@ -357,8 +366,11 @@ namespace MediaBrowser.Providers.Plugins.Omdb
                     seasonId));
 
             var rootObject = await _httpClientFactory.CreateClient(NamedClient.Default).GetFromJsonAsync<SeasonRootObject>(url, _jsonOptions, cancellationToken).ConfigureAwait(false);
-            await using FileStream jsonFileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
-            await JsonSerializer.SerializeAsync(jsonFileStream, rootObject, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            FileStream jsonFileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
+            await using (jsonFileStream.ConfigureAwait(false))
+            {
+                await JsonSerializer.SerializeAsync(jsonFileStream, rootObject, _jsonOptions, cancellationToken).ConfigureAwait(false);
+            }
 
             return path;
         }

+ 9 - 3
MediaBrowser.Providers/Plugins/StudioImages/StudiosImageProvider.cs

@@ -138,9 +138,15 @@ namespace MediaBrowser.Providers.Plugins.StudioImages
                 var httpClient = _httpClientFactory.CreateClient(NamedClient.Default);
 
                 Directory.CreateDirectory(Path.GetDirectoryName(file));
-                await using var response = await httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false);
-                await using var fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
-                await response.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);
+                var response = await httpClient.GetStreamAsync(url, cancellationToken).ConfigureAwait(false);
+                await using (response.ConfigureAwait(false))
+                {
+                    var fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None, IODefaults.FileStreamBufferSize, FileOptions.Asynchronous);
+                    await using (fileStream.ConfigureAwait(false))
+                    {
+                        await response.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);
+                    }
+                }
             }
 
             return file;

+ 2 - 2
MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetImageProvider.cs

@@ -81,8 +81,8 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets
             var backdrops = collection.Images.Backdrops;
             var remoteImages = new List<RemoteImageInfo>(posters.Count + backdrops.Count);
 
-            _tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language, remoteImages);
-            _tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language, remoteImages);
+            remoteImages.AddRange(_tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language));
+            remoteImages.AddRange(_tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language));
 
             return remoteImages;
         }

+ 3 - 3
MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieImageProvider.cs

@@ -100,9 +100,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
             var logos = movie.Images.Logos;
             var remoteImages = new List<RemoteImageInfo>(posters.Count + backdrops.Count + logos.Count);
 
-            _tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language, remoteImages);
-            _tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language, remoteImages);
-            _tmdbClientManager.ConvertLogosToRemoteImageInfo(logos, language, remoteImages);
+            remoteImages.AddRange(_tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language));
+            remoteImages.AddRange(_tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language));
+            remoteImages.AddRange(_tmdbClientManager.ConvertLogosToRemoteImageInfo(logos, language));
 
             return remoteImages;
         }

+ 1 - 6
MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonImageProvider.cs

@@ -69,12 +69,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
                 return Enumerable.Empty<RemoteImageInfo>();
             }
 
-            var profiles = personResult.Images.Profiles;
-            var remoteImages = new List<RemoteImageInfo>(profiles.Count);
-
-            _tmdbClientManager.ConvertProfilesToRemoteImageInfo(profiles, language, remoteImages);
-
-            return remoteImages;
+            return _tmdbClientManager.ConvertProfilesToRemoteImageInfo(personResult.Images.Profiles, language);
         }
 
         /// <inheritdoc />

+ 1 - 5
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbEpisodeImageProvider.cs

@@ -89,11 +89,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
                 return Enumerable.Empty<RemoteImageInfo>();
             }
 
-            var remoteImages = new List<RemoteImageInfo>(stills.Count);
-
-            _tmdbClientManager.ConvertStillsToRemoteImageInfo(stills, language, remoteImages);
-
-            return remoteImages;
+            return _tmdbClientManager.ConvertStillsToRemoteImageInfo(stills, language);
         }
 
         /// <inheritdoc />

+ 1 - 5
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeasonImageProvider.cs

@@ -80,11 +80,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
                 return Enumerable.Empty<RemoteImageInfo>();
             }
 
-            var remoteImages = new List<RemoteImageInfo>(posters.Count);
-
-            _tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language, remoteImages);
-
-            return remoteImages;
+            return _tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language);
         }
 
         /// <inheritdoc />

+ 3 - 3
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesImageProvider.cs

@@ -83,9 +83,9 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
             var logos = series.Images.Logos;
             var remoteImages = new List<RemoteImageInfo>(posters.Count + backdrops.Count + logos.Count);
 
-            _tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language, remoteImages);
-            _tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language, remoteImages);
-            _tmdbClientManager.ConvertLogosToRemoteImageInfo(logos, language, remoteImages);
+            remoteImages.AddRange(_tmdbClientManager.ConvertPostersToRemoteImageInfo(posters, language));
+            remoteImages.AddRange(_tmdbClientManager.ConvertBackdropsToRemoteImageInfo(backdrops, language));
+            remoteImages.AddRange(_tmdbClientManager.ConvertLogosToRemoteImageInfo(logos, language));
 
             return remoteImages;
         }

+ 19 - 29
MediaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs

@@ -531,55 +531,45 @@ namespace MediaBrowser.Providers.Plugins.Tmdb
         /// </summary>
         /// <param name="images">The input images.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        public void ConvertPostersToRemoteImageInfo(List<ImageData> images, string requestLanguage, List<RemoteImageInfo> results)
-        {
-            ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.PosterSize, ImageType.Primary, requestLanguage, results);
-        }
+        /// <returns>The remote images.</returns>
+        public IEnumerable<RemoteImageInfo> ConvertPostersToRemoteImageInfo(IReadOnlyList<ImageData> images, string requestLanguage)
+            => ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.PosterSize, ImageType.Primary, requestLanguage);
 
         /// <summary>
         /// Converts backdrop <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s.
         /// </summary>
         /// <param name="images">The input images.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        public void ConvertBackdropsToRemoteImageInfo(List<ImageData> images, string requestLanguage, List<RemoteImageInfo> results)
-        {
-            ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.BackdropSize, ImageType.Backdrop, requestLanguage, results);
-        }
+        /// <returns>The remote images.</returns>
+        public IEnumerable<RemoteImageInfo> ConvertBackdropsToRemoteImageInfo(IReadOnlyList<ImageData> images, string requestLanguage)
+            => ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.BackdropSize, ImageType.Backdrop, requestLanguage);
 
         /// <summary>
         /// Converts logo <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s.
         /// </summary>
         /// <param name="images">The input images.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        public void ConvertLogosToRemoteImageInfo(List<ImageData> images, string requestLanguage, List<RemoteImageInfo> results)
-        {
-            ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.LogoSize, ImageType.Logo, requestLanguage, results);
-        }
+        /// <returns>The remote images.</returns>
+        public IEnumerable<RemoteImageInfo> ConvertLogosToRemoteImageInfo(IReadOnlyList<ImageData> images, string requestLanguage)
+            => ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.LogoSize, ImageType.Logo, requestLanguage);
 
         /// <summary>
         /// Converts profile <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s.
         /// </summary>
         /// <param name="images">The input images.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        public void ConvertProfilesToRemoteImageInfo(List<ImageData> images, string requestLanguage, List<RemoteImageInfo> results)
-        {
-            ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.ProfileSize, ImageType.Primary, requestLanguage, results);
-        }
+        /// <returns>The remote images.</returns>
+        public IEnumerable<RemoteImageInfo> ConvertProfilesToRemoteImageInfo(IReadOnlyList<ImageData> images, string requestLanguage)
+            => ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.ProfileSize, ImageType.Primary, requestLanguage);
 
         /// <summary>
         /// Converts still <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s.
         /// </summary>
         /// <param name="images">The input images.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        public void ConvertStillsToRemoteImageInfo(List<ImageData> images, string requestLanguage, List<RemoteImageInfo> results)
-        {
-            ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.StillSize, ImageType.Primary, requestLanguage, results);
-        }
+        /// <returns>The remote images.</returns>
+        public IEnumerable<RemoteImageInfo> ConvertStillsToRemoteImageInfo(IReadOnlyList<ImageData> images, string requestLanguage)
+            => ConvertToRemoteImageInfo(images, Plugin.Instance.Configuration.StillSize, ImageType.Primary, requestLanguage);
 
         /// <summary>
         /// Converts <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s.
@@ -588,8 +578,8 @@ namespace MediaBrowser.Providers.Plugins.Tmdb
         /// <param name="size">The size of the image to fetch.</param>
         /// <param name="type">The type of the image.</param>
         /// <param name="requestLanguage">The requested language.</param>
-        /// <param name="results">The collection to add the remote images into.</param>
-        private void ConvertToRemoteImageInfo(List<ImageData> images, string size, ImageType type, string requestLanguage, List<RemoteImageInfo> results)
+        /// <returns>The remote images.</returns>
+        private IEnumerable<RemoteImageInfo> ConvertToRemoteImageInfo(IReadOnlyList<ImageData> images, string size, ImageType type, string requestLanguage)
         {
             // sizes provided are for original resolution, don't store them when downloading scaled images
             var scaleImage = !string.Equals(size, "original", StringComparison.OrdinalIgnoreCase);
@@ -598,7 +588,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb
             {
                 var image = images[i];
 
-                results.Add(new RemoteImageInfo
+                yield return new RemoteImageInfo
                 {
                     Url = GetUrl(size, image.FilePath),
                     CommunityRating = image.VoteAverage,
@@ -609,7 +599,7 @@ namespace MediaBrowser.Providers.Plugins.Tmdb
                     ProviderName = TmdbUtils.ProviderName,
                     Type = type,
                     RatingType = RatingType.Score
-                });
+                };
             }
         }
 

+ 10 - 4
MediaBrowser.Providers/Subtitles/SubtitleManager.cs

@@ -188,10 +188,16 @@ namespace MediaBrowser.Providers.Subtitles
         {
             var saveInMediaFolder = libraryOptions.SaveSubtitlesWithMedia;
 
-            await using var stream = response.Stream;
-            await using var memoryStream = new MemoryStream();
-            await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
-            memoryStream.Position = 0;
+            var memoryStream = new MemoryStream();
+            await using (memoryStream.ConfigureAwait(false))
+            {
+                var stream = response.Stream;
+                await using (stream.ConfigureAwait(false))
+                {
+                    await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
+                    memoryStream.Position = 0;
+                }
+            }
 
             var savePaths = new List<string>();
             var saveFileName = Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLowerInvariant();