using System; using System.Collections.Generic; using System.Net; using FluentValidation.Results; using Newtonsoft.Json; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; namespace NzbDrone.Core.ImportLists.Radarr { public interface IRadarrV3Proxy { List GetMovies(RadarrSettings settings); List GetProfiles(RadarrSettings settings); List GetRootFolders(RadarrSettings settings); List GetTags(RadarrSettings settings); ValidationFailure Test(RadarrSettings settings); } public class RadarrV3Proxy : IRadarrV3Proxy { private readonly IHttpClient _httpClient; private readonly Logger _logger; public RadarrV3Proxy(IHttpClient httpClient, Logger logger) { _httpClient = httpClient; _logger = logger; } public List GetMovies(RadarrSettings settings) { return Execute("/api/v3/movie", settings); } public List GetProfiles(RadarrSettings settings) { return Execute("/api/v3/qualityprofile", settings); } public List GetRootFolders(RadarrSettings settings) { return Execute("api/v3/rootfolder", settings); } public List GetTags(RadarrSettings settings) { return Execute("/api/v3/tag", settings); } public ValidationFailure Test(RadarrSettings settings) { try { GetMovies(settings); } catch (HttpException ex) { if (ex.Response.StatusCode == HttpStatusCode.Unauthorized) { _logger.Error(ex, "API Key is invalid"); return new ValidationFailure("ApiKey", "API Key is invalid"); } if (ex.Response.HasHttpRedirect) { _logger.Error(ex, "Radarr returned redirect and is invalid"); return new ValidationFailure("BaseUrl", "Radarr URL is invalid, are you missing a URL base?"); } _logger.Error(ex, "Unable to connect to import list."); return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details."); } catch (Exception ex) { _logger.Error(ex, "Unable to connect to import list."); return new ValidationFailure(string.Empty, $"Unable to connect to import list: {ex.Message}. Check the log surrounding this error for details."); } return null; } private List Execute(string resource, RadarrSettings settings) { if (settings.BaseUrl.IsNullOrWhiteSpace() || settings.ApiKey.IsNullOrWhiteSpace()) { return new List(); } var baseUrl = settings.BaseUrl.TrimEnd('/'); var request = new HttpRequestBuilder(baseUrl).Resource(resource) .Accept(HttpAccept.Json) .SetHeader("X-Api-Key", settings.ApiKey) .Build(); var response = _httpClient.Get(request); if ((int)response.StatusCode > 299) { throw new HttpException(response); } var results = JsonConvert.DeserializeObject>(response.Content); return results; } } }