From c8ae183d68f606f7025c30cd9e86a97891cee7d3 Mon Sep 17 00:00:00 2001 From: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com> Date: Thu, 21 Jul 2022 17:43:56 +0100 Subject: [PATCH] cardigann: add tvmaze support (#13389) Follow up to: #13385 #13387 Includes a couple of fixes for the latter. --- src/Jackett.Common/Content/custom.css | 4 ++++ src/Jackett.Common/Content/custom.js | 5 +++++ src/Jackett.Common/Content/custom_mobile.css | 4 ++++ src/Jackett.Common/Content/index.html | 10 +++++----- src/Jackett.Common/Content/login.html | 2 +- src/Jackett.Common/Indexers/CardigannIndexer.cs | 11 +++++++++-- src/Jackett.Common/Models/DTO/TorznabRequest.cs | 3 +++ src/Jackett.Common/Models/ReleaseInfo.cs | 4 +++- src/Jackett.Common/Models/ResultPage.cs | 1 + src/Jackett.Common/Models/TorznabCapabilities.cs | 10 +++++++--- src/Jackett.Common/Models/TorznabQuery.cs | 4 ++++ .../Common/Models/TorznabCapabilitiesTests.cs | 2 +- 12 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/Jackett.Common/Content/custom.css b/src/Jackett.Common/Content/custom.css index eba212b0f..ab3aada54 100644 --- a/src/Jackett.Common/Content/custom.css +++ b/src/Jackett.Common/Content/custom.css @@ -309,6 +309,10 @@ table td.fit{ background-color: #86cca8; } +.label-tvmaze { + background-color: #73c3bd; +} + .label-trakt { background-color: #ef1e25; } diff --git a/src/Jackett.Common/Content/custom.js b/src/Jackett.Common/Content/custom.js index f06ed5bd2..d7a5b7e30 100644 --- a/src/Jackett.Common/Content/custom.js +++ b/src/Jackett.Common/Content/custom.js @@ -973,6 +973,7 @@ function updateReleasesRow(row) { var IMDBId = $(row).data("imdb"); var TMDBId = $(row).data("tmdb"); var TVDBId = $(row).data("tvdb"); + var TVMazeId = $(row).data("tvmaze"); var TraktId = $(row).data("trakt"); var DoubanId = $(row).data("douban"); var Poster = $(row).data("poster"); @@ -1012,6 +1013,10 @@ function updateReleasesRow(row) { labels.append('\nTVDB'); } + if (TVMazeId && TVMazeId > 0) { + labels.append('\nTVMaze'); + } + if (TraktId && TraktId > 0) { var TraktType = (Cat.includes("Movies")) ? "movies" : "shows"; labels.append('\nTrakt'); diff --git a/src/Jackett.Common/Content/custom_mobile.css b/src/Jackett.Common/Content/custom_mobile.css index cfba896df..8ff09a348 100644 --- a/src/Jackett.Common/Content/custom_mobile.css +++ b/src/Jackett.Common/Content/custom_mobile.css @@ -292,6 +292,10 @@ table td.fit{ background-color: #86cca8; } +.label-tvmaze { + background-color: #73c3bd; +} + .label-trakt { background-color: #ef1e25; } diff --git a/src/Jackett.Common/Content/index.html b/src/Jackett.Common/Content/index.html index 726727c2c..97dfd41c2 100644 --- a/src/Jackett.Common/Content/index.html +++ b/src/Jackett.Common/Content/index.html @@ -28,8 +28,8 @@ - - + + @@ -458,7 +458,7 @@ {{#each releases}} - + {{PublishDate}} {{FirstSeen}} {{jacketTimespan PublishDate}} @@ -586,7 +586,7 @@ {{#each Results}} - + {{PublishDate}} {{jacketTimespan PublishDate}} {{Tracker}} @@ -754,6 +754,6 @@ - + diff --git a/src/Jackett.Common/Content/login.html b/src/Jackett.Common/Content/login.html index 204259c2d..44684c87d 100644 --- a/src/Jackett.Common/Content/login.html +++ b/src/Jackett.Common/Content/login.html @@ -16,7 +16,7 @@ - + Jackett diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index ac17c1d6e..e8d1e226b 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -38,7 +38,7 @@ namespace Jackett.Common.Indexers set => base.configData = value; } - protected readonly string[] OptionalFields = { "imdb", "imdbid", "tmdbid", "rageid", "tvdbid", "traktid", "doubanid", "poster", "description" }; + protected readonly string[] OptionalFields = { "imdb", "imdbid", "tmdbid", "rageid", "tvdbid", "tvmazeid", "traktid", "doubanid", "poster", "description" }; private static readonly string[] _SupportedLogicFunctions = { @@ -1300,7 +1300,7 @@ namespace Jackett.Common.Indexers variables[".Query.IMDBID"] = query.ImdbID; variables[".Query.IMDBIDShort"] = query.ImdbIDShort; variables[".Query.TMDBID"] = query.TmdbID?.ToString() ?? null; - variables[".Query.TVMazeID"] = null; + variables[".Query.TVMazeID"] = query.TvmazeID?.ToString() ?? null; variables[".Query.TraktID"] = query.TraktID?.ToString() ?? null; variables[".Query.DoubanID"] = query.DoubanID?.ToString() ?? null; variables[".Query.Album"] = query.Album; @@ -2058,6 +2058,13 @@ namespace Jackett.Common.Indexers release.TVDBId = ParseUtil.CoerceLong(TVDBId); value = release.TVDBId.ToString(); break; + case "tvmazeid": + var TVMazeIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); + var TVMazeIdMatch = TVMazeIdRegEx.Match(value); + var TVMazeId = TVMazeIdMatch.Groups[1].Value; + release.TVMazeId = ParseUtil.CoerceLong(TVMazeId); + value = release.TVMazeId.ToString(); + break; case "traktid": var TraktIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); var TraktIdMatch = TraktIdRegEx.Match(value); diff --git a/src/Jackett.Common/Models/DTO/TorznabRequest.cs b/src/Jackett.Common/Models/DTO/TorznabRequest.cs index 3817bd202..8e9a24522 100644 --- a/src/Jackett.Common/Models/DTO/TorznabRequest.cs +++ b/src/Jackett.Common/Models/DTO/TorznabRequest.cs @@ -18,6 +18,7 @@ namespace Jackett.Common.Models.DTO public string rid { get; set; } public string tvdbid { get; set; } public string tmdbid { get; set; } + public string tvmazeid { get; set; } public string traktid { get; set; } public string doubanid { get; set; } public string album { get; set; } @@ -72,6 +73,8 @@ namespace Jackett.Common.Models.DTO query.RageID = int.Parse(request.rid); if (!string.IsNullOrWhiteSpace(request.tvdbid)) query.TvdbID = int.Parse(request.tvdbid); + if (!string.IsNullOrWhiteSpace(request.tvmazeid)) + query.TvmazeID = int.Parse(request.tvmazeid); if (!string.IsNullOrWhiteSpace(request.tmdbid)) query.TmdbID = int.Parse(request.tmdbid); diff --git a/src/Jackett.Common/Models/ReleaseInfo.cs b/src/Jackett.Common/Models/ReleaseInfo.cs index 7fccba691..82b637f40 100644 --- a/src/Jackett.Common/Models/ReleaseInfo.cs +++ b/src/Jackett.Common/Models/ReleaseInfo.cs @@ -24,6 +24,7 @@ namespace Jackett.Common.Models public long? TVDBId { get; set; } public long? Imdb { get; set; } public long? TMDb { get; set; } + public long? TVMazeId { get; set; } public long? TraktId { get; set; } public long? DoubanId { get; set; } public ICollection Genres { get; set; } @@ -68,6 +69,7 @@ namespace Jackett.Common.Models TVDBId = copyFrom.TVDBId; Imdb = copyFrom.Imdb; TMDb = copyFrom.TMDb; + TVMazeId = copyFrom.TVMazeId; TraktId = copyFrom.TraktId; DoubanId = copyFrom.DoubanId; Genres = copyFrom.Genres; @@ -128,6 +130,6 @@ namespace Jackett.Common.Models public static long BytesFromKB(float kb) => (long)(kb * 1024f); public override string ToString() => - $"[ReleaseInfo: Title={Title}, Guid={Guid}, Link={Link}, Details={Details}, PublishDate={PublishDate}, Category={Category}, Size={Size}, Files={Files}, Grabs={Grabs}, Description={Description}, RageID={RageID}, TVDBId={TVDBId}, Imdb={Imdb}, TMDb={TMDb}, TraktId={TraktId}, DoubanId={DoubanId}, Seeders={Seeders}, Peers={Peers}, Poster={Poster}, InfoHash={InfoHash}, MagnetUri={MagnetUri}, MinimumRatio={MinimumRatio}, MinimumSeedTime={MinimumSeedTime}, DownloadVolumeFactor={DownloadVolumeFactor}, UploadVolumeFactor={UploadVolumeFactor}, Gain={Gain}]"; + $"[ReleaseInfo: Title={Title}, Guid={Guid}, Link={Link}, Details={Details}, PublishDate={PublishDate}, Category={Category}, Size={Size}, Files={Files}, Grabs={Grabs}, Description={Description}, RageID={RageID}, TVDBId={TVDBId}, Imdb={Imdb}, TMDb={TMDb}, TVMazeId={TVMazeId}, TraktId={TraktId}, DoubanId={DoubanId}, Seeders={Seeders}, Peers={Peers}, Poster={Poster}, InfoHash={InfoHash}, MagnetUri={MagnetUri}, MinimumRatio={MinimumRatio}, MinimumSeedTime={MinimumSeedTime}, DownloadVolumeFactor={DownloadVolumeFactor}, UploadVolumeFactor={UploadVolumeFactor}, Gain={Gain}]"; } } diff --git a/src/Jackett.Common/Models/ResultPage.cs b/src/Jackett.Common/Models/ResultPage.cs index 98a46de88..d546a9cce 100644 --- a/src/Jackett.Common/Models/ResultPage.cs +++ b/src/Jackett.Common/Models/ResultPage.cs @@ -99,6 +99,7 @@ namespace Jackett.Common.Models GetTorznabElement("imdb", r.Imdb?.ToString("D7")), GetTorznabElement("imdbid", r.Imdb != null ? "tt" + r.Imdb?.ToString("D7") : null), GetTorznabElement("tmdbid", r.TMDb), + GetTorznabElement("tvmazeid", r.TVMazeId), GetTorznabElement("traktid", r.TraktId), GetTorznabElement("doubanid", r.DoubanId), r.Genres == null ? null : GetTorznabElement("genre", string.Join(", ", r.Genres)), diff --git a/src/Jackett.Common/Models/TorznabCapabilities.cs b/src/Jackett.Common/Models/TorznabCapabilities.cs index 991090b36..0b5ee43bc 100644 --- a/src/Jackett.Common/Models/TorznabCapabilities.cs +++ b/src/Jackett.Common/Models/TorznabCapabilities.cs @@ -14,6 +14,7 @@ namespace Jackett.Common.Models TvdbId, RId, TmdbId, + TvmazeId, TraktId } @@ -59,6 +60,7 @@ namespace Jackett.Common.Models public bool TvSearchTvdbAvailable => (TvSearchParams.Contains(TvSearchParam.TvdbId)); public bool TvSearchTvRageAvailable => (TvSearchParams.Contains(TvSearchParam.RId)); public bool TvSearchTmdbAvailable => (TvSearchParams.Contains(TvSearchParam.TmdbId)); + public bool TvSearchTvMazeAvailable => (TvSearchParams.Contains(TvSearchParam.TvmazeId)); public bool TvSearchTraktAvailable => (TvSearchParams.Contains(TvSearchParam.TraktId)); public List MovieSearchParams; @@ -193,7 +195,9 @@ namespace Jackett.Common.Models parameters.Add("rid"); if (TvSearchTmdbAvailable) parameters.Add("tmdbid"); - if (TvSearchTmdbAvailable) + if (TvSearchTvMazeAvailable) + parameters.Add("tvmazeid"); + if (TvSearchTraktAvailable) parameters.Add("traktid"); return string.Join(",", parameters); } @@ -205,9 +209,9 @@ namespace Jackett.Common.Models parameters.Add("imdbid"); if (MovieSearchTmdbAvailable) parameters.Add("tmdbid"); - if (MovieSearchImdbAvailable) + if (MovieSearchTraktAvailable) parameters.Add("traktid"); - if (MovieSearchTmdbAvailable) + if (MovieSearchDoubanAvailable) parameters.Add("doubanid"); return string.Join(",", parameters); } diff --git a/src/Jackett.Common/Models/TorznabQuery.cs b/src/Jackett.Common/Models/TorznabQuery.cs index 7d10eafb0..acddaca97 100644 --- a/src/Jackett.Common/Models/TorznabQuery.cs +++ b/src/Jackett.Common/Models/TorznabQuery.cs @@ -19,6 +19,7 @@ namespace Jackett.Common.Models public int? TvdbID { get; set; } public string ImdbID { get; set; } public int? TmdbID { get; set; } + public int? TvmazeID { get; set; } public int? TraktID { get; set; } public int? DoubanID { get; set; } public bool Cache { get; set; } = true; @@ -61,6 +62,8 @@ namespace Jackett.Common.Models public bool IsTmdbQuery => TmdbID != null; + public bool IsTvmazeQuery => TvmazeID != null; + public bool IsTraktQuery => TraktID != null; public bool IsDoubanQuery => DoubanID != null; @@ -145,6 +148,7 @@ namespace Jackett.Common.Models TvdbID = TvdbID, ImdbID = ImdbID, TmdbID = TmdbID, + TvmazeID = TvmazeID, TraktID = TraktID, DoubanID = DoubanID, Cache = Cache diff --git a/src/Jackett.Test/Common/Models/TorznabCapabilitiesTests.cs b/src/Jackett.Test/Common/Models/TorznabCapabilitiesTests.cs index dfdcae3a9..34e8cbb4a 100644 --- a/src/Jackett.Test/Common/Models/TorznabCapabilitiesTests.cs +++ b/src/Jackett.Test/Common/Models/TorznabCapabilitiesTests.cs @@ -406,7 +406,7 @@ namespace Jackett.Test.Common.Models Assert.AreEqual("yes", xDocumentSearching?.Element("tv-search")?.Attribute("available")?.Value); Assert.AreEqual("q,season,ep,tvdbid,rid", xDocumentSearching?.Element("tv-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("yes", xDocumentSearching?.Element("movie-search")?.Attribute("available")?.Value); - Assert.AreEqual("q,imdbid,tmdbid,traktid,doubanid", xDocumentSearching?.Element("movie-search")?.Attribute("supportedParams")?.Value); + Assert.AreEqual("q,imdbid,tmdbid", xDocumentSearching?.Element("movie-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("yes", xDocumentSearching?.Element("music-search")?.Attribute("available")?.Value); Assert.AreEqual("q,album,artist,label,year", xDocumentSearching?.Element("music-search")?.Attribute("supportedParams")?.Value); Assert.AreEqual("yes", xDocumentSearching?.Element("audio-search")?.Attribute("available")?.Value);