Merge pull request #13175 from Shadowghost/external-url-providers

Migrate to IExternalUrlProvider
This commit is contained in:
Joshua M. Boniface 2025-03-13 21:08:18 -04:00 committed by GitHub
commit 79437f85c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
42 changed files with 385 additions and 171 deletions

View File

@ -138,11 +138,9 @@ namespace MediaBrowser.Controller.Entities.Audio
private static List<string> GetUserDataKeys(MusicArtist item) private static List<string> GetUserDataKeys(MusicArtist item)
{ {
var list = new List<string>(); var list = new List<string>();
var id = item.GetProviderId(MetadataProvider.MusicBrainzArtist); if (item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out var externalId))
if (!string.IsNullOrEmpty(id))
{ {
list.Add("Artist-Musicbrainz-" + id); list.Add("Artist-Musicbrainz-" + externalId);
} }
list.Add("Artist-" + (item.Name ?? string.Empty).RemoveDiacritics()); list.Add("Artist-" + (item.Name ?? string.Empty).RemoveDiacritics());

View File

@ -31,12 +31,6 @@ namespace MediaBrowser.Controller.Providers
/// </remarks> /// </remarks>
ExternalIdMediaType? Type { get; } ExternalIdMediaType? Type { get; }
/// <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> /// <summary>
/// Determines whether this id supports a given item type. /// Determines whether this id supports a given item type.
/// </summary> /// </summary>

View File

@ -1,5 +1,3 @@
using System;
namespace MediaBrowser.Model.Providers namespace MediaBrowser.Model.Providers
{ {
/// <summary> /// <summary>
@ -13,15 +11,11 @@ namespace MediaBrowser.Model.Providers
/// <param name="name">Name of the external id provider (IE: IMDB, MusicBrainz, etc).</param> /// <param name="name">Name of the external id provider (IE: IMDB, MusicBrainz, etc).</param>
/// <param name="key">Key for this id. This key should be unique across all providers.</param> /// <param name="key">Key for this id. This key should be unique across all providers.</param>
/// <param name="type">Specific media type for this id.</param> /// <param name="type">Specific media type for this id.</param>
/// <param name="urlFormatString">URL format string.</param> public ExternalIdInfo(string name, string key, ExternalIdMediaType? type)
public ExternalIdInfo(string name, string key, ExternalIdMediaType? type, string? urlFormatString)
{ {
Name = name; Name = name;
Key = key; Key = key;
Type = type; 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> /// <summary>
@ -46,11 +40,5 @@ namespace MediaBrowser.Model.Providers
/// This can be used along with the <see cref="Name"/> to localize the external id on the client. /// This can be used along with the <see cref="Name"/> to localize the external id on the client.
/// </remarks> /// </remarks>
public ExternalIdMediaType? Type { get; set; } public ExternalIdMediaType? Type { get; set; }
/// <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; }
} }
} }

View File

@ -899,35 +899,10 @@ namespace MediaBrowser.Providers.Manager
/// <inheritdoc/> /// <inheritdoc/>
public IEnumerable<ExternalUrl> GetExternalUrls(BaseItem item) public IEnumerable<ExternalUrl> GetExternalUrls(BaseItem item)
{ {
#pragma warning disable CS0618 // Type or member is obsolete - Remove 10.11 return _externalUrlProviders
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<ExternalUrl>();
#pragma warning restore CS0618 // Type or member is obsolete
var externalUrls = _externalUrlProviders
.SelectMany(p => p .SelectMany(p => p
.GetExternalUrls(item) .GetExternalUrls(item)
.Select(externalUrl => new ExternalUrl { Name = p.Name, Url = externalUrl })); .Select(externalUrl => new ExternalUrl { Name = p.Name, Url = externalUrl }));
return legacyExternalIdUrls.Concat(externalUrls).OrderBy(u => u.Name);
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -937,10 +912,7 @@ namespace MediaBrowser.Providers.Manager
.Select(i => new ExternalIdInfo( .Select(i => new ExternalIdInfo(
name: i.ProviderName, name: i.ProviderName,
key: i.Key, key: i.Key,
type: i.Type, 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/> /// <inheritdoc/>

View File

@ -21,9 +21,6 @@ namespace MediaBrowser.Providers.Movies
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => null; public ExternalIdMediaType? Type => null;
/// <inheritdoc />
public string UrlFormatString => "https://www.imdb.com/title/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {

View File

@ -0,0 +1,25 @@
using System.Collections.Generic;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.Movies;
/// <summary>
/// External URLs for IMDb.
/// </summary>
public class ImdbExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "IMDb";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
var baseUrl = "https://www.imdb.com/";
if (item.TryGetProviderId(MetadataProvider.Imdb, out var externalId))
{
yield return baseUrl + $"title/{externalId}";
}
}
}

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Movies
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Person; public ExternalIdMediaType? Type => ExternalIdMediaType.Person;
/// <inheritdoc />
public string UrlFormatString => "https://www.imdb.com/name/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Person; public bool Supports(IHasProviderIds item) => item is Person;
} }

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Music
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => null; public ExternalIdMediaType? Type => null;
/// <inheritdoc />
public string? UrlFormatString => null;
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
=> item is MusicVideo; => item is MusicVideo;

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => null; public ExternalIdMediaType? Type => null;
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is MusicAlbum; public bool Supports(IHasProviderIds item) => item is MusicAlbum;
} }

View File

@ -0,0 +1,31 @@
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;
/// <summary>
/// External artist URLs for AudioDb.
/// </summary>
public class AudioDbAlbumExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "TheAudioDb Album";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item.TryGetProviderId(MetadataProvider.AudioDbAlbum, out var externalId))
{
var baseUrl = "https://www.theaudiodb.com/";
switch (item)
{
case MusicAlbum:
yield return baseUrl + $"album/{externalId}";
break;
}
}
}
}

