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",