mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-05-25 18:16:56 +01:00
Season and episode directories/files can now include provider ID
attributes in their names (e.g. "Season 01 [tvdbid=22222]" or
"Show S01E01 [tmdbid=99999].mkv"), consistent with the existing
behavior for series folders.
Supported providers: imdbid, tvdbid, tvmazeid, tmdbid.
Adds TmdbSeasonExternalId and TmdbEpisodeExternalId so that
the TMDB season and episode IDs are surfaced in the metadata editor.
Seasons do not have their own IMDb IDs, so we don't support imdbid parsing
in SeasonResolver. Instead, generate IMDb season URLs via
ImdbExternalUrlProvider using the parent series' IMDb ID and the
season number, matching the IMDb URL format:
imdb.com/title/{seriesId}/episodes/?season={N}
Add tests for the ExternalUrlProviders.
126 lines
4.2 KiB
C#
126 lines
4.2 KiB
C#
using System;
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Entities.Movies;
|
|
using MediaBrowser.Controller.Entities.TV;
|
|
using MediaBrowser.Controller.Library;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Providers.Movies;
|
|
using Moq;
|
|
using Xunit;
|
|
|
|
namespace Jellyfin.Providers.Tests.ExternalId
|
|
{
|
|
// put tests that mock the static LibraryManager in the same collection to avoid test interference
|
|
[Collection("LibraryManagerTests")]
|
|
public sealed class ImdbExternalUrlProviderTests : IDisposable
|
|
{
|
|
private readonly ImdbExternalUrlProvider _provider = new();
|
|
private readonly Mock<ILibraryManager> _libraryManagerMock = new();
|
|
private readonly ILibraryManager? _previousLibraryManager;
|
|
|
|
public ImdbExternalUrlProviderTests()
|
|
{
|
|
_previousLibraryManager = BaseItem.LibraryManager;
|
|
BaseItem.LibraryManager = _libraryManagerMock.Object;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
BaseItem.LibraryManager = _previousLibraryManager;
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_MovieWithImdbId_ReturnsCorrectUrl()
|
|
{
|
|
var movie = new Movie();
|
|
movie.SetProviderId(MetadataProvider.Imdb, "tt1234567");
|
|
|
|
var urls = _provider.GetExternalUrls(movie);
|
|
|
|
Assert.Contains("https://www.imdb.com/title/tt1234567", urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_SeriesWithImdbId_ReturnsCorrectUrl()
|
|
{
|
|
var series = new Series();
|
|
series.SetProviderId(MetadataProvider.Imdb, "tt7654321");
|
|
|
|
var urls = _provider.GetExternalUrls(series);
|
|
|
|
Assert.Contains("https://www.imdb.com/title/tt7654321", urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_EpisodeWithImdbId_ReturnsCorrectUrl()
|
|
{
|
|
var episode = new Episode();
|
|
episode.SetProviderId(MetadataProvider.Imdb, "tt9999999");
|
|
|
|
var urls = _provider.GetExternalUrls(episode);
|
|
|
|
Assert.Contains("https://www.imdb.com/title/tt9999999", urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_SeasonWithSeriesImdbId_ReturnsSeasonEpisodesUrl()
|
|
{
|
|
var series = new Series { Id = Guid.NewGuid() };
|
|
series.SetProviderId(MetadataProvider.Imdb, "tt1234567");
|
|
|
|
var season = new Season { IndexNumber = 2, SeriesId = series.Id };
|
|
_libraryManagerMock.Setup(m => m.GetItemById(series.Id)).Returns(series);
|
|
|
|
var urls = _provider.GetExternalUrls(season);
|
|
|
|
Assert.Contains("https://www.imdb.com/title/tt1234567/episodes/?season=2", urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_SeasonWithNoSeriesImdbId_ReturnsNoUrl()
|
|
{
|
|
var series = new Series { Id = Guid.NewGuid() };
|
|
var season = new Season { IndexNumber = 1, SeriesId = series.Id };
|
|
_libraryManagerMock.Setup(m => m.GetItemById(series.Id)).Returns(series);
|
|
|
|
var urls = _provider.GetExternalUrls(season);
|
|
|
|
Assert.Empty(urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_SeasonWithNoIndexNumber_ReturnsNoUrl()
|
|
{
|
|
var series = new Series { Id = Guid.NewGuid() };
|
|
series.SetProviderId(MetadataProvider.Imdb, "tt1234567");
|
|
var season = new Season { IndexNumber = null, SeriesId = series.Id };
|
|
_libraryManagerMock.Setup(m => m.GetItemById(series.Id)).Returns(series);
|
|
|
|
var urls = _provider.GetExternalUrls(season);
|
|
|
|
Assert.Empty(urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_SeasonWithUnknownSeriesId_ReturnsNoUrl()
|
|
{
|
|
var season = new Season { IndexNumber = 1, SeriesId = Guid.NewGuid() };
|
|
_libraryManagerMock.Setup(m => m.GetItemById(It.IsAny<Guid>())).Returns((BaseItem?)null);
|
|
|
|
var urls = _provider.GetExternalUrls(season);
|
|
|
|
Assert.Empty(urls);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetExternalUrls_ItemWithNoImdbId_ReturnsNoUrl()
|
|
{
|
|
var movie = new Movie();
|
|
|
|
var urls = _provider.GetExternalUrls(movie);
|
|
|
|
Assert.Empty(urls);
|
|
}
|
|
}
|
|
}
|