View File

@ -4,7 +4,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
@ -50,9 +49,7 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{ {
var id = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); if (item.TryGetProviderId(MetadataProvider.MusicBrainzReleaseGroup, out var id))
if (!string.IsNullOrWhiteSpace(id))
{ {
await AudioDbAlbumProvider.Current.EnsureInfo(id, cancellationToken).ConfigureAwait(false); await AudioDbAlbumProvider.Current.EnsureInfo(id, cancellationToken).ConfigureAwait(false);
@ -70,7 +67,7 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
} }
} }
return Enumerable.Empty<RemoteImageInfo>(); return [];
} }
private List<RemoteImageInfo> GetImages(AudioDbAlbumProvider.Album item) private List<RemoteImageInfo> GetImages(AudioDbAlbumProvider.Album item)

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Artist; public ExternalIdMediaType? Type => ExternalIdMediaType.Artist;
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is MusicArtist; public bool Supports(IHasProviderIds item) => item is MusicArtist;
} }

View File

@ -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;
/// <summary>
/// External artist URLs for AudioDb.
/// </summary>
public class AudioDbArtistExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "TheAudioDb Artist";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item.TryGetProviderId(MetadataProvider.AudioDbArtist, out var externalId))
{
var baseUrl = "https://www.theaudiodb.com/";
switch (item)
{
case MusicAlbum:
case Person:
yield return baseUrl + $"artist/{externalId}";
break;
}
}
}
}

View File

@ -4,7 +4,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
@ -43,21 +42,19 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public IEnumerable<ImageType> GetSupportedImages(BaseItem item) public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
{ {
return new ImageType[] return
{ [
ImageType.Primary, ImageType.Primary,
ImageType.Logo, ImageType.Logo,
ImageType.Banner, ImageType.Banner,
ImageType.Backdrop ImageType.Backdrop
}; ];
} }
/// <inheritdoc /> /// <inheritdoc />
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{ {
var id = item.GetProviderId(MetadataProvider.MusicBrainzArtist); if (item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out var id))
if (!string.IsNullOrWhiteSpace(id))
{ {
await AudioDbArtistProvider.Current.EnsureArtistInfo(id, cancellationToken).ConfigureAwait(false); await AudioDbArtistProvider.Current.EnsureArtistInfo(id, cancellationToken).ConfigureAwait(false);
@ -75,7 +72,7 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
} }
} }
return Enumerable.Empty<RemoteImageInfo>(); return [];
} }
private List<RemoteImageInfo> GetImages(AudioDbArtistProvider.Artist item) private List<RemoteImageInfo> GetImages(AudioDbArtistProvider.Artist item)

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Album; public ExternalIdMediaType? Type => ExternalIdMediaType.Album;
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio; public bool Supports(IHasProviderIds item) => item is Audio;
} }

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.Plugins.AudioDb
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist; public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist;
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum; public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum;
} }

