diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs index f68b3cee62..4ab35f0b6c 100644 --- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs +++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs @@ -48,9 +48,7 @@ namespace MediaBrowser.Providers.Subtitles _monitor = monitor; _mediaSourceManager = mediaSourceManager; _localization = localizationManager; - _subtitleProviders = subtitleProviders - .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0) - .ToArray(); + _subtitleProviders = [.. subtitleProviders.OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)]; } /// @@ -117,7 +115,7 @@ namespace MediaBrowser.Providers.Subtitles } catch (Exception ex) { - _logger.LogError(ex, "Error downloading subtitles from {0}", i.Name); + _logger.LogError(ex, "Error downloading subtitles from {Name}", i.Name); return Array.Empty(); } }); @@ -205,8 +203,6 @@ namespace MediaBrowser.Providers.Subtitles saveFileName += ".sdh"; } - saveFileName += "." + response.Format.ToLowerInvariant(); - if (saveInMediaFolder) { var mediaFolderPath = Path.GetFullPath(Path.Combine(video.ContainingFolderPath, saveFileName)); @@ -227,7 +223,7 @@ namespace MediaBrowser.Providers.Subtitles if (savePaths.Count > 0) { - await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false); + await TrySaveToFiles(memoryStream, savePaths, response.Format.ToLowerInvariant()).ConfigureAwait(false); } else { @@ -236,24 +232,34 @@ namespace MediaBrowser.Providers.Subtitles } } - private async Task TrySaveToFiles(Stream stream, List savePaths) + private async Task TrySaveToFiles(Stream stream, List savePaths, string extension) { List? exs = null; foreach (var savePath in savePaths) { - _logger.LogInformation("Saving subtitles to {SavePath}", savePath); - - _monitor.ReportFileSystemChangeBeginning(savePath); - + var path = savePath; try { - Directory.CreateDirectory(Path.GetDirectoryName(savePath) ?? throw new InvalidOperationException("Path can't be a root directory.")); + var fileExists = File.Exists(savePath + "." + extension); + var counter = 0; + + while (fileExists) + { + counter++; + path = string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}", savePath, counter, extension); + fileExists = File.Exists(path); + } + + _logger.LogInformation("Saving subtitles to {SavePath}", path); + _monitor.ReportFileSystemChangeBeginning(path); + + Directory.CreateDirectory(Path.GetDirectoryName(path) ?? throw new InvalidOperationException("Path can't be a root directory.")); var fileOptions = AsyncFile.WriteOptions; fileOptions.Mode = FileMode.CreateNew; fileOptions.PreallocationSize = stream.Length; - var fs = new FileStream(savePath, fileOptions); + var fs = new FileStream(path, fileOptions); await using (fs.ConfigureAwait(false)) { await stream.CopyToAsync(fs).ConfigureAwait(false); @@ -263,14 +269,11 @@ namespace MediaBrowser.Providers.Subtitles } catch (Exception ex) { -// Bug in analyzer -- https://github.com/dotnet/roslyn-analyzers/issues/5160 -#pragma warning disable CA1508 - (exs ??= new List()).Add(ex); -#pragma warning restore CA1508 + (exs ??= []).Add(ex); } finally { - _monitor.ReportFileSystemChangeComplete(savePath, false); + _monitor.ReportFileSystemChangeComplete(path, false); } stream.Position = 0;