diff --git a/MediaBrowser.Controller/Providers/IExternalId.cs b/MediaBrowser.Controller/Providers/IExternalId.cs
index f451eac6dd..584c3297a9 100644
--- a/MediaBrowser.Controller/Providers/IExternalId.cs
+++ b/MediaBrowser.Controller/Providers/IExternalId.cs
@@ -31,12 +31,6 @@ namespace MediaBrowser.Controller.Providers
///
ExternalIdMediaType? Type { get; }
- ///
- /// Gets the URL format string for this id.
- ///
- [Obsolete("Obsolete in 10.10, to be removed in 10.11")]
- string? UrlFormatString { get; }
-
///
/// Determines whether this id supports a given item type.
///
diff --git a/MediaBrowser.Model/Providers/ExternalIdInfo.cs b/MediaBrowser.Model/Providers/ExternalIdInfo.cs
index 1f5163aa8e..e7a3099243 100644
--- a/MediaBrowser.Model/Providers/ExternalIdInfo.cs
+++ b/MediaBrowser.Model/Providers/ExternalIdInfo.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace MediaBrowser.Model.Providers
{
///
@@ -13,15 +11,11 @@ namespace MediaBrowser.Model.Providers
/// Name of the external id provider (IE: IMDB, MusicBrainz, etc).
/// Key for this id. This key should be unique across all providers.
/// Specific media type for this id.
- /// URL format string.
- public ExternalIdInfo(string name, string key, ExternalIdMediaType? type, string? urlFormatString)
+ public ExternalIdInfo(string name, string key, ExternalIdMediaType? type)
{
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
}
///
@@ -46,11 +40,5 @@ namespace MediaBrowser.Model.Providers
/// This can be used along with the to localize the external id on the client.
///
public ExternalIdMediaType? Type { get; set; }
-
- ///
- /// Gets or sets the URL format string.
- ///
- [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 8c45abe252..856f33b497 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -899,35 +899,10 @@ namespace MediaBrowser.Providers.Manager
///
public IEnumerable GetExternalUrls(BaseItem item)
{
-#pragma warning disable CS0618 // Type or member is obsolete - Remove 10.11
- var legacyExternalIdUrls = GetExternalIds(item)
- .Select(i =>
- {
- var urlFormatString = i.UrlFormatString;
- if (string.IsNullOrEmpty(urlFormatString)
- || !item.TryGetProviderId(i.Key, out var providerId))
- {
- return null;
- }
-
- return new ExternalUrl
- {
- Name = i.ProviderName,
- Url = string.Format(
- CultureInfo.InvariantCulture,
- urlFormatString,
- providerId)
- };
- })
- .OfType();
-#pragma warning restore CS0618 // Type or member is obsolete
-
- var externalUrls = _externalUrlProviders
+ return _externalUrlProviders
.SelectMany(p => p
.GetExternalUrls(item)
.Select(externalUrl => new ExternalUrl { Name = p.Name, Url = externalUrl }));
-
- return legacyExternalIdUrls.Concat(externalUrls).OrderBy(u => u.Name);
}
///
@@ -937,10 +912,7 @@ namespace MediaBrowser.Providers.Manager
.Select(i => new ExternalIdInfo(
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
+ type: i.Type));
}
///
diff --git a/MediaBrowser.Providers/Movies/ImdbExternalId.cs b/MediaBrowser.Providers/Movies/ImdbExternalId.cs
index a8d74aa0b5..def0b13c07 100644
--- a/MediaBrowser.Providers/Movies/ImdbExternalId.cs
+++ b/MediaBrowser.Providers/Movies/ImdbExternalId.cs
@@ -21,9 +21,6 @@ namespace MediaBrowser.Providers.Movies
///
public ExternalIdMediaType? Type => null;
- ///
- public string UrlFormatString => "https://www.imdb.com/title/{0}";
-
///
public bool Supports(IHasProviderIds item)
{
diff --git a/MediaBrowser.Providers/Movies/ImdbExternalUrlProvider.cs b/MediaBrowser.Providers/Movies/ImdbExternalUrlProvider.cs
new file mode 100644
index 0000000000..eadcc976af
--- /dev/null
+++ b/MediaBrowser.Providers/Movies/ImdbExternalUrlProvider.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Movies;
+
+///
+/// External URLs for IMDb.
+///
+public class ImdbExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "IMDb";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ var baseUrl = "https://www.imdb.com/";
+ var externalId = item.GetProviderId(MetadataProvider.Imdb);
+
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return baseUrl + $"title/{externalId}";
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Movies/ImdbPersonExternalId.cs b/MediaBrowser.Providers/Movies/ImdbPersonExternalId.cs
index 8151ab4715..aa2b2fae95 100644
--- a/MediaBrowser.Providers/Movies/ImdbPersonExternalId.cs
+++ b/MediaBrowser.Providers/Movies/ImdbPersonExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Movies
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Person;
- ///
- public string UrlFormatString => "https://www.imdb.com/name/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Person;
}
diff --git a/MediaBrowser.Providers/Music/ImvdbId.cs b/MediaBrowser.Providers/Music/ImvdbId.cs
index ed69f369c0..b2c0b7019e 100644
--- a/MediaBrowser.Providers/Music/ImvdbId.cs
+++ b/MediaBrowser.Providers/Music/ImvdbId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Music
///
public ExternalIdMediaType? Type => null;
- ///
- public string? UrlFormatString => null;
-
///
public bool Supports(IHasProviderIds item)
=> item is MusicVideo;
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalId.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalId.cs
index 138cfef19a..622bb1dba4 100644
--- a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
///
public ExternalIdMediaType? Type => null;
- ///
- public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is MusicAlbum;
}
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalUrlProvider.cs
new file mode 100644
index 0000000000..1615f1ce59
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbAlbumExternalUrlProvider.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.AudioDb;
+
+///
+/// External artist URLs for AudioDb.
+///
+public class AudioDbAlbumExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "TheAudioDb Album";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.AudioDbAlbum);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ var baseUrl = "https://www.theaudiodb.com/";
+ switch (item)
+ {
+ case MusicAlbum:
+ yield return baseUrl + $"album/{externalId}";
+ break;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalId.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalId.cs
index 8aceb48c0c..3b5955b5be 100644
--- a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Artist;
- ///
- public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is MusicArtist;
}
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalUrlProvider.cs
new file mode 100644
index 0000000000..5c5057fa1a
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbArtistExternalUrlProvider.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.AudioDb;
+
+///
+/// External artist URLs for AudioDb.
+///
+public class AudioDbArtistExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "TheAudioDb Artist";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.AudioDbArtist);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ var baseUrl = "https://www.theaudiodb.com/";
+ switch (item)
+ {
+ case MusicAlbum:
+ case Person:
+ yield return baseUrl + $"artist/{externalId}";
+ break;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherAlbumExternalId.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherAlbumExternalId.cs
index 014481da24..fdfd330cd3 100644
--- a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherAlbumExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherAlbumExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Album;
- ///
- public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio;
}
diff --git a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherArtistExternalId.cs b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherArtistExternalId.cs
index 7875391043..5a39ec1cd9 100644
--- a/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherArtistExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/AudioDb/AudioDbOtherArtistExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
///
public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist;
- ///
- public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalId.cs
index 825fe32fa2..f1fc4a137b 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzAlbumArtistExternalId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.AlbumArtist;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalUrlProvider.cs
new file mode 100644
index 0000000000..3de18f4ccf
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumArtistExternalUrlProvider.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.MusicBrainz;
+
+///
+/// External album artist URLs for MusicBrainz.
+///
+public class MusicBrainzAlbumArtistExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "MusicBrainz Album Artist";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ if (item is MusicAlbum)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return Plugin.Instance!.Configuration.Server + $"/artist/{externalId}";
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalId.cs
index b7d53984c5..48784e0ecd 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzAlbumExternalId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Album;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/release/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalUrlProvider.cs
new file mode 100644
index 0000000000..6d0afdd508
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzAlbumExternalUrlProvider.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.MusicBrainz;
+
+///
+/// External album URLs for MusicBrainz.
+///
+public class MusicBrainzAlbumExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "MusicBrainz Album";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ if (item is MusicAlbum)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return Plugin.Instance!.Configuration.Server + $"/release/{externalId}";
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalId.cs
index b3f001618d..bd5d67ed1b 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzArtistExternalId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Artist;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is MusicArtist;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalUrlProvider.cs
new file mode 100644
index 0000000000..cd71191bff
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzArtistExternalUrlProvider.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.MusicBrainz;
+
+///
+/// External artist URLs for MusicBrainz.
+///
+public class MusicBrainzArtistExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "MusicBrainz Artist";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ switch (item)
+ {
+ case MusicAlbum:
+ case Person:
+ yield return Plugin.Instance!.Configuration.Server + $"/artist/{externalId}";
+
+ break;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzOtherArtistExternalId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzOtherArtistExternalId.cs
index a0a922293d..470cdad662 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzOtherArtistExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzOtherArtistExternalId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzOtherArtistExternalId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalId.cs
index 47b6d69633..c19b62abfe 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzReleaseGroupExternalId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.ReleaseGroup;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/release-group/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum;
}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalUrlProvider.cs
new file mode 100644
index 0000000000..9bc0103794
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzReleaseGroupExternalUrlProvider.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.MusicBrainz;
+
+///
+/// External release group URLs for MusicBrainz.
+///
+public class MusicBrainzReleaseGroupExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "MusicBrainz Release Group";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ if (item is MusicAlbum)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return Plugin.Instance!.Configuration.Server + $"/release-group/{externalId}";
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackExternalUrlProvider.cs
new file mode 100644
index 0000000000..fc26dc54df
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackExternalUrlProvider.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.Plugins.MusicBrainz;
+
+///
+/// External track URLs for MusicBrainz.
+///
+public class MusicBrainzTrackExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "MusicBrainz Track";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ if (item is Audio)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return Plugin.Instance!.Configuration.Server + $"/track/{externalId}";
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackId.cs b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackId.cs
index cb4345660d..6a7b6f5412 100644
--- a/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackId.cs
+++ b/MediaBrowser.Providers/Plugins/MusicBrainz/MusicBrainzTrackId.cs
@@ -19,9 +19,6 @@ public class MusicBrainzTrackId : IExternalId
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Track;
- ///
- public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/track/{0}";
-
///
public bool Supports(IHasProviderIds item) => item is Audio;
}
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs
index d453a4ff44..2076589d34 100644
--- a/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/Tmdb/BoxSets/TmdbBoxSetExternalId.cs
@@ -20,9 +20,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets
///
public ExternalIdMediaType? Type => ExternalIdMediaType.BoxSet;
- ///
- public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "collection/{0}";
-
///
public bool Supports(IHasProviderIds item)
{
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieExternalId.cs b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieExternalId.cs
index 6d6032e8f6..9a1d872ec2 100644
--- a/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/Tmdb/Movies/TmdbMovieExternalId.cs
@@ -20,9 +20,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Movie;
- ///
- public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "movie/{0}";
-
///
public bool Supports(IHasProviderIds item)
{
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonExternalId.cs b/MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonExternalId.cs
index d26a70028c..2c0787b15d 100644
--- a/MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/Tmdb/People/TmdbPersonExternalId.cs
@@ -19,9 +19,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Person;
- ///
- public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "person/{0}";
-
///
public bool Supports(IHasProviderIds item)
{
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesExternalId.cs b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesExternalId.cs
index 5f2d7909a9..840cec9841 100644
--- a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesExternalId.cs
+++ b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesExternalId.cs
@@ -19,9 +19,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
///
public ExternalIdMediaType? Type => ExternalIdMediaType.Series;
- ///
- public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "tv/{0}";
-
///
public bool Supports(IHasProviderIds item)
{
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/TmdbExternalUrlProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/TmdbExternalUrlProvider.cs
new file mode 100644
index 0000000000..b8fd18f286
--- /dev/null
+++ b/MediaBrowser.Providers/Plugins/Tmdb/TmdbExternalUrlProvider.cs
@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using TMDbLib.Objects.TvShows;
+
+namespace MediaBrowser.Providers.Plugins.Tmdb;
+
+///
+/// External URLs for TMDb.
+///
+public class TmdbExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "TMDB";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ switch (item)
+ {
+ case Series:
+ var externalId = item.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"tv/{externalId}";
+ }
+
+ break;
+ case Season season:
+ var seriesExternalId = season.Series.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(seriesExternalId))
+ {
+ var orderString = season.Series.DisplayOrder;
+ if (string.IsNullOrEmpty(orderString))
+ {
+ // Default order is airdate
+ yield return TmdbUtils.BaseTmdbUrl + $"tv/{seriesExternalId}/season/{season.IndexNumber}";
+ }
+
+ if (Enum.TryParse(season.Series.DisplayOrder, out var order))
+ {
+ if (order.Equals(TvGroupType.OriginalAirDate))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"tv/{seriesExternalId}/season/{season.IndexNumber}";
+ }
+ }
+ }
+
+ break;
+ case Episode episode:
+ seriesExternalId = episode.Series.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(seriesExternalId))
+ {
+ var orderString = episode.Series.DisplayOrder;
+ if (string.IsNullOrEmpty(orderString))
+ {
+ // Default order is airdate
+ yield return TmdbUtils.BaseTmdbUrl + $"tv/{seriesExternalId}/season/{episode.Season.IndexNumber}/episode/{episode.IndexNumber}";
+ }
+
+ if (Enum.TryParse(orderString, out var order))
+ {
+ if (order.Equals(TvGroupType.OriginalAirDate))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"tv/{seriesExternalId}/season/{episode.Season.IndexNumber}/episode/{episode.IndexNumber}";
+ }
+ }
+ }
+
+ break;
+ case Movie:
+ externalId = item.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"movie/{externalId}";
+ }
+
+ break;
+ case Person:
+ externalId = item.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"person/{externalId}";
+ }
+
+ break;
+ case BoxSet:
+ externalId = item.GetProviderId(MetadataProvider.Tmdb);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return TmdbUtils.BaseTmdbUrl + $"collection/{externalId}";
+ }
+
+ break;
+ }
+ }
+}
diff --git a/MediaBrowser.Providers/TV/Zap2ItExternalId.cs b/MediaBrowser.Providers/TV/Zap2ItExternalId.cs
index 3cb18e4248..8907d7744a 100644
--- a/MediaBrowser.Providers/TV/Zap2ItExternalId.cs
+++ b/MediaBrowser.Providers/TV/Zap2ItExternalId.cs
@@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.TV
///
public ExternalIdMediaType? Type => null;
- ///
- public string UrlFormatString => "http://tvlistings.zap2it.com/overview.html?programSeriesId={0}";
-
///
public bool Supports(IHasProviderIds item) => item is Series;
}
diff --git a/MediaBrowser.Providers/TV/Zap2ItExternalUrlProvider.cs b/MediaBrowser.Providers/TV/Zap2ItExternalUrlProvider.cs
new file mode 100644
index 0000000000..f6516fddeb
--- /dev/null
+++ b/MediaBrowser.Providers/TV/Zap2ItExternalUrlProvider.cs
@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+
+namespace MediaBrowser.Providers.TV;
+
+///
+/// External URLs for TMDb.
+///
+public class Zap2ItExternalUrlProvider : IExternalUrlProvider
+{
+ ///
+ public string Name => "Zap2It";
+
+ ///
+ public IEnumerable GetExternalUrls(BaseItem item)
+ {
+ var externalId = item.GetProviderId(MetadataProvider.Zap2It);
+ if (!string.IsNullOrEmpty(externalId))
+ {
+ yield return $"http://tvlistings.zap2it.com/overview.html?programSeriesId={externalId}";
+ }
+ }
+}
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs
index f9126ce9bb..a04b37f215 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/EpisodeNfoProviderTests.cs
@@ -26,7 +26,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock();
var imdbExternalId = new ImdbExternalId();
- var externalIdInfo = new ExternalIdInfo(imdbExternalId.ProviderName, imdbExternalId.Key, imdbExternalId.Type, imdbExternalId.UrlFormatString);
+ var externalIdInfo = new ExternalIdInfo(imdbExternalId.ProviderName, imdbExternalId.Key, imdbExternalId.Type);
providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny()))
.Returns(new[] { externalIdInfo });
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
index 9c2655154d..a71a08d8cd 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
@@ -34,7 +34,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock();
var tmdbExternalId = new TmdbMovieExternalId();
- var externalIdInfo = new ExternalIdInfo(tmdbExternalId.ProviderName, tmdbExternalId.Key, tmdbExternalId.Type, tmdbExternalId.UrlFormatString);
+ var externalIdInfo = new ExternalIdInfo(tmdbExternalId.ProviderName, tmdbExternalId.Key, tmdbExternalId.Type);
providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny()))
.Returns(new[] { externalIdInfo });
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs
index f815dfaa9a..24e9b9feeb 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicAlbumNfoProviderTests.cs
@@ -24,7 +24,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock();
var musicBrainzArtist = new MusicBrainzArtistExternalId();
- var externalIdInfo = new ExternalIdInfo(musicBrainzArtist.ProviderName, musicBrainzArtist.Key, musicBrainzArtist.Type, "MusicBrainzServer");
+ var externalIdInfo = new ExternalIdInfo(musicBrainzArtist.ProviderName, musicBrainzArtist.Key, musicBrainzArtist.Type);
providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny()))
.Returns(new[] { externalIdInfo });
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs
index 78183d9ffd..4d1956bde7 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MusicArtistNfoParserTests.cs
@@ -24,7 +24,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock();
var musicBrainzArtist = new MusicBrainzArtistExternalId();
- var externalIdInfo = new ExternalIdInfo(musicBrainzArtist.ProviderName, musicBrainzArtist.Key, musicBrainzArtist.Type, "MusicBrainzServer");
+ var externalIdInfo = new ExternalIdInfo(musicBrainzArtist.ProviderName, musicBrainzArtist.Key, musicBrainzArtist.Type);
providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny()))
.Returns(new[] { externalIdInfo });