View File

@ -19,9 +19,6 @@ public class MusicBrainzAlbumArtistExternalId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.AlbumArtist; public ExternalIdMediaType? Type => ExternalIdMediaType.AlbumArtist;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio; public bool Supports(IHasProviderIds item) => item is Audio;
} }

View File

@ -0,0 +1,28 @@
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;
/// <summary>
/// External album artist URLs for MusicBrainz.
/// </summary>
public class MusicBrainzAlbumArtistExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "MusicBrainz Album Artist";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item is MusicAlbum)
{
if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbumArtist, out var externalId))
{
yield return Plugin.Instance!.Configuration.Server + $"/artist/{externalId}";
}
}
}
}

View File

@ -19,9 +19,6 @@ public class MusicBrainzAlbumExternalId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Album; public ExternalIdMediaType? Type => ExternalIdMediaType.Album;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/release/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum; public bool Supports(IHasProviderIds item) => item is Audio || item is MusicAlbum;
} }

View File

@ -0,0 +1,28 @@
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;
/// <summary>
/// External album URLs for MusicBrainz.
/// </summary>
public class MusicBrainzAlbumExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "MusicBrainz Album";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item is MusicAlbum)
{
if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbum, out var externalId))
{
yield return Plugin.Instance!.Configuration.Server + $"/release/{externalId}";
}
}
}
}

View File

@ -19,9 +19,6 @@ public class MusicBrainzArtistExternalId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Artist; public ExternalIdMediaType? Type => ExternalIdMediaType.Artist;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is MusicArtist; public bool Supports(IHasProviderIds item) => item is MusicArtist;
} }

View File

@ -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.MusicBrainz;
/// <summary>
/// External artist URLs for MusicBrainz.
/// </summary>
public class MusicBrainzArtistExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "MusicBrainz Artist";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out var externalId))
{
switch (item)
{
case MusicAlbum:
case Person:
yield return Plugin.Instance!.Configuration.Server + $"/artist/{externalId}";
break;
}
}
}
}

View File

@ -19,9 +19,6 @@ public class MusicBrainzOtherArtistExternalId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist; public ExternalIdMediaType? Type => ExternalIdMediaType.OtherArtist;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/artist/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum; public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum;
} }

View File

@ -19,9 +19,6 @@ public class MusicBrainzReleaseGroupExternalId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.ReleaseGroup; public ExternalIdMediaType? Type => ExternalIdMediaType.ReleaseGroup;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/release-group/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum; public bool Supports(IHasProviderIds item) => item is Audio or MusicAlbum;
} }

View File

@ -0,0 +1,28 @@
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;
/// <summary>
/// External release group URLs for MusicBrainz.
/// </summary>
public class MusicBrainzReleaseGroupExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "MusicBrainz Release Group";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item is MusicAlbum)
{
if (item.TryGetProviderId(MetadataProvider.MusicBrainzReleaseGroup, out var externalId))
{
yield return Plugin.Instance!.Configuration.Server + $"/release-group/{externalId}";
}
}
}
}

View File

@ -0,0 +1,28 @@
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;
/// <summary>
/// External track URLs for MusicBrainz.
/// </summary>
public class MusicBrainzTrackExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "MusicBrainz Track";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item is Audio)
{
if (item.TryGetProviderId(MetadataProvider.MusicBrainzTrack, out var externalId))
{
yield return Plugin.Instance!.Configuration.Server + $"/track/{externalId}";
}
}
}
}

View File

@ -19,9 +19,6 @@ public class MusicBrainzTrackId : IExternalId
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Track; public ExternalIdMediaType? Type => ExternalIdMediaType.Track;
/// <inheritdoc />
public string UrlFormatString => Plugin.Instance!.Configuration.Server + "/track/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Audio; public bool Supports(IHasProviderIds item) => item is Audio;
} }

View File

@ -20,9 +20,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.BoxSets
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.BoxSet; public ExternalIdMediaType? Type => ExternalIdMediaType.BoxSet;
/// <inheritdoc />
public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "collection/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {

