aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Robibero <cody@robibe.ro>2024-07-17 09:48:31 -0400
committerGitHub <noreply@github.com>2024-07-17 09:48:31 -0400
commitb026772764a705e1ef49fa9b3be053f45a293968 (patch)
treeca0270149d3e4e4dd35fa2449a46f8ec78509a66
parent78ed8f660c1acf216cc0133bc709acf09f7a411e (diff)
Move external url listing to provider for plugin use (#12279)
-rw-r--r--Emby.Server.Implementations/ApplicationHost.cs3
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs18
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs17
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Trailer.cs17
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvProgram.cs20
-rw-r--r--MediaBrowser.Controller/Providers/IExternalId.cs2
-rw-r--r--MediaBrowser.Controller/Providers/IExternalUrlProvider.cs22
-rw-r--r--MediaBrowser.Controller/Providers/IProviderManager.cs4
-rw-r--r--MediaBrowser.Model/Providers/ExternalIdInfo.cs5
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs61
-rw-r--r--tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs6
13 files changed, 73 insertions, 124 deletions
diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index c394b25bd..5bf9c4fc2 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -664,7 +664,8 @@ namespace Emby.Server.Implementations
GetExports<IMetadataService>(),
GetExports<IMetadataProvider>(),
GetExports<IMetadataSaver>(),
- GetExports<IExternalId>());
+ GetExports<IExternalId>(),
+ GetExports<IExternalUrlProvider>());
Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
}
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 8bd4fb4f3..68ae67d05 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -2497,11 +2497,6 @@ namespace MediaBrowser.Controller.Entities
return new[] { Id };
}
- public virtual List<ExternalUrl> GetRelatedUrls()
- {
- return new List<ExternalUrl>();
- }
-
public virtual double? GetRefreshProgress()
{
return null;
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index ede544eec..710b05e7f 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -121,23 +121,5 @@ namespace MediaBrowser.Controller.Entities.Movies
return hasChanges;
}
-
- /// <inheritdoc />
- public override List<ExternalUrl> GetRelatedUrls()
- {
- var list = base.GetRelatedUrls();
-
- var imdbId = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(imdbId))
- {
- list.Add(new ExternalUrl
- {
- Name = "Trakt",
- Url = string.Format(CultureInfo.InvariantCulture, "https://trakt.tv/movies/{0}", imdbId)
- });
- }
-
- return list;
- }
}
}
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index 37e241414..5c54f014c 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -344,22 +344,5 @@ namespace MediaBrowser.Controller.Entities.TV
return hasChanges;
}
-
- public override List<ExternalUrl> GetRelatedUrls()
- {
- var list = base.GetRelatedUrls();
-
- var imdbId = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(imdbId))
- {
- list.Add(new ExternalUrl
- {
- Name = "Trakt",
- Url = string.Format(CultureInfo.InvariantCulture, "https://trakt.tv/episodes/{0}", imdbId)
- });
- }
-
- return list;
- }
}
}
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 6297b67e4..69b04a927 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -482,22 +482,5 @@ namespace MediaBrowser.Controller.Entities.TV
return hasChanges;
}
-
- public override List<ExternalUrl> GetRelatedUrls()
- {
- var list = base.GetRelatedUrls();
-
- var imdbId = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(imdbId))
- {
- list.Add(new ExternalUrl
- {
- Name = "Trakt",
- Url = string.Format(CultureInfo.InvariantCulture, "https://trakt.tv/shows/{0}", imdbId)
- });
- }
-
- return list;
- }
}
}
diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs
index 81d50bbc1..939709215 100644
--- a/MediaBrowser.Controller/Entities/Trailer.cs
+++ b/MediaBrowser.Controller/Entities/Trailer.cs
@@ -80,22 +80,5 @@ namespace MediaBrowser.Controller.Entities
return hasChanges;
}
-
- public override List<ExternalUrl> GetRelatedUrls()
- {
- var list = base.GetRelatedUrls();
-
- var imdbId = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(imdbId))
- {
- list.Add(new ExternalUrl
- {
- Name = "Trakt",
- Url = string.Format(CultureInfo.InvariantCulture, "https://trakt.tv/movies/{0}", imdbId)
- });
- }
-
- return list;
- }
}
}
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
index 05540d490..2ac6f9963 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
@@ -254,25 +254,5 @@ namespace MediaBrowser.Controller.LiveTv
return name;
}
-
- public override List<ExternalUrl> GetRelatedUrls()
- {
- var list = base.GetRelatedUrls();
-
- var imdbId = this.GetProviderId(MetadataProvider.Imdb);
- if (!string.IsNullOrEmpty(imdbId))
- {
- if (IsMovie)
- {
- list.Add(new ExternalUrl
- {
- Name = "Trakt",
- Url = string.Format(CultureInfo.InvariantCulture, "https://trakt.tv/movies/{0}", imdbId)
- });
- }
- }
-
- return list;
- }
}
}
diff --git a/MediaBrowser.Controller/Providers/IExternalId.cs b/MediaBrowser.Controller/Providers/IExternalId.cs
index 0d847520d..f451eac6d 100644
--- a/MediaBrowser.Controller/Providers/IExternalId.cs
+++ b/MediaBrowser.Controller/Providers/IExternalId.cs
@@ -1,3 +1,4 @@
+using System;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
@@ -33,6 +34,7 @@ namespace MediaBrowser.Controller.Providers
/// <summary>
/// Gets the URL format string for this id.
/// </summary>
+ [Obsolete("Obsolete in 10.10, to be removed in 10.11")]
string? UrlFormatString { get; }
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/IExternalUrlProvider.cs b/MediaBrowser.Controller/Providers/IExternalUrlProvider.cs
new file mode 100644
index 000000000..86a180627
--- /dev/null
+++ b/MediaBrowser.Controller/Providers/IExternalUrlProvider.cs
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+
+namespace MediaBrowser.Controller.Providers;
+
+/// <summary>
+/// Interface to include related urls for an item.
+/// </summary>
+public interface IExternalUrlProvider
+{
+ /// <summary>
+ /// Gets the external service name.
+ /// </summary>
+ string Name { get; }
+
+ /// <summary>
+ /// Get the list of external urls.
+ /// </summary>
+ /// <param name="item">The item to get external urls for.</param>
+ /// <returns>The list of external urls.</returns>
+ IEnumerable<string> GetExternalUrls(BaseItem item);
+}
diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs
index b52f16edc..38fc5f2cc 100644
--- a/MediaBrowser.Controller/Providers/IProviderManager.cs
+++ b/MediaBrowser.Controller/Providers/IProviderManager.cs
@@ -99,12 +99,14 @@ namespace MediaBrowser.Controller.Providers
/// <param name="metadataProviders">Metadata providers to use.</param>
/// <param name="metadataSavers">Metadata savers to use.</param>
/// <param name="externalIds">External IDs to use.</param>
+ /// <param name="externalUrlProviders">The list of external url providers.</param>
void AddParts(
IEnumerable<IImageProvider> imageProviders,
IEnumerable<IMetadataService> metadataServices,
IEnumerable<IMetadataProvider> metadataProviders,
IEnumerable<IMetadataSaver> metadataSavers,
- IEnumerable<IExternalId> externalIds);
+ IEnumerable<IExternalId> externalIds,
+ IEnumerable<IExternalUrlProvider> externalUrlProviders);
/// <summary>
/// Gets the available remote images.
diff --git a/MediaBrowser.Model/Providers/ExternalIdInfo.cs b/MediaBrowser.Model/Providers/ExternalIdInfo.cs
index d026d574f..1f5163aa8 100644
--- a/MediaBrowser.Model/Providers/ExternalIdInfo.cs
+++ b/MediaBrowser.Model/Providers/ExternalIdInfo.cs
@@ -1,3 +1,5 @@
+using System;
+
namespace MediaBrowser.Model.Providers
{
/// <summary>
@@ -17,7 +19,9 @@ namespace MediaBrowser.Model.Providers
Name = name;
Key = key;
Type = type;
+#pragma warning disable CS0618 // Type or member is obsolete - Remove 10.11
UrlFormatString = urlFormatString;
+#pragma warning restore CS0618 // Type or member is obsolete
}
/// <summary>
@@ -46,6 +50,7 @@ namespace MediaBrowser.Model.Providers
/// <summary>
/// Gets or sets the URL format string.
/// </summary>
+ [Obsolete("Obsolete in 10.10, to be removed in 10.11")]
public string? UrlFormatString { get; set; }
}
}
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index f2ca99da6..60d89a51b 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -69,11 +69,12 @@ namespace MediaBrowser.Providers.Manager
o.PoolInitialFill = 1;
});
- private IImageProvider[] _imageProviders = Array.Empty<IImageProvider>();
- private IMetadataService[] _metadataServices = Array.Empty<IMetadataService>();
- private IMetadataProvider[] _metadataProviders = Array.Empty<IMetadataProvider>();
- private IMetadataSaver[] _savers = Array.Empty<IMetadataSaver>();
- private IExternalId[] _externalIds = Array.Empty<IExternalId>();
+ private IImageProvider[] _imageProviders = [];
+ private IMetadataService[] _metadataServices = [];
+ private IMetadataProvider[] _metadataProviders = [];
+ private IMetadataSaver[] _savers = [];
+ private IExternalId[] _externalIds = [];
+ private IExternalUrlProvider[] _externalUrlProviders = [];
private bool _isProcessingRefreshQueue;
private bool _disposed;
@@ -132,12 +133,14 @@ namespace MediaBrowser.Providers.Manager
IEnumerable<IMetadataService> metadataServices,
IEnumerable<IMetadataProvider> metadataProviders,
IEnumerable<IMetadataSaver> metadataSavers,
- IEnumerable<IExternalId> externalIds)
+ IEnumerable<IExternalId> externalIds,
+ IEnumerable<IExternalUrlProvider> externalUrlProviders)
{
_imageProviders = imageProviders.ToArray();
_metadataServices = metadataServices.OrderBy(i => i.Order).ToArray();
_metadataProviders = metadataProviders.ToArray();
_externalIds = externalIds.OrderBy(i => i.ProviderName).ToArray();
+ _externalUrlProviders = externalUrlProviders.OrderBy(i => i.Name).ToArray();
_savers = metadataSavers.ToArray();
}
@@ -877,31 +880,35 @@ namespace MediaBrowser.Providers.Manager
/// <inheritdoc/>
public IEnumerable<ExternalUrl> GetExternalUrls(BaseItem item)
{
- return GetExternalIds(item)
+#pragma warning disable CS0618 // Type or member is obsolete - Remove 10.11
+ var legacyExternalIdUrls = GetExternalIds(item)
.Select(i =>
- {
- if (string.IsNullOrEmpty(i.UrlFormatString))
{
- return null;
- }
+ var urlFormatString = i.UrlFormatString;
+ if (string.IsNullOrEmpty(urlFormatString)
+ || !item.TryGetProviderId(i.Key, out var providerId))
+ {
+ return null;
+ }
- var value = item.GetProviderId(i.Key);
+ return new ExternalUrl
+ {
+ Name = i.ProviderName,
+ Url = string.Format(
+ CultureInfo.InvariantCulture,
+ urlFormatString,
+ providerId)
+ };
+ })
+ .OfType<ExternalUrl>();
+#pragma warning restore CS0618 // Type or member is obsolete
- if (string.IsNullOrEmpty(value))
- {
- return null;
- }
+ var externalUrls = _externalUrlProviders
+ .SelectMany(p => p
+ .GetExternalUrls(item)
+ .Select(externalUrl => new ExternalUrl { Name = p.Name, Url = externalUrl }));
- return new ExternalUrl
- {
- Name = i.ProviderName,
- Url = string.Format(
- CultureInfo.InvariantCulture,
- i.UrlFormatString,
- value)
- };
- }).Where(i => i is not null)
- .Concat(item.GetRelatedUrls())!; // We just filtered out all the nulls
+ return legacyExternalIdUrls.Concat(externalUrls).OrderBy(u => u.Name);
}
/// <inheritdoc/>
@@ -912,7 +919,9 @@ namespace MediaBrowser.Providers.Manager
name: i.ProviderName,
key: i.Key,
type: i.Type,
+#pragma warning disable CS0618 // Type or member is obsolete - Remove 10.11
urlFormatString: i.UrlFormatString));
+#pragma warning restore CS0618 // Type or member is obsolete
}
/// <inheritdoc/>
diff --git a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
index 6fccce049..cced2b1e2 100644
--- a/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
+++ b/tests/Jellyfin.Providers.Tests/Manager/ProviderManagerTests.cs
@@ -585,15 +585,17 @@ namespace Jellyfin.Providers.Tests.Manager
IEnumerable<IMetadataService>? metadataServices = null,
IEnumerable<IMetadataProvider>? metadataProviders = null,
IEnumerable<IMetadataSaver>? metadataSavers = null,
- IEnumerable<IExternalId>? externalIds = null)
+ IEnumerable<IExternalId>? externalIds = null,
+ IEnumerable<IExternalUrlProvider>? externalUrlProviders = null)
{
imageProviders ??= Array.Empty<IImageProvider>();
metadataServices ??= Array.Empty<IMetadataService>();
metadataProviders ??= Array.Empty<IMetadataProvider>();
metadataSavers ??= Array.Empty<IMetadataSaver>();
externalIds ??= Array.Empty<IExternalId>();
+ externalUrlProviders ??= Array.Empty<IExternalUrlProvider>();
- providerManager.AddParts(imageProviders, metadataServices, metadataProviders, metadataSavers, externalIds);
+ providerManager.AddParts(imageProviders, metadataServices, metadataProviders, metadataSavers, externalIds, externalUrlProviders);
}
/// <summary>