diff --git a/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordImport.cs b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordImport.cs new file mode 100644 index 000000000..39b113561 --- /dev/null +++ b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordImport.cs @@ -0,0 +1,43 @@ +using NLog; +using NzbDrone.Common.Cloud; +using NzbDrone.Common.Http; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.MetadataSource; +using NzbDrone.Core.Parser; + +namespace NzbDrone.Core.ImportLists.TMDb.Keyword +{ + public class TMDbKeywordImport : TMDbImportListBase + { + public TMDbKeywordImport(IRadarrCloudRequestBuilder requestBuilder, + IHttpClient httpClient, + IImportListStatusService importListStatusService, + IConfigService configService, + IParsingService parsingService, + ISearchForNewMovie searchForNewMovie, + Logger logger) + : base(requestBuilder, httpClient, importListStatusService, configService, parsingService, searchForNewMovie, logger) + { + } + + public override string Name => "TMDb Keyword"; + public override bool Enabled => true; + public override bool EnableAuto => false; + + public override IParseImportListResponse GetParser() + { + return new TMDbKeywordParser(); + } + + public override IImportListRequestGenerator GetRequestGenerator() + { + return new TMDbKeywordRequestGenerator() + { + RequestBuilder = _requestBuilder, + Settings = Settings, + Logger = _logger, + HttpClient = _httpClient + }; + } + } +} diff --git a/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordParser.cs b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordParser.cs new file mode 100644 index 000000000..d2042c950 --- /dev/null +++ b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordParser.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.ImportLists.ImportListMovies; + +namespace NzbDrone.Core.ImportLists.TMDb.Keyword +{ + public class TMDbKeywordParser : TMDbParser + { + public override IList ParseResponse(ImportListResponse importResponse) + { + var movies = new List(); + + if (!PreProcess(importResponse)) + { + return movies; + } + + var jsonResponse = JsonConvert.DeserializeObject(importResponse.Content); + + // no movies were return + if (jsonResponse == null) + { + return movies; + } + + foreach (var movie in jsonResponse.Results) + { + // Movies with no Year Fix + if (string.IsNullOrWhiteSpace(movie.ReleaseDate)) + { + continue; + } + + movies.AddIfNotNull(MapListMovie(movie)); + } + + return movies; + } + } +} diff --git a/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordRequestGenerator.cs b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordRequestGenerator.cs new file mode 100644 index 000000000..4bc5f48df --- /dev/null +++ b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordRequestGenerator.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using NLog; +using NzbDrone.Common.Http; + +namespace NzbDrone.Core.ImportLists.TMDb.Keyword +{ + public class TMDbKeywordRequestGenerator : IImportListRequestGenerator + { + public TMDbKeywordSettings Settings { get; set; } + public IHttpClient HttpClient { get; set; } + public IHttpRequestBuilderFactory RequestBuilder { get; set; } + public Logger Logger { get; set; } + public int MaxPages { get; set; } + + public TMDbKeywordRequestGenerator() + { + } + + public virtual ImportListPageableRequestChain GetMovies() + { + var pageableRequests = new ImportListPageableRequestChain(); + + pageableRequests.Add(GetMoviesRequest()); + + return pageableRequests; + } + + private IEnumerable GetMoviesRequest() + { + Logger.Info($"Importing TMDb movies from keyword Id: {Settings.KeywordId}"); + + var requestBuilder = RequestBuilder.Create() + .SetSegment("api", "3") + .SetSegment("route", "keyword") + .SetSegment("id", $"{Settings.KeywordId}") + .SetSegment("secondaryRoute", "/movies"); + + var jsonResponse = JsonConvert.DeserializeObject(HttpClient.Execute(requestBuilder.Build()).Content); + + MaxPages = jsonResponse.TotalPages; + + for (var pageNumber = 1; pageNumber <= MaxPages; pageNumber++) + { + requestBuilder.AddQueryParam("page", pageNumber, true); + + var request = requestBuilder.Build(); + + Logger.Debug($"Importing TMDb movies from: {request.Url}"); + + yield return new ImportListRequest(request); + } + } + } +} diff --git a/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordSettings.cs b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordSettings.cs new file mode 100644 index 000000000..32d64773c --- /dev/null +++ b/src/NzbDrone.Core/ImportLists/TMDb/Keyword/TMDbKeywordSettings.cs @@ -0,0 +1,28 @@ +using System.Text.RegularExpressions; +using FluentValidation; +using NzbDrone.Core.Annotations; + +namespace NzbDrone.Core.ImportLists.TMDb.Keyword +{ + public class TMDbKeywordSettingsValidator : TMDbSettingsBaseValidator + { + public TMDbKeywordSettingsValidator() + : base() + { + RuleFor(c => c.KeywordId).Matches(@"^[1-9][0-9]*$", RegexOptions.IgnoreCase); + } + } + + public class TMDbKeywordSettings : TMDbSettingsBase + { + protected override AbstractValidator Validator => new TMDbKeywordSettingsValidator(); + + public TMDbKeywordSettings() + { + KeywordId = ""; + } + + [FieldDefinition(1, Label = "Keyword Id", Type = FieldType.Textbox, HelpText = "TMDb Id of keyword to Follow")] + public string KeywordId { get; set; } + } +}