View File

@ -20,9 +20,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.Movies
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Movie; public ExternalIdMediaType? Type => ExternalIdMediaType.Movie;
/// <inheritdoc />
public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "movie/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {

View File

@ -19,9 +19,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.People
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Person; public ExternalIdMediaType? Type => ExternalIdMediaType.Person;
/// <inheritdoc />
public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "person/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {

View File

@ -19,9 +19,6 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => ExternalIdMediaType.Series; public ExternalIdMediaType? Type => ExternalIdMediaType.Series;
/// <inheritdoc />
public string UrlFormatString => TmdbUtils.BaseTmdbUrl + "tv/{0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {

View File

@ -0,0 +1,95 @@
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;
/// <summary>
/// External URLs for TMDb.
/// </summary>
public class TmdbExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "TMDB";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
switch (item)
{
case Series:
if (item.TryGetProviderId(MetadataProvider.Tmdb, out var externalId))
{
yield return TmdbUtils.BaseTmdbUrl + $"tv/{externalId}";
}
break;
case Season season:
if (season.Series.TryGetProviderId(MetadataProvider.Tmdb, out var 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<TvGroupType>(season.Series.DisplayOrder, out var order))
{
if (order.Equals(TvGroupType.OriginalAirDate))
{
yield return TmdbUtils.BaseTmdbUrl + $"tv/{seriesExternalId}/season/{season.IndexNumber}";
}
}
}
break;
case Episode episode:
if (episode.Series.TryGetProviderId(MetadataProvider.Imdb, out 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<TvGroupType>(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:
if (item.TryGetProviderId(MetadataProvider.Tmdb, out externalId))
{
yield return TmdbUtils.BaseTmdbUrl + $"movie/{externalId}";
}
break;
case Person:
if (item.TryGetProviderId(MetadataProvider.Tmdb, out externalId))
{
yield return TmdbUtils.BaseTmdbUrl + $"person/{externalId}";
}
break;
case BoxSet:
if (item.TryGetProviderId(MetadataProvider.Tmdb, out externalId))
{
yield return TmdbUtils.BaseTmdbUrl + $"collection/{externalId}";
}
break;
}
}
}

View File

@ -18,9 +18,6 @@ namespace MediaBrowser.Providers.TV
/// <inheritdoc /> /// <inheritdoc />
public ExternalIdMediaType? Type => null; public ExternalIdMediaType? Type => null;
/// <inheritdoc />
public string UrlFormatString => "http://tvlistings.zap2it.com/overview.html?programSeriesId={0}";
/// <inheritdoc /> /// <inheritdoc />
public bool Supports(IHasProviderIds item) => item is Series; public bool Supports(IHasProviderIds item) => item is Series;
} }

View File

@ -0,0 +1,24 @@
using System.Collections.Generic;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.TV;
/// <summary>
/// External URLs for TMDb.
/// </summary>
public class Zap2ItExternalUrlProvider : IExternalUrlProvider
{
/// <inheritdoc/>
public string Name => "Zap2It";
/// <inheritdoc/>
public IEnumerable<string> GetExternalUrls(BaseItem item)
{
if (item.TryGetProviderId(MetadataProvider.Zap2It, out var externalId))
{
yield return $"http://tvlistings.zap2it.com/overview.html?programSeriesId={externalId}";
}
}
}

View File

