diff --git a/frontend/src/Components/Page/Header/SeriesSearchInputConnector.js b/frontend/src/Components/Page/Header/SeriesSearchInputConnector.js index afa6f25aa..6dab05693 100644 --- a/frontend/src/Components/Page/Header/SeriesSearchInputConnector.js +++ b/frontend/src/Components/Page/Header/SeriesSearchInputConnector.js @@ -21,6 +21,7 @@ function createCleanSeriesSelector() { tvdbId, tvMazeId, imdbId, + tmdbId, tags = [] } = series; @@ -33,6 +34,7 @@ function createCleanSeriesSelector() { tvdbId, tvMazeId, imdbId, + tmdbId, firstCharacter: title.charAt(0).toLowerCase(), tags: tags.reduce((acc, id) => { const matchingTag = allTags.find((tag) => tag.id === id); diff --git a/frontend/src/Components/Page/Header/SeriesSearchResult.js b/frontend/src/Components/Page/Header/SeriesSearchResult.js index c43e87605..8a9c35a73 100644 --- a/frontend/src/Components/Page/Header/SeriesSearchResult.js +++ b/frontend/src/Components/Page/Header/SeriesSearchResult.js @@ -14,6 +14,7 @@ function SeriesSearchResult(props) { tvdbId, tvMazeId, imdbId, + tmdbId, tags } = props; @@ -73,6 +74,14 @@ function SeriesSearchResult(props) { null } + { + match.key === 'tmdbId' && tmdbId ? +
+ TmdbId: {tmdbId} +
: + null + } + { tag ?
@@ -97,6 +106,7 @@ SeriesSearchResult.propTypes = { tvdbId: PropTypes.number, tvMazeId: PropTypes.number, imdbId: PropTypes.string, + tmdbId: PropTypes.number, tags: PropTypes.arrayOf(PropTypes.object).isRequired, match: PropTypes.object.isRequired }; diff --git a/frontend/src/Components/Page/Header/fuse.worker.js b/frontend/src/Components/Page/Header/fuse.worker.js index 53a3fd1fd..23a070617 100644 --- a/frontend/src/Components/Page/Header/fuse.worker.js +++ b/frontend/src/Components/Page/Header/fuse.worker.js @@ -13,6 +13,7 @@ const fuseOptions = { 'tvdbId', 'tvMazeId', 'imdbId', + 'tmdbId', 'tags.label' ] }; diff --git a/frontend/src/Series/Details/SeriesDetails.js b/frontend/src/Series/Details/SeriesDetails.js index b4e6303cc..c2fb80b8d 100644 --- a/frontend/src/Series/Details/SeriesDetails.js +++ b/frontend/src/Series/Details/SeriesDetails.js @@ -175,6 +175,7 @@ class SeriesDetails extends Component { tvdbId, tvMazeId, imdbId, + tmdbId, title, runtime, ratings, @@ -566,6 +567,7 @@ class SeriesDetails extends Component { tvdbId={tvdbId} tvMazeId={tvMazeId} imdbId={imdbId} + tmdbId={tmdbId} /> } kind={kinds.INVERSE} @@ -719,6 +721,7 @@ SeriesDetails.propTypes = { tvdbId: PropTypes.number.isRequired, tvMazeId: PropTypes.number, imdbId: PropTypes.string, + tmdbId: PropTypes.number, title: PropTypes.string.isRequired, runtime: PropTypes.number.isRequired, ratings: PropTypes.object.isRequired, diff --git a/frontend/src/Series/Details/SeriesDetailsLinks.js b/frontend/src/Series/Details/SeriesDetailsLinks.js index f396ecf67..1aa67f297 100644 --- a/frontend/src/Series/Details/SeriesDetailsLinks.js +++ b/frontend/src/Series/Details/SeriesDetailsLinks.js @@ -9,7 +9,8 @@ function SeriesDetailsLinks(props) { const { tvdbId, tvMazeId, - imdbId + imdbId, + tmdbId } = props; return ( @@ -71,6 +72,22 @@ function SeriesDetailsLinks(props) { } + + { + !!tmdbId && + + + + }
); } @@ -78,7 +95,8 @@ function SeriesDetailsLinks(props) { SeriesDetailsLinks.propTypes = { tvdbId: PropTypes.number.isRequired, tvMazeId: PropTypes.number, - imdbId: PropTypes.string + imdbId: PropTypes.string, + tmdbId: PropTypes.number }; export default SeriesDetailsLinks; diff --git a/frontend/src/Series/Series.ts b/frontend/src/Series/Series.ts index 0e54aff84..321fc7378 100644 --- a/frontend/src/Series/Series.ts +++ b/frontend/src/Series/Series.ts @@ -70,6 +70,7 @@ interface Series extends ModelBase { tvdbId: number; tvMazeId: number; tvRageId: number; + tmdbId: number; useSceneNumbering: boolean; year: number; isSaving?: boolean; diff --git a/frontend/src/Settings/MediaManagement/Naming/NamingModal.js b/frontend/src/Settings/MediaManagement/Naming/NamingModal.js index eec2449cd..3d1099822 100644 --- a/frontend/src/Settings/MediaManagement/Naming/NamingModal.js +++ b/frontend/src/Settings/MediaManagement/Naming/NamingModal.js @@ -99,6 +99,7 @@ const seriesTokens = [ const seriesIdTokens = [ { token: '{ImdbId}', example: 'tt12345' }, { token: '{TvdbId}', example: '12345' }, + { token: '{TmdbId}', example: '11223' }, { token: '{TvMazeId}', example: '54321' } ]; diff --git a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs index 47bd40c99..b0fc4998b 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabRequestGeneratorFixture.cs @@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests _singleEpisodeSearchCriteria = new SingleEpisodeSearchCriteria { - Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40" }, + Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40", TmdbId = 50 }, SceneTitles = new List { "Monkey Island" }, SeasonNumber = 1, EpisodeNumber = 2 @@ -44,14 +44,14 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests _seasonSearchCriteria = new SeasonSearchCriteria { - Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40" }, + Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40", TmdbId = 50 }, SceneTitles = new List { "Monkey Island" }, SeasonNumber = 1, }; _animeSearchCriteria = new AnimeEpisodeSearchCriteria() { - Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40" }, + Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40", TmdbId = 50 }, SceneTitles = new List() { "Monkey+Island" }, AbsoluteEpisodeNumber = 100, SeasonNumber = 5, @@ -60,7 +60,7 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests _animeSeasonSearchCriteria = new AnimeSeasonSearchCriteria() { - Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40" }, + Series = new Tv.Series { TvRageId = 10, TvdbId = 20, TvMazeId = 30, ImdbId = "t40", TmdbId = 50 }, SceneTitles = new List { "Monkey Island" }, SeasonNumber = 3, }; @@ -268,6 +268,19 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests page.Url.Query.Should().Contain("imdbid=t40"); } + [Test] + public void should_search_by_tmdb_if_supported() + { + _capabilities.SupportedTvSearchParameters = new[] { "q", "tmdbid", "season", "ep" }; + + var results = Subject.GetSearchRequests(_singleEpisodeSearchCriteria); + results.GetTier(0).Should().HaveCount(1); + + var page = results.GetAllTiers().First().First(); + + page.Url.Query.Should().Contain("tmdbid=50"); + } + [Test] public void should_prefer_search_by_tvdbid_if_rid_supported() { diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs index 456025890..4836abb5a 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs @@ -56,5 +56,14 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests Subject.GetSeriesFolder(_series) .Should().Be($"Series Title ({_series.TvMazeId})"); } + + [Test] + public void should_add_tmdb_id() + { + _namingConfig.SeriesFolderFormat = "{Series Title} ({TmdbId})"; + + Subject.GetSeriesFolder(_series) + .Should().Be($"Series Title ({_series.TmdbId})"); + } } } diff --git a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs index 429eef2d2..91e6b65f0 100644 --- a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs +++ b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs @@ -137,6 +137,20 @@ namespace NzbDrone.Core.Test.TvTests .Verify(v => v.UpdateSeries(It.Is(s => s.TvMazeId == newSeriesInfo.TvMazeId), It.IsAny(), It.IsAny())); } + [Test] + public void should_update_tmdb_id_if_changed() + { + var newSeriesInfo = _series.JsonClone(); + newSeriesInfo.TmdbId = _series.TmdbId + 1; + + GivenNewSeriesInfo(newSeriesInfo); + + Subject.Execute(new RefreshSeriesCommand(new List { _series.Id })); + + Mocker.GetMock() + .Verify(v => v.UpdateSeries(It.Is(s => s.TmdbId == newSeriesInfo.TmdbId), It.IsAny(), It.IsAny())); + } + [Test] public void should_log_error_if_tvdb_id_not_found() { diff --git a/src/NzbDrone.Core/Datastore/Migration/206_add_tmdbid.cs b/src/NzbDrone.Core/Datastore/Migration/206_add_tmdbid.cs new file mode 100644 index 000000000..0f5151e46 --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/206_add_tmdbid.cs @@ -0,0 +1,15 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(206)] + public class add_tmdbid : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("Series").AddColumn("TmdbId").AsInt32().WithDefaultValue(0); + Create.Index().OnTable("Series").OnColumn("TmdbId"); + } + } +} diff --git a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/KodiEpisodeGuide.cs b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/KodiEpisodeGuide.cs index 0cb287456..3a85357af 100644 --- a/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/KodiEpisodeGuide.cs +++ b/src/NzbDrone.Core/Extras/Metadata/Consumers/Xbmc/KodiEpisodeGuide.cs @@ -29,6 +29,7 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc Tvdb = series.TvdbId.ToString(); TvMaze = series.TvMazeId > 0 ? series.TvMazeId.ToString() : null; TvRage = series.TvRageId > 0 ? series.TvMazeId.ToString() : null; + Tmdb = series.TmdbId > 0 ? series.TmdbId.ToString() : null; Imdb = series.ImdbId; } } diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs index 4786900a9..fddd5168e 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs @@ -119,12 +119,23 @@ namespace NzbDrone.Core.Indexers.Newznab } } + private bool SupportsTmdbSearch + { + get + { + var capabilities = _capabilitiesProvider.GetCapabilities(Settings); + + return capabilities.SupportedTvSearchParameters != null && + capabilities.SupportedTvSearchParameters.Contains("tmdbid"); + } + } + // Combines all ID based searches private bool SupportsTvIdSearches { get { - return SupportsTvdbSearch || SupportsImdbSearch || SupportsTvRageSearch || SupportsTvMazeSearch; + return SupportsTvdbSearch || SupportsImdbSearch || SupportsTvRageSearch || SupportsTvMazeSearch || SupportsTmdbSearch; } } @@ -484,8 +495,9 @@ namespace NzbDrone.Core.Indexers.Newznab var includeImdbSearch = SupportsImdbSearch && searchCriteria.Series.ImdbId.IsNotNullOrWhiteSpace(); var includeTvRageSearch = SupportsTvRageSearch && searchCriteria.Series.TvRageId > 0; var includeTvMazeSearch = SupportsTvMazeSearch && searchCriteria.Series.TvMazeId > 0; + var includeTmdbSearch = SupportsTmdbSearch && searchCriteria.Series.TmdbId > 0; - if (SupportsAggregatedIdSearch && (includeTvdbSearch || includeTvRageSearch || includeTvMazeSearch)) + if (SupportsAggregatedIdSearch && (includeTvdbSearch || includeTvRageSearch || includeTvMazeSearch || includeTmdbSearch)) { var ids = ""; @@ -509,6 +521,11 @@ namespace NzbDrone.Core.Indexers.Newznab ids += "&tvmazeid=" + searchCriteria.Series.TvMazeId; } + if (includeTmdbSearch) + { + ids += "&tmdbid=" + searchCriteria.Series.TmdbId; + } + chain.Add(GetPagedRequests(MaxPages, categories, "tvsearch", ids + parameters)); } else @@ -541,6 +558,13 @@ namespace NzbDrone.Core.Indexers.Newznab "tvsearch", $"&tvmazeid={searchCriteria.Series.TvMazeId}{parameters}")); } + else if (includeTmdbSearch) + { + chain.Add(GetPagedRequests(MaxPages, + categories, + "tvsearch", + $"&tmdbid={searchCriteria.Series.TmdbId}{parameters}")); + } } } diff --git a/src/NzbDrone.Core/MediaFiles/ScriptImportDecider.cs b/src/NzbDrone.Core/MediaFiles/ScriptImportDecider.cs index 6e4b77048..bd1d54080 100644 --- a/src/NzbDrone.Core/MediaFiles/ScriptImportDecider.cs +++ b/src/NzbDrone.Core/MediaFiles/ScriptImportDecider.cs @@ -137,6 +137,7 @@ namespace NzbDrone.Core.MediaFiles environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_OriginalLanguage", IsoLanguages.Get(series.OriginalLanguage).ThreeLetterCode); diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ShowResource.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ShowResource.cs index c7acd354a..5cc7fce36 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ShowResource.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/ShowResource.cs @@ -23,6 +23,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook.Resource public string LastAired { get; set; } public int? TvRageId { get; set; } public int? TvMazeId { get; set; } + public int? TmdbId { get; set; } public string Status { get; set; } public int? Runtime { get; set; } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index 9313b0661..c6656816d 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -188,6 +188,11 @@ namespace NzbDrone.Core.MetadataSource.SkyHook series.TvMazeId = show.TvMazeId.Value; } + if (show.TmdbId.HasValue) + { + series.TmdbId = show.TmdbId.Value; + } + series.ImdbId = show.ImdbId; series.Title = show.Title; series.CleanTitle = Parser.Parser.CleanSeriesTitle(show.Title); diff --git a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs index 6b6f3a086..1df4f95a8 100644 --- a/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs +++ b/src/NzbDrone.Core/Notifications/CustomScript/CustomScript.cs @@ -69,6 +69,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_TitleSlug", series.TitleSlug); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -116,6 +117,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -181,6 +183,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -213,6 +216,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -252,6 +256,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -276,6 +281,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); @@ -345,6 +351,7 @@ namespace NzbDrone.Core.Notifications.CustomScript environmentVariables.Add("Sonarr_Series_Path", series.Path); environmentVariables.Add("Sonarr_Series_TvdbId", series.TvdbId.ToString()); environmentVariables.Add("Sonarr_Series_TvMazeId", series.TvMazeId.ToString()); + environmentVariables.Add("Sonarr_Series_TmdbId", series.TmdbId.ToString()); environmentVariables.Add("Sonarr_Series_ImdbId", series.ImdbId ?? string.Empty); environmentVariables.Add("Sonarr_Series_Type", series.SeriesType.ToString()); environmentVariables.Add("Sonarr_Series_Year", series.Year.ToString()); diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserItems.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserItems.cs index e47696273..b6e327c86 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserItems.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserItems.cs @@ -20,6 +20,7 @@ namespace NzbDrone.Core.Notifications.Emby public string Imdb { get; set; } public int Tvdb { get; set; } public int TvMaze { get; set; } + public int Tmdb { get; set; } public int TvRage { get; set; } } diff --git a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserProxy.cs b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserProxy.cs index 428f35a69..3d074034b 100644 --- a/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserProxy.cs +++ b/src/NzbDrone.Core/Notifications/MediaBrowser/MediaBrowserProxy.cs @@ -68,6 +68,11 @@ namespace NzbDrone.Core.Notifications.Emby return MediaBrowserMatchQuality.Id; } + if (item is { ProviderIds.Tmdb: int tmdbid } && tmdbid != 0 && tmdbid == series.TmdbId) + { + return MediaBrowserMatchQuality.Id; + } + if (item is { ProviderIds.TvRage: int tvrageid } && tvrageid != 0 && tvrageid == series.TvRageId) { return MediaBrowserMatchQuality.Id; diff --git a/src/NzbDrone.Core/Notifications/Webhook/WebhookSeries.cs b/src/NzbDrone.Core/Notifications/Webhook/WebhookSeries.cs index 1177f2065..de1da85ad 100644 --- a/src/NzbDrone.Core/Notifications/Webhook/WebhookSeries.cs +++ b/src/NzbDrone.Core/Notifications/Webhook/WebhookSeries.cs @@ -12,6 +12,7 @@ namespace NzbDrone.Core.Notifications.Webhook public string Path { get; set; } public int TvdbId { get; set; } public int TvMazeId { get; set; } + public int TmdbId { get; set; } public string ImdbId { get; set; } public SeriesTypes Type { get; set; } public int Year { get; set; } @@ -31,6 +32,7 @@ namespace NzbDrone.Core.Notifications.Webhook Path = series.Path; TvdbId = series.TvdbId; TvMazeId = series.TvMazeId; + TmdbId = series.TmdbId; ImdbId = series.ImdbId; Type = series.SeriesType; Year = series.Year; diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index a04dfa771..714605a99 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -715,6 +715,7 @@ namespace NzbDrone.Core.Organizer tokenHandlers["{ImdbId}"] = m => series.ImdbId ?? string.Empty; tokenHandlers["{TvdbId}"] = m => series.TvdbId.ToString(); tokenHandlers["{TvMazeId}"] = m => series.TvMazeId > 0 ? series.TvMazeId.ToString() : string.Empty; + tokenHandlers["{TmdbId}"] = m => series.TmdbId > 0 ? series.TmdbId.ToString() : string.Empty; } private string GetCustomFormatsToken(List customFormats, string filter) diff --git a/src/NzbDrone.Core/Organizer/FileNameSampleService.cs b/src/NzbDrone.Core/Organizer/FileNameSampleService.cs index a8d89364a..92bf1e4c1 100644 --- a/src/NzbDrone.Core/Organizer/FileNameSampleService.cs +++ b/src/NzbDrone.Core/Organizer/FileNameSampleService.cs @@ -48,7 +48,8 @@ namespace NzbDrone.Core.Organizer Year = 2010, ImdbId = "tt12345", TvdbId = 12345, - TvMazeId = 54321 + TvMazeId = 54321, + TmdbId = 11223 }; _dailySeries = new Series @@ -58,7 +59,8 @@ namespace NzbDrone.Core.Organizer Year = 2010, ImdbId = "tt12345", TvdbId = 12345, - TvMazeId = 54321 + TvMazeId = 54321, + TmdbId = 11223 }; _animeSeries = new Series @@ -68,7 +70,8 @@ namespace NzbDrone.Core.Organizer Year = 2010, ImdbId = "tt12345", TvdbId = 12345, - TvMazeId = 54321 + TvMazeId = 54321, + TmdbId = 11223 }; _episode1 = new Episode diff --git a/src/NzbDrone.Core/Tv/RefreshSeriesService.cs b/src/NzbDrone.Core/Tv/RefreshSeriesService.cs index 41a3b5cae..49aa9ebf6 100644 --- a/src/NzbDrone.Core/Tv/RefreshSeriesService.cs +++ b/src/NzbDrone.Core/Tv/RefreshSeriesService.cs @@ -92,6 +92,7 @@ namespace NzbDrone.Core.Tv series.TitleSlug = seriesInfo.TitleSlug; series.TvRageId = seriesInfo.TvRageId; series.TvMazeId = seriesInfo.TvMazeId; + series.TmdbId = seriesInfo.TmdbId; series.ImdbId = seriesInfo.ImdbId; series.AirTime = seriesInfo.AirTime; series.Overview = seriesInfo.Overview; diff --git a/src/NzbDrone.Core/Tv/Series.cs b/src/NzbDrone.Core/Tv/Series.cs index 6296d8500..9819773a0 100644 --- a/src/NzbDrone.Core/Tv/Series.cs +++ b/src/NzbDrone.Core/Tv/Series.cs @@ -23,6 +23,7 @@ namespace NzbDrone.Core.Tv public int TvRageId { get; set; } public int TvMazeId { get; set; } public string ImdbId { get; set; } + public int TmdbId { get; set; } public string Title { get; set; } public string CleanTitle { get; set; } public string SortTitle { get; set; } diff --git a/src/Sonarr.Api.V3/Series/SeriesResource.cs b/src/Sonarr.Api.V3/Series/SeriesResource.cs index e1c87a434..af1490270 100644 --- a/src/Sonarr.Api.V3/Series/SeriesResource.cs +++ b/src/Sonarr.Api.V3/Series/SeriesResource.cs @@ -51,6 +51,7 @@ namespace Sonarr.Api.V3.Series public int TvdbId { get; set; } public int TvRageId { get; set; } public int TvMazeId { get; set; } + public int TmdbId { get; set; } public DateTime? FirstAired { get; set; } public DateTime? LastAired { get; set; } public SeriesTypes SeriesType { get; set; } @@ -123,6 +124,7 @@ namespace Sonarr.Api.V3.Series TvdbId = model.TvdbId, TvRageId = model.TvRageId, TvMazeId = model.TvMazeId, + TmdbId = model.TmdbId, FirstAired = model.FirstAired, LastAired = model.LastAired, SeriesType = model.SeriesType, @@ -187,6 +189,7 @@ namespace Sonarr.Api.V3.Series TvdbId = resource.TvdbId, TvRageId = resource.TvRageId, TvMazeId = resource.TvMazeId, + TmdbId = resource.TmdbId, FirstAired = resource.FirstAired, SeriesType = resource.SeriesType, CleanTitle = resource.CleanTitle, diff --git a/src/Sonarr.Api.V3/openapi.json b/src/Sonarr.Api.V3/openapi.json index 251cdae2f..1e390e679 100644 --- a/src/Sonarr.Api.V3/openapi.json +++ b/src/Sonarr.Api.V3/openapi.json @@ -11585,6 +11585,10 @@ "type": "integer", "format": "int32" }, + "tmdbId": { + "type": "integer", + "format": "int32" + }, "firstAired": { "type": "string", "format": "date-time",