aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralltilla <attila.szakacs@axoflow.com>2025-02-03 16:59:08 -0500
committerBond_009 <bond.009@outlook.com>2025-02-03 16:59:08 -0500
commiteb4162f9ec4ff13067256c74d310ea14f4fc9797 (patch)
tree0edb971ecdddc29495ff69f5bea95763e698f0e5
parent608c44d5b340b4ece1ff0b4e75d5c6dfe4197c72 (diff)
Backport pull request #13384 from jellyfin/release-10.10.z
Fix parallel use of not thread-safe SubtitleFormat instance Original-merge: 0b2a59e9631269c7e3261895e2e45d9dc07de848 Merged-by: joshuaboniface <joshua@boniface.me> Backported-by: Bond_009 <bond.009@outlook.com>
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs37
1 files changed, 23 insertions, 14 deletions
diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs
index a79d801fb..d060b247d 100644
--- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs
+++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs
@@ -17,7 +17,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
public class SubtitleEditParser : ISubtitleParser
{
private readonly ILogger<SubtitleEditParser> _logger;
- private readonly Dictionary<string, SubtitleFormat[]> _subtitleFormats;
+ private readonly Dictionary<string, List<Type>> _subtitleFormatTypes;
/// <summary>
/// Initializes a new instance of the <see cref="SubtitleEditParser"/> class.
@@ -26,10 +26,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
public SubtitleEditParser(ILogger<SubtitleEditParser> logger)
{
_logger = logger;
- _subtitleFormats = GetSubtitleFormats()
- .Where(subtitleFormat => !string.IsNullOrEmpty(subtitleFormat.Extension))
- .GroupBy(subtitleFormat => subtitleFormat.Extension.TrimStart('.'), StringComparer.OrdinalIgnoreCase)
- .ToDictionary(g => g.Key, g => g.ToArray(), StringComparer.OrdinalIgnoreCase);
+ _subtitleFormatTypes = GetSubtitleFormatTypes();
}
/// <inheritdoc />
@@ -38,13 +35,14 @@ namespace MediaBrowser.MediaEncoding.Subtitles
var subtitle = new Subtitle();
var lines = stream.ReadAllLines().ToList();
- if (!_subtitleFormats.TryGetValue(fileExtension, out var subtitleFormats))
+ if (!_subtitleFormatTypes.TryGetValue(fileExtension, out var subtitleFormatTypesForExtension))
{
throw new ArgumentException($"Unsupported file extension: {fileExtension}", nameof(fileExtension));
}
- foreach (var subtitleFormat in subtitleFormats)
+ foreach (var subtitleFormatType in subtitleFormatTypesForExtension)
{
+ var subtitleFormat = (SubtitleFormat)Activator.CreateInstance(subtitleFormatType, true)!;
_logger.LogDebug(
"Trying to parse '{FileExtension}' subtitle using the {SubtitleFormatParser} format parser",
fileExtension,
@@ -97,11 +95,11 @@ namespace MediaBrowser.MediaEncoding.Subtitles
/// <inheritdoc />
public bool SupportsFileExtension(string fileExtension)
- => _subtitleFormats.ContainsKey(fileExtension);
+ => _subtitleFormatTypes.ContainsKey(fileExtension);
- private List<SubtitleFormat> GetSubtitleFormats()
+ private Dictionary<string, List<Type>> GetSubtitleFormatTypes()
{
- var subtitleFormats = new List<SubtitleFormat>();
+ var subtitleFormatTypes = new Dictionary<string, List<Type>>(StringComparer.OrdinalIgnoreCase);
var assembly = typeof(SubtitleFormat).Assembly;
foreach (var type in assembly.GetTypes())
@@ -113,9 +111,20 @@ namespace MediaBrowser.MediaEncoding.Subtitles
try
{
- // It shouldn't be null, but the exception is caught if it is
- var subtitleFormat = (SubtitleFormat)Activator.CreateInstance(type, true)!;
- subtitleFormats.Add(subtitleFormat);
+ var tempInstance = (SubtitleFormat)Activator.CreateInstance(type, true)!;
+ var extension = tempInstance.Extension.TrimStart('.');
+ if (!string.IsNullOrEmpty(extension))
+ {
+ // Store only the type, we will instantiate from it later
+ if (!subtitleFormatTypes.TryGetValue(extension, out var subtitleFormatTypesForExtension))
+ {
+ subtitleFormatTypes[extension] = [type];
+ }
+ else
+ {
+ subtitleFormatTypesForExtension.Add(type);
+ }
+ }
}
catch (Exception ex)
{
@@ -123,7 +132,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
}
- return subtitleFormats;
+ return subtitleFormatTypes;
}
}
}