aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-08-24 22:20:33 +0200
committerShadowghost <Ghost_of_Stone@web.de>2026-08-25 20:42:41 +0200
commit4147a83b9356a9b6d101dde8217aec21fefb51f4 (patch)
tree6b9a96c5aed1b6b998e329bad8675d69182c7d15
parent4c524f033f66d7a3a3a8b9b8ec706ea10330ea31 (diff)
Handle generational suffixes
-rw-r--r--MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs32
-rw-r--r--tests/Jellyfin.Providers.Tests/Omdb/OmdbProviderTests.cs16
2 files changed, 47 insertions, 1 deletions
diff --git a/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs
index 7a8e2b3ce7..7262cddd33 100644
--- a/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs
+++ b/MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs
@@ -27,6 +27,9 @@ namespace MediaBrowser.Providers.Plugins.Omdb
/// <summary>Provider for OMDB service.</summary>
public class OmdbProvider
{
+ /// <summary>Generational suffixes that OMDb separates from the name with a comma.</summary>
+ private static readonly string[] NameSuffixes = ["Jr", "Jnr", "Sr", "Snr", "II", "III", "IV", "V"];
+
private readonly IFileSystem _fileSystem;
private readonly IServerConfigurationManager _configurationManager;
private readonly IHttpClientFactory _httpClientFactory;
@@ -425,6 +428,11 @@ namespace MediaBrowser.Providers.Plugins.Omdb
AddPeople(itemResult, result.Actors, PersonKind.Actor);
}
+ /// <summary>Adds the people from a comma separated OMDb credit list.</summary>
+ /// <typeparam name="T">The item type.</typeparam>
+ /// <param name="itemResult">The metadata result to add the people to.</param>
+ /// <param name="credits">The comma separated OMDb credit list.</param>
+ /// <param name="type">The kind of person each credit describes.</param>
internal static void AddPeople<T>(MetadataResult<T> itemResult, string credits, PersonKind type)
where T : BaseItem
{
@@ -433,6 +441,8 @@ namespace MediaBrowser.Providers.Plugins.Omdb
return;
}
+ var names = new List<string>();
+
foreach (var credit in credits.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
{
// OMDb annotates the credited role in parentheses, e.g. "Mari Okada (screenplay)". The same
@@ -444,11 +454,24 @@ namespace MediaBrowser.Providers.Plugins.Omdb
name = name[..annotation].TrimEnd();
}
- if (string.IsNullOrEmpty(name))
+ if (name.Length == 0)
{
continue;
}
+ // A generational suffix is separated from the name it belongs to by the same comma the list
+ // uses, e.g. "Jack Salvatore, Jr.", so it has to be joined back instead of becoming a credit.
+ if (names.Count > 0 && IsNameSuffix(name))
+ {
+ names[^1] = names[^1] + ", " + name;
+ continue;
+ }
+
+ names.Add(name);
+ }
+
+ foreach (var name in names)
+ {
itemResult.AddPerson(new PersonInfo
{
Name = name,
@@ -457,6 +480,13 @@ namespace MediaBrowser.Providers.Plugins.Omdb
}
}
+ private static bool IsNameSuffix(string value)
+ {
+ var suffix = value.EndsWith('.') ? value[..^1] : value;
+
+ return NameSuffixes.Contains(suffix, StringComparer.OrdinalIgnoreCase);
+ }
+
private static bool IsConfiguredForEnglish(BaseItem item, string language)
{
if (string.IsNullOrEmpty(language))
diff --git a/tests/Jellyfin.Providers.Tests/Omdb/OmdbProviderTests.cs b/tests/Jellyfin.Providers.Tests/Omdb/OmdbProviderTests.cs
index d18c8c21a2..5e053943af 100644
--- a/tests/Jellyfin.Providers.Tests/Omdb/OmdbProviderTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Omdb/OmdbProviderTests.cs
@@ -35,6 +35,22 @@ namespace Jellyfin.Providers.Tests.Omdb
}
[Theory]
+ [InlineData("Jack Salvatore, Jr.", "Jack Salvatore, Jr.")]
+ [InlineData("Efrem Zimbalist, Jr., Tom Hanks", "Efrem Zimbalist, Jr.|Tom Hanks")]
+ [InlineData("Tom Hanks, Sammy Davis, Jr", "Tom Hanks|Sammy Davis, Jr")]
+ [InlineData("Harold Ramis, Ken Griffey, III (voice)", "Harold Ramis|Ken Griffey, III")]
+ [InlineData("Robert Downey Jr., Gwyneth Paltrow", "Robert Downey Jr.|Gwyneth Paltrow")]
+ [InlineData("Jr., Tom Hanks", "Jr.|Tom Hanks")]
+ public void AddPeople_GenerationalSuffix_StaysWithItsName(string credits, string expected)
+ {
+ var result = new MetadataResult<Movie>();
+
+ OmdbProvider.AddPeople(result, credits, PersonKind.Actor);
+
+ Assert.Equal(expected.Split('|'), result.People!.Select(p => p.Name));
+ }
+
+ [Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]