Просмотр исходного кода

Move external url listing to provider for plugin use (#12279)

Cody Robibero 10 месяцев назад
Родитель
Сommit
b026772764

+ 2 - 1
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>());
         }

+ 0 - 5
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;

+ 0 - 18
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;
-        }
     }
 }

+ 0 - 17
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;
-        }
     }
 }

+ 0 - 17
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;
-        }
     }
 }

+ 0 - 17
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;
-        }
     }
 }

+ 0 - 20
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;
-        }
     }
 }

+ 2 - 0
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>

+ 22 - 0
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);
+}

+ 3 - 1
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.

+ 5 - 0
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; }
     }
 }

+ 35 - 26
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/>

+ 4 - 2
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>