@ -547,16 +547,13 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio); writer.WriteElementString("aspectratio", hasAspectRatio.AspectRatio);
} }
var tmdbCollection = item.GetProviderId(MetadataProvider.TmdbCollection); if (item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdbCollection))
if (!string.IsNullOrEmpty(tmdbCollection))
{ {
writer.WriteElementString("collectionnumber", tmdbCollection); writer.WriteElementString("collectionnumber", tmdbCollection);
writtenProviderIds.Add(MetadataProvider.TmdbCollection.ToString()); writtenProviderIds.Add(MetadataProvider.TmdbCollection.ToString());
} }
var imdb = item.GetProviderId(MetadataProvider.Imdb); if (item.TryGetProviderId(MetadataProvider.Imdb, out var imdb))
if (!string.IsNullOrEmpty(imdb))
{ {
if (item is Series) if (item is Series)
{ {
@ -573,16 +570,14 @@ namespace MediaBrowser.XbmcMetadata.Savers
// Series xml saver already saves this // Series xml saver already saves this
if (item is not Series) if (item is not Series)
{ {
var tvdb = item.GetProviderId(MetadataProvider.Tvdb); if (item.TryGetProviderId(MetadataProvider.Tvdb, out var tvdb))
if (!string.IsNullOrEmpty(tvdb))
{ {
writer.WriteElementString("tvdbid", tvdb); writer.WriteElementString("tvdbid", tvdb);
writtenProviderIds.Add(MetadataProvider.Tvdb.ToString()); writtenProviderIds.Add(MetadataProvider.Tvdb.ToString());
} }
} }
var tmdb = item.GetProviderId(MetadataProvider.Tmdb); if (item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdb))
if (!string.IsNullOrEmpty(tmdb))
{ {
writer.WriteElementString("tmdbid", tmdb); writer.WriteElementString("tmdbid", tmdb);
writtenProviderIds.Add(MetadataProvider.Tmdb.ToString()); writtenProviderIds.Add(MetadataProvider.Tmdb.ToString());
@ -690,64 +685,49 @@ namespace MediaBrowser.XbmcMetadata.Savers
} }
} }
var externalId = item.GetProviderId(MetadataProvider.AudioDbArtist); if (item.TryGetProviderId(MetadataProvider.AudioDbArtist, out var externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("audiodbartistid", externalId); writer.WriteElementString("audiodbartistid", externalId);
writtenProviderIds.Add(MetadataProvider.AudioDbArtist.ToString()); writtenProviderIds.Add(MetadataProvider.AudioDbArtist.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.AudioDbAlbum); if (item.TryGetProviderId(MetadataProvider.AudioDbAlbum, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("audiodbalbumid", externalId); writer.WriteElementString("audiodbalbumid", externalId);
writtenProviderIds.Add(MetadataProvider.AudioDbAlbum.ToString()); writtenProviderIds.Add(MetadataProvider.AudioDbAlbum.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.Zap2It); if (item.TryGetProviderId(MetadataProvider.Zap2It, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("zap2itid", externalId); writer.WriteElementString("zap2itid", externalId);
writtenProviderIds.Add(MetadataProvider.Zap2It.ToString()); writtenProviderIds.Add(MetadataProvider.Zap2It.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbum); if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbum, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("musicbrainzalbumid", externalId); writer.WriteElementString("musicbrainzalbumid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbum.ToString()); writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbum.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.MusicBrainzAlbumArtist); if (item.TryGetProviderId(MetadataProvider.MusicBrainzAlbumArtist, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("musicbrainzalbumartistid", externalId); writer.WriteElementString("musicbrainzalbumartistid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbumArtist.ToString()); writtenProviderIds.Add(MetadataProvider.MusicBrainzAlbumArtist.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.MusicBrainzArtist); if (item.TryGetProviderId(MetadataProvider.MusicBrainzArtist, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("musicbrainzartistid", externalId); writer.WriteElementString("musicbrainzartistid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzArtist.ToString()); writtenProviderIds.Add(MetadataProvider.MusicBrainzArtist.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.MusicBrainzReleaseGroup); if (item.TryGetProviderId(MetadataProvider.MusicBrainzReleaseGroup, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("musicbrainzreleasegroupid", externalId); writer.WriteElementString("musicbrainzreleasegroupid", externalId);
writtenProviderIds.Add(MetadataProvider.MusicBrainzReleaseGroup.ToString()); writtenProviderIds.Add(MetadataProvider.MusicBrainzReleaseGroup.ToString());
} }
externalId = item.GetProviderId(MetadataProvider.TvRage); if (item.TryGetProviderId(MetadataProvider.TvRage, out externalId))
if (!string.IsNullOrEmpty(externalId))
{ {
writer.WriteElementString("tvrageid", externalId); writer.WriteElementString("tvrageid", externalId);
writtenProviderIds.Add(MetadataProvider.TvRage.ToString()); writtenProviderIds.Add(MetadataProvider.TvRage.ToString());

View File

@ -92,9 +92,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
/// <inheritdoc /> /// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer) protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{ {
var imdb = item.GetProviderId(MetadataProvider.Imdb); if (item.TryGetProviderId(MetadataProvider.Imdb, out var imdb))
if (!string.IsNullOrEmpty(imdb))
{ {
writer.WriteElementString("id", imdb); writer.WriteElementString("id", imdb);
} }

View File

@ -54,9 +54,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{ {
var series = (Series)item; var series = (Series)item;
var tvdb = item.GetProviderId(MetadataProvider.Tvdb); if (item.TryGetProviderId(MetadataProvider.Tvdb, out var tvdb))
if (!string.IsNullOrEmpty(tvdb))
{ {
writer.WriteElementString("id", tvdb); writer.WriteElementString("id", tvdb);

View File

@ -344,15 +344,12 @@ public class RecordingsMetadataManager
await writer.WriteElementStringAsync(null, "credits", null, person).ConfigureAwait(false); await writer.WriteElementStringAsync(null, "credits", null, person).ConfigureAwait(false);
} }
var tmdbCollection = item.GetProviderId(MetadataProvider.TmdbCollection); if (item.TryGetProviderId(MetadataProvider.TmdbCollection, out var tmdbCollection))
if (!string.IsNullOrEmpty(tmdbCollection))
{ {
await writer.WriteElementStringAsync(null, "collectionnumber", null, tmdbCollection).ConfigureAwait(false); await writer.WriteElementStringAsync(null, "collectionnumber", null, tmdbCollection).ConfigureAwait(false);
} }
var imdb = item.GetProviderId(MetadataProvider.Imdb); if (item.TryGetProviderId(MetadataProvider.Imdb, out var imdb))
if (!string.IsNullOrEmpty(imdb))
{ {
if (!isSeriesEpisode) if (!isSeriesEpisode)
{ {
@ -365,8 +362,7 @@ public class RecordingsMetadataManager
lockData = false; lockData = false;
} }
var tvdb = item.GetProviderId(MetadataProvider.Tvdb); if (item.TryGetProviderId(MetadataProvider.Tvdb, out var tvdb))
if (!string.IsNullOrEmpty(tvdb))
{ {
await writer.WriteElementStringAsync(null, "tvdbid", null, tvdb).ConfigureAwait(false); await writer.WriteElementStringAsync(null, "tvdbid", null, tvdb).ConfigureAwait(false);
@ -374,8 +370,7 @@ public class RecordingsMetadataManager
lockData = false; lockData = false;
} }
var tmdb = item.GetProviderId(MetadataProvider.Tmdb); if (item.TryGetProviderId(MetadataProvider.Tmdb, out var tmdb))
if (!string.IsNullOrEmpty(tmdb))
{ {
await writer.WriteElementStringAsync(null, "tmdbid", null, tmdb).ConfigureAwait(false); await writer.WriteElementStringAsync(null, "tmdbid", null, tmdb).ConfigureAwait(false);

View File

@ -26,7 +26,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock<IProviderManager>(); var providerManager = new Mock<IProviderManager>();
var imdbExternalId = new ImdbExternalId(); 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<IHasProviderIds>())) providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>()))
.Returns(new[] { externalIdInfo }); .Returns(new[] { externalIdInfo });

View File

@ -34,7 +34,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock<IProviderManager>(); var providerManager = new Mock<IProviderManager>();
var tmdbExternalId = new TmdbMovieExternalId(); 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<IHasProviderIds>())) providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>()))
.Returns(new[] { externalIdInfo }); .Returns(new[] { externalIdInfo });

View File

@ -24,7 +24,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock<IProviderManager>(); var providerManager = new Mock<IProviderManager>();
var musicBrainzArtist = new MusicBrainzArtistExternalId(); 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<IHasProviderIds>())) providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>()))
.Returns(new[] { externalIdInfo }); .Returns(new[] { externalIdInfo });

View File

@ -24,7 +24,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
var providerManager = new Mock<IProviderManager>(); var providerManager = new Mock<IProviderManager>();
var musicBrainzArtist = new MusicBrainzArtistExternalId(); 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<IHasProviderIds>())) providerManager.Setup(x => x.GetExternalIdInfos(It.IsAny<IHasProviderIds>()))
.Returns(new[] { externalIdInfo }); .Returns(new[] { externalIdInfo });