mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-16 02:02:55 -07:00
Updated the Radarr API to support the new V3 endpoints. There's now a new V3 flag on the radarr settings
This commit is contained in:
parent
b31f8dd962
commit
26b2a574be
24 changed files with 347 additions and 94 deletions
20
src/Ombi.Api.Radarr/IRadarrV3Api.cs
Normal file
20
src/Ombi.Api.Radarr/IRadarrV3Api.cs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Ombi.Api.Radarr.Models;
|
||||||
|
using Ombi.Api.Radarr.Models.V3;
|
||||||
|
|
||||||
|
namespace Ombi.Api.Radarr
|
||||||
|
{
|
||||||
|
public interface IRadarrV3Api
|
||||||
|
{
|
||||||
|
Task<List<MovieResponse>> GetMovies(string apiKey, string baseUrl);
|
||||||
|
Task<List<RadarrV3QualityProfile>> GetProfiles(string apiKey, string baseUrl);
|
||||||
|
Task<List<RadarrRootFolder>> GetRootFolders(string apiKey, string baseUrl);
|
||||||
|
Task<SystemStatus> SystemStatus(string apiKey, string baseUrl);
|
||||||
|
Task<MovieResponse> GetMovie(int id, string apiKey, string baseUrl);
|
||||||
|
Task<MovieResponse> UpdateMovie(MovieResponse movie, string apiKey, string baseUrl);
|
||||||
|
Task<bool> MovieSearch(int[] movieIds, string apiKey, string baseUrl);
|
||||||
|
Task<RadarrAddMovie> AddMovie(int tmdbId, string title, int year, int qualityId, string rootPath,string apiKey, string baseUrl, bool searchNow, string minimumAvailability);
|
||||||
|
Task<List<Tag>> GetTags(string apiKey, string baseUrl);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,25 +0,0 @@
|
||||||
namespace Ombi.Api.Radarr.Models
|
|
||||||
{
|
|
||||||
public class SystemStatus
|
|
||||||
{
|
|
||||||
public string version { get; set; }
|
|
||||||
public string buildTime { get; set; }
|
|
||||||
public bool isDebug { get; set; }
|
|
||||||
public bool isProduction { get; set; }
|
|
||||||
public bool isAdmin { get; set; }
|
|
||||||
public bool isUserInteractive { get; set; }
|
|
||||||
public string startupPath { get; set; }
|
|
||||||
public string appData { get; set; }
|
|
||||||
public string osVersion { get; set; }
|
|
||||||
public bool isMonoRuntime { get; set; }
|
|
||||||
public bool isMono { get; set; }
|
|
||||||
public bool isLinux { get; set; }
|
|
||||||
public bool isOsx { get; set; }
|
|
||||||
public bool isWindows { get; set; }
|
|
||||||
public string branch { get; set; }
|
|
||||||
public string authentication { get; set; }
|
|
||||||
public string sqliteVersion { get; set; }
|
|
||||||
public string urlBase { get; set; }
|
|
||||||
public string runtimeVersion { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
7
src/Ombi.Api.Radarr/Models/V2/SystemStatus.cs
Normal file
7
src/Ombi.Api.Radarr/Models/V2/SystemStatus.cs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Ombi.Api.Radarr.Models
|
||||||
|
{
|
||||||
|
public class SystemStatus
|
||||||
|
{
|
||||||
|
public string version { get; set; }
|
||||||
|
}
|
||||||
|
}
|
29
src/Ombi.Api.Radarr/Models/V3/RadarrV3QualityProfile.cs
Normal file
29
src/Ombi.Api.Radarr/Models/V3/RadarrV3QualityProfile.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
namespace Ombi.Api.Radarr.Models.V3
|
||||||
|
{
|
||||||
|
public class RadarrV3QualityProfile
|
||||||
|
{
|
||||||
|
public string name { get; set; }
|
||||||
|
public bool upgradeAllowed { get; set; }
|
||||||
|
public int cutoff { get; set; }
|
||||||
|
public string preferredTags { get; set; }
|
||||||
|
public Item[] items { get; set; }
|
||||||
|
public int id { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Item
|
||||||
|
{
|
||||||
|
public Quality quality { get; set; }
|
||||||
|
public object[] items { get; set; }
|
||||||
|
public bool allowed { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Quality
|
||||||
|
{
|
||||||
|
public int id { get; set; }
|
||||||
|
public string name { get; set; }
|
||||||
|
public string source { get; set; }
|
||||||
|
public int resolution { get; set; }
|
||||||
|
public string modifier { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
159
src/Ombi.Api.Radarr/RadarrV3Api.cs
Normal file
159
src/Ombi.Api.Radarr/RadarrV3Api.cs
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Ombi.Api.Radarr.Models;
|
||||||
|
using Ombi.Api.Radarr.Models.V3;
|
||||||
|
using Ombi.Helpers;
|
||||||
|
|
||||||
|
namespace Ombi.Api.Radarr
|
||||||
|
{
|
||||||
|
//https://radarr.video/docs/api/
|
||||||
|
public class RadarrV3Api : IRadarrV3Api
|
||||||
|
{
|
||||||
|
public RadarrV3Api(ILogger<RadarrV3Api> logger, IApi api)
|
||||||
|
{
|
||||||
|
Api = api;
|
||||||
|
Logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IApi Api { get; }
|
||||||
|
private ILogger Logger { get; }
|
||||||
|
|
||||||
|
public async Task<List<RadarrV3QualityProfile>> GetProfiles(string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/qualityProfile", baseUrl, HttpMethod.Get);
|
||||||
|
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
return await Api.Request<List<RadarrV3QualityProfile>>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
public async Task<List<RadarrRootFolder>> GetRootFolders(string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/rootfolder", baseUrl, HttpMethod.Get);
|
||||||
|
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
return await Api.Request<List<RadarrRootFolder>>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<SystemStatus> SystemStatus(string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/status", baseUrl, HttpMethod.Get);
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
|
||||||
|
return await Api.Request<SystemStatus>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<MovieResponse>> GetMovies(string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/movie", baseUrl, HttpMethod.Get);
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
|
||||||
|
return await Api.Request<List<MovieResponse>>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<MovieResponse> GetMovie(int id, string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request($"/api/v3/movie/{id}", baseUrl, HttpMethod.Get);
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
|
||||||
|
return await Api.Request<MovieResponse>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<MovieResponse> UpdateMovie(MovieResponse movie, string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request($"/api/v3/movie/", baseUrl, HttpMethod.Put);
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
request.AddJsonBody(movie);
|
||||||
|
|
||||||
|
return await Api.Request<MovieResponse>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<RadarrAddMovie> AddMovie(int tmdbId, string title, int year, int qualityId, string rootPath, string apiKey, string baseUrl, bool searchNow, string minimumAvailability)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/movie", baseUrl, HttpMethod.Post);
|
||||||
|
|
||||||
|
var options = new RadarrAddMovieResponse
|
||||||
|
{
|
||||||
|
title = title,
|
||||||
|
tmdbId = tmdbId,
|
||||||
|
qualityProfileId = qualityId,
|
||||||
|
rootFolderPath = rootPath,
|
||||||
|
titleSlug = title + year,
|
||||||
|
monitored = true,
|
||||||
|
year = year,
|
||||||
|
minimumAvailability = minimumAvailability
|
||||||
|
};
|
||||||
|
|
||||||
|
if (searchNow)
|
||||||
|
{
|
||||||
|
options.addOptions = new RadarrAddOptions
|
||||||
|
{
|
||||||
|
searchForMovie = true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
request.AddHeader("X-Api-Key", apiKey);
|
||||||
|
request.AddJsonBody(options);
|
||||||
|
|
||||||
|
var response = await Api.RequestContent(request);
|
||||||
|
|
||||||
|
// TODO check if this is still correct, new API docs show validation as a 405 now
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (response.Contains("\"message\":"))
|
||||||
|
{
|
||||||
|
var error = JsonConvert.DeserializeObject<RadarrError>(response);
|
||||||
|
return new RadarrAddMovieResponse { Error = error };
|
||||||
|
}
|
||||||
|
if (response.Contains("\"errorMessage\":"))
|
||||||
|
{
|
||||||
|
var error = JsonConvert.DeserializeObject<List<RadarrErrorResponse>>(response).FirstOrDefault();
|
||||||
|
return new RadarrAddMovieResponse { Error = new RadarrError { message = error?.errorMessage } };
|
||||||
|
}
|
||||||
|
return JsonConvert.DeserializeObject<RadarrAddMovie>(response);
|
||||||
|
}
|
||||||
|
catch (JsonSerializationException jse)
|
||||||
|
{
|
||||||
|
Logger.LogError(LoggingEvents.RadarrApi, jse, "Error When adding movie to Radarr, Reponse: {0}", response);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> MovieSearch(int[] movieIds, string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var result = await Command(apiKey, baseUrl, new { name = "MoviesSearch", movieIds });
|
||||||
|
return result != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<Tag>> GetTags(string apiKey, string baseUrl)
|
||||||
|
{
|
||||||
|
var request = new Request("/api/v3/tag", baseUrl, HttpMethod.Get);
|
||||||
|
AddHeaders(request, apiKey);
|
||||||
|
|
||||||
|
return await Api.Request<List<Tag>>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<CommandResult> Command(string apiKey, string baseUrl, object body)
|
||||||
|
{
|
||||||
|
var request = new Request($"/api/v3/Command/", baseUrl, HttpMethod.Post);
|
||||||
|
request.AddHeader("X-Api-Key", apiKey);
|
||||||
|
request.AddJsonBody(body);
|
||||||
|
return await Api.Request<CommandResult>(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds the required headers and also the authorization header
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
private void AddHeaders(Request request, string key)
|
||||||
|
{
|
||||||
|
request.AddHeader("X-Api-Key", key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,6 +13,8 @@ using Ombi.Store.Entities.Requests;
|
||||||
using Ombi.Api.DogNzb;
|
using Ombi.Api.DogNzb;
|
||||||
using Ombi.Store.Entities;
|
using Ombi.Store.Entities;
|
||||||
using Ombi.Store.Repository;
|
using Ombi.Store.Repository;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Ombi.Api.Radarr.Models;
|
||||||
|
|
||||||
namespace Ombi.Core.Senders
|
namespace Ombi.Core.Senders
|
||||||
{
|
{
|
||||||
|
@ -20,44 +22,47 @@ namespace Ombi.Core.Senders
|
||||||
{
|
{
|
||||||
public MovieSender(ISettingsService<RadarrSettings> radarrSettings, IRadarrApi api, ILogger<MovieSender> log,
|
public MovieSender(ISettingsService<RadarrSettings> radarrSettings, IRadarrApi api, ILogger<MovieSender> log,
|
||||||
ISettingsService<DogNzbSettings> dogSettings, IDogNzbApi dogApi, ISettingsService<CouchPotatoSettings> cpSettings,
|
ISettingsService<DogNzbSettings> dogSettings, IDogNzbApi dogApi, ISettingsService<CouchPotatoSettings> cpSettings,
|
||||||
ICouchPotatoApi cpApi, IRepository<UserQualityProfiles> userProfiles, IRepository<RequestQueue> requestQueue, INotificationHelper notify)
|
ICouchPotatoApi cpApi, IRepository<UserQualityProfiles> userProfiles, IRepository<RequestQueue> requestQueue, INotificationHelper notify,
|
||||||
|
IRadarrV3Api radarrV3Api)
|
||||||
{
|
{
|
||||||
RadarrSettings = radarrSettings;
|
_radarrSettings = radarrSettings;
|
||||||
RadarrApi = api;
|
_radarrV2Api = api;
|
||||||
Log = log;
|
_log = log;
|
||||||
DogNzbSettings = dogSettings;
|
_dogNzbSettings = dogSettings;
|
||||||
DogNzbApi = dogApi;
|
_dogNzbApi = dogApi;
|
||||||
CouchPotatoSettings = cpSettings;
|
_couchPotatoSettings = cpSettings;
|
||||||
CouchPotatoApi = cpApi;
|
_couchPotatoApi = cpApi;
|
||||||
_userProfiles = userProfiles;
|
_userProfiles = userProfiles;
|
||||||
_requestQueuRepository = requestQueue;
|
_requestQueuRepository = requestQueue;
|
||||||
_notificationHelper = notify;
|
_notificationHelper = notify;
|
||||||
|
_radarrV3Api = radarrV3Api;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ISettingsService<RadarrSettings> RadarrSettings { get; }
|
private readonly ISettingsService<RadarrSettings> _radarrSettings;
|
||||||
private IRadarrApi RadarrApi { get; }
|
private readonly IRadarrApi _radarrV2Api;
|
||||||
private ILogger<MovieSender> Log { get; }
|
private readonly ILogger<MovieSender> _log;
|
||||||
private IDogNzbApi DogNzbApi { get; }
|
private readonly IDogNzbApi _dogNzbApi;
|
||||||
private ISettingsService<DogNzbSettings> DogNzbSettings { get; }
|
private readonly ISettingsService<DogNzbSettings> _dogNzbSettings;
|
||||||
private ISettingsService<CouchPotatoSettings> CouchPotatoSettings { get; }
|
private readonly ISettingsService<CouchPotatoSettings> _couchPotatoSettings;
|
||||||
private ICouchPotatoApi CouchPotatoApi { get; }
|
private readonly ICouchPotatoApi _couchPotatoApi;
|
||||||
private readonly IRepository<UserQualityProfiles> _userProfiles;
|
private readonly IRepository<UserQualityProfiles> _userProfiles;
|
||||||
private readonly IRepository<RequestQueue> _requestQueuRepository;
|
private readonly IRepository<RequestQueue> _requestQueuRepository;
|
||||||
private readonly INotificationHelper _notificationHelper;
|
private readonly INotificationHelper _notificationHelper;
|
||||||
|
private readonly IRadarrV3Api _radarrV3Api;
|
||||||
|
|
||||||
public async Task<SenderResult> Send(MovieRequests model)
|
public async Task<SenderResult> Send(MovieRequests model)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var cpSettings = await CouchPotatoSettings.GetSettingsAsync();
|
var cpSettings = await _couchPotatoSettings.GetSettingsAsync();
|
||||||
//var watcherSettings = await WatcherSettings.GetSettingsAsync();
|
//var watcherSettings = await WatcherSettings.GetSettingsAsync();
|
||||||
var radarrSettings = await RadarrSettings.GetSettingsAsync();
|
var radarrSettings = await _radarrSettings.GetSettingsAsync();
|
||||||
if (radarrSettings.Enabled)
|
if (radarrSettings.Enabled)
|
||||||
{
|
{
|
||||||
return await SendToRadarr(model, radarrSettings);
|
return await SendToRadarr(model, radarrSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
var dogSettings = await DogNzbSettings.GetSettingsAsync();
|
var dogSettings = await _dogNzbSettings.GetSettingsAsync();
|
||||||
if (dogSettings.Enabled)
|
if (dogSettings.Enabled)
|
||||||
{
|
{
|
||||||
await SendToDogNzb(model, dogSettings);
|
await SendToDogNzb(model, dogSettings);
|
||||||
|
@ -75,7 +80,7 @@ namespace Ombi.Core.Senders
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Log.LogError(e, "Error when sending movie to DVR app, added to the request queue");
|
_log.LogError(e, "Error when sending movie to DVR app, added to the request queue");
|
||||||
|
|
||||||
// Check if already in request quee
|
// Check if already in request quee
|
||||||
var existingQueue = await _requestQueuRepository.FirstOrDefaultAsync(x => x.RequestId == model.Id);
|
var existingQueue = await _requestQueuRepository.FirstOrDefaultAsync(x => x.RequestId == model.Id);
|
||||||
|
@ -108,19 +113,19 @@ namespace Ombi.Core.Senders
|
||||||
|
|
||||||
private async Task<SenderResult> SendToCp(FullBaseRequest model, CouchPotatoSettings cpSettings, string cpSettingsDefaultProfileId)
|
private async Task<SenderResult> SendToCp(FullBaseRequest model, CouchPotatoSettings cpSettings, string cpSettingsDefaultProfileId)
|
||||||
{
|
{
|
||||||
var result = await CouchPotatoApi.AddMovie(model.ImdbId, cpSettings.ApiKey, model.Title, cpSettings.FullUri, cpSettingsDefaultProfileId);
|
var result = await _couchPotatoApi.AddMovie(model.ImdbId, cpSettings.ApiKey, model.Title, cpSettings.FullUri, cpSettingsDefaultProfileId);
|
||||||
return new SenderResult { Success = result, Sent = true };
|
return new SenderResult { Success = result, Sent = true };
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<DogNzbMovieAddResult> SendToDogNzb(FullBaseRequest model, DogNzbSettings settings)
|
private async Task<DogNzbMovieAddResult> SendToDogNzb(FullBaseRequest model, DogNzbSettings settings)
|
||||||
{
|
{
|
||||||
var id = model.ImdbId;
|
var id = model.ImdbId;
|
||||||
return await DogNzbApi.AddMovie(settings.ApiKey, id);
|
return await _dogNzbApi.AddMovie(settings.ApiKey, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<SenderResult> SendToRadarr(MovieRequests model, RadarrSettings settings)
|
private async Task<SenderResult> SendToRadarr(MovieRequests model, RadarrSettings settings)
|
||||||
{
|
{
|
||||||
|
var v3 = settings.V3;
|
||||||
var qualityToUse = int.Parse(settings.DefaultQualityProfile);
|
var qualityToUse = int.Parse(settings.DefaultQualityProfile);
|
||||||
|
|
||||||
var rootFolderPath = settings.DefaultRootPath;
|
var rootFolderPath = settings.DefaultRootPath;
|
||||||
|
@ -129,7 +134,7 @@ namespace Ombi.Core.Senders
|
||||||
if (profiles != null)
|
if (profiles != null)
|
||||||
{
|
{
|
||||||
if (profiles.RadarrRootPath > 0)
|
if (profiles.RadarrRootPath > 0)
|
||||||
{
|
{
|
||||||
var tempPath = await RadarrRootPath(profiles.RadarrRootPath, settings);
|
var tempPath = await RadarrRootPath(profiles.RadarrRootPath, settings);
|
||||||
if (tempPath.HasValue())
|
if (tempPath.HasValue())
|
||||||
{
|
{
|
||||||
|
@ -152,18 +157,35 @@ namespace Ombi.Core.Senders
|
||||||
rootFolderPath = await RadarrRootPath(model.RootPathOverride, settings);
|
rootFolderPath = await RadarrRootPath(model.RootPathOverride, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<MovieResponse> movies;
|
||||||
// Check if the movie already exists? Since it could be unmonitored
|
// Check if the movie already exists? Since it could be unmonitored
|
||||||
var movies = await RadarrApi.GetMovies(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
|
{
|
||||||
|
movies = await _radarrV3Api.GetMovies(settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
movies = await _radarrV2Api.GetMovies(settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
var existingMovie = movies.FirstOrDefault(x => x.tmdbId == model.TheMovieDbId);
|
var existingMovie = movies.FirstOrDefault(x => x.tmdbId == model.TheMovieDbId);
|
||||||
if (existingMovie == null)
|
if (existingMovie == null)
|
||||||
{
|
{
|
||||||
var result = await RadarrApi.AddMovie(model.TheMovieDbId, model.Title, model.ReleaseDate.Year,
|
RadarrAddMovie result;
|
||||||
qualityToUse, rootFolderPath, settings.ApiKey, settings.FullUri, !settings.AddOnly,
|
if (v3)
|
||||||
settings.MinimumAvailability);
|
{
|
||||||
|
result = await _radarrV3Api.AddMovie(model.TheMovieDbId, model.Title, model.ReleaseDate.Year,
|
||||||
|
qualityToUse, rootFolderPath, settings.ApiKey, settings.FullUri, !settings.AddOnly,
|
||||||
|
settings.MinimumAvailability);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = await _radarrV2Api.AddMovie(model.TheMovieDbId, model.Title, model.ReleaseDate.Year,
|
||||||
|
qualityToUse, rootFolderPath, settings.ApiKey, settings.FullUri, !settings.AddOnly,
|
||||||
|
settings.MinimumAvailability);
|
||||||
|
}
|
||||||
if (!string.IsNullOrEmpty(result.Error?.message))
|
if (!string.IsNullOrEmpty(result.Error?.message))
|
||||||
{
|
{
|
||||||
Log.LogError(LoggingEvents.RadarrCacher, result.Error.message);
|
_log.LogError(LoggingEvents.RadarrCacher, result.Error.message);
|
||||||
return new SenderResult { Success = false, Message = result.Error.message, Sent = false };
|
return new SenderResult { Success = false, Message = result.Error.message, Sent = false };
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrEmpty(result.title))
|
if (!string.IsNullOrEmpty(result.title))
|
||||||
|
@ -177,11 +199,23 @@ namespace Ombi.Core.Senders
|
||||||
{
|
{
|
||||||
// let's set it to monitored and search for it
|
// let's set it to monitored and search for it
|
||||||
existingMovie.monitored = true;
|
existingMovie.monitored = true;
|
||||||
await RadarrApi.UpdateMovie(existingMovie, settings.ApiKey, settings.FullUri);
|
if (v3)
|
||||||
// Search for it
|
|
||||||
if (!settings.AddOnly)
|
|
||||||
{
|
{
|
||||||
await RadarrApi.MovieSearch(new[] { existingMovie.id }, settings.ApiKey, settings.FullUri);
|
await _radarrV3Api.UpdateMovie(existingMovie, settings.ApiKey, settings.FullUri);
|
||||||
|
// Search for it
|
||||||
|
if (!settings.AddOnly)
|
||||||
|
{
|
||||||
|
await _radarrV3Api.MovieSearch(new[] { existingMovie.id }, settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _radarrV2Api.UpdateMovie(existingMovie, settings.ApiKey, settings.FullUri);
|
||||||
|
// Search for it
|
||||||
|
if (!settings.AddOnly)
|
||||||
|
{
|
||||||
|
await _radarrV2Api.MovieSearch(new[] { existingMovie.id }, settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SenderResult { Success = true, Sent = true };
|
return new SenderResult { Success = true, Sent = true };
|
||||||
|
@ -192,9 +226,18 @@ namespace Ombi.Core.Senders
|
||||||
|
|
||||||
private async Task<string> RadarrRootPath(int overrideId, RadarrSettings settings)
|
private async Task<string> RadarrRootPath(int overrideId, RadarrSettings settings)
|
||||||
{
|
{
|
||||||
var paths = await RadarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
var selectedPath = paths.FirstOrDefault(x => x.id == overrideId);
|
{
|
||||||
return selectedPath?.path ?? String.Empty;
|
var paths = await _radarrV3Api.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
|
var selectedPath = paths.FirstOrDefault(x => x.id == overrideId);
|
||||||
|
return selectedPath?.path ?? string.Empty;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var paths = await _radarrV2Api.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
|
var selectedPath = paths.FirstOrDefault(x => x.id == overrideId);
|
||||||
|
return selectedPath?.path ?? string.Empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -132,6 +132,7 @@ namespace Ombi.DependencyInjection
|
||||||
services.AddTransient<ITvMazeApi, TvMazeApi>();
|
services.AddTransient<ITvMazeApi, TvMazeApi>();
|
||||||
services.AddTransient<ITraktApi, TraktApi>();
|
services.AddTransient<ITraktApi, TraktApi>();
|
||||||
services.AddTransient<IRadarrApi, RadarrApi>();
|
services.AddTransient<IRadarrApi, RadarrApi>();
|
||||||
|
services.AddTransient<IRadarrV3Api, RadarrV3Api>();
|
||||||
services.AddTransient<IDiscordApi, DiscordApi>();
|
services.AddTransient<IDiscordApi, DiscordApi>();
|
||||||
services.AddTransient<IPushbulletApi, PushbulletApi>();
|
services.AddTransient<IPushbulletApi, PushbulletApi>();
|
||||||
services.AddTransient<IOmbiService, OmbiService>();
|
services.AddTransient<IOmbiService, OmbiService>();
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
using Ombi.Core.Settings.Models.External;
|
namespace Ombi.Settings.Settings.Models.External
|
||||||
|
|
||||||
namespace Ombi.Settings.Settings.Models.External
|
|
||||||
{
|
{
|
||||||
public class RadarrSettings : ExternalSettings
|
public class RadarrSettings : ExternalSettings
|
||||||
{
|
{
|
||||||
public bool Enabled { get; set; }
|
public bool Enabled { get; set; }
|
||||||
|
public bool V3 { get; set; }
|
||||||
public string ApiKey { get; set; }
|
public string ApiKey { get; set; }
|
||||||
public string DefaultQualityProfile { get; set; }
|
public string DefaultQualityProfile { get; set; }
|
||||||
public string DefaultRootPath { get; set; }
|
public string DefaultRootPath { get; set; }
|
||||||
|
|
|
@ -97,6 +97,7 @@ export interface IRadarrSettings extends IExternalSettings {
|
||||||
addOnly: boolean;
|
addOnly: boolean;
|
||||||
minimumAvailability: string;
|
minimumAvailability: string;
|
||||||
scanForAvailability: boolean;
|
scanForAvailability: boolean;
|
||||||
|
v3: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ILidarrSettings extends IExternalSettings {
|
export interface ILidarrSettings extends IExternalSettings {
|
||||||
|
|
|
@ -11,11 +11,16 @@
|
||||||
<mat-slide-toggle formControlName="enabled" id="enable">Enable</mat-slide-toggle>
|
<mat-slide-toggle formControlName="enabled" id="enable">Enable</mat-slide-toggle>
|
||||||
</div>
|
</div>
|
||||||
<div class="md-form-field">
|
<div class="md-form-field">
|
||||||
<mat-slide-toggle [(ngModel)]="advanced" [ngModelOptions]="{standalone: true}">Advanced</mat-slide-toggle>
|
<mat-slide-toggle formControlName="v3">V3</mat-slide-toggle>
|
||||||
</div>
|
</div>
|
||||||
<div class="md-form-field">
|
<div class="md-form-field">
|
||||||
<mat-slide-toggle formControlName="scanForAvailability">Scan for Availability</mat-slide-toggle>
|
<mat-slide-toggle formControlName="scanForAvailability">Scan for Availability</mat-slide-toggle>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="md-form-field" >
|
||||||
|
<mat-slide-toggle formControlName="addOnly">
|
||||||
|
Do not search for Movies
|
||||||
|
</mat-slide-toggle>
|
||||||
|
</div>
|
||||||
<div class="md-form-field" style="margin-top:1em;"></div>
|
<div class="md-form-field" style="margin-top:1em;"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -92,11 +97,6 @@
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="md-form-field" *ngIf="advanced" style="color:#ff761b">
|
|
||||||
<mat-slide-toggle formControlName="addOnly">
|
|
||||||
Do not search
|
|
||||||
</mat-slide-toggle>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -19,7 +19,6 @@ export class RadarrComponent implements OnInit {
|
||||||
public minimumAvailabilityOptions: IMinimumAvailability[];
|
public minimumAvailabilityOptions: IMinimumAvailability[];
|
||||||
public profilesRunning: boolean;
|
public profilesRunning: boolean;
|
||||||
public rootFoldersRunning: boolean;
|
public rootFoldersRunning: boolean;
|
||||||
public advanced = false;
|
|
||||||
public form: FormGroup;
|
public form: FormGroup;
|
||||||
|
|
||||||
constructor(private settingsService: SettingsService,
|
constructor(private settingsService: SettingsService,
|
||||||
|
@ -43,7 +42,8 @@ export class RadarrComponent implements OnInit {
|
||||||
port: [x.port, [Validators.required]],
|
port: [x.port, [Validators.required]],
|
||||||
addOnly: [x.addOnly],
|
addOnly: [x.addOnly],
|
||||||
minimumAvailability: [x.minimumAvailability, [Validators.required]],
|
minimumAvailability: [x.minimumAvailability, [Validators.required]],
|
||||||
scanForAvailability: [x.scanForAvailability]
|
scanForAvailability: [x.scanForAvailability],
|
||||||
|
v3: [x.v3]
|
||||||
});
|
});
|
||||||
|
|
||||||
if (x.defaultQualityProfile) {
|
if (x.defaultQualityProfile) {
|
||||||
|
|
|
@ -16,18 +16,21 @@ namespace Ombi.Controllers.V1.External
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Produces("application/json")]
|
[Produces("application/json")]
|
||||||
public class RadarrController : ControllerBase
|
public class RadarrController : ControllerBase
|
||||||
{
|
{
|
||||||
|
|
||||||
public RadarrController(IRadarrApi radarr, ISettingsService<RadarrSettings> settings,
|
public RadarrController(IRadarrApi radarr, ISettingsService<RadarrSettings> settings,
|
||||||
ICacheService mem)
|
ICacheService mem, IRadarrV3Api radarrV3Api)
|
||||||
{
|
{
|
||||||
RadarrApi = radarr;
|
_radarrApi = radarr;
|
||||||
RadarrSettings = settings;
|
_radarrSettings = settings;
|
||||||
Cache = mem;
|
_cache = mem;
|
||||||
|
_radarrV3Api = radarrV3Api;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IRadarrApi RadarrApi { get; }
|
private readonly IRadarrApi _radarrApi;
|
||||||
private ISettingsService<RadarrSettings> RadarrSettings { get; }
|
private readonly ISettingsService<RadarrSettings> _radarrSettings;
|
||||||
private ICacheService Cache { get; }
|
private readonly ICacheService _cache;
|
||||||
|
private readonly IRadarrV3Api _radarrV3Api;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Radarr profiles.
|
/// Gets the Radarr profiles.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -35,16 +38,20 @@ namespace Ombi.Controllers.V1.External
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost("Profiles")]
|
[HttpPost("Profiles")]
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<RadarrProfile>> GetProfiles([FromBody] RadarrSettings settings)
|
public async Task<IActionResult> GetProfiles([FromBody] RadarrSettings settings)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetProfiles(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
|
{
|
||||||
|
return Ok(await _radarrV3Api.GetProfiles(settings.ApiKey, settings.FullUri));
|
||||||
|
}
|
||||||
|
return Ok(await _radarrApi.GetProfiles(settings.ApiKey, settings.FullUri));
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("enabled")]
|
[HttpGet("enabled")]
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<bool> Enabled()
|
public async Task<bool> Enabled()
|
||||||
{
|
{
|
||||||
var settings = await RadarrSettings.GetSettingsAsync();
|
var settings = await _radarrSettings.GetSettingsAsync();
|
||||||
return settings.Enabled;
|
return settings.Enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +64,11 @@ namespace Ombi.Controllers.V1.External
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<RadarrRootFolder>> GetRootFolders([FromBody] RadarrSettings settings)
|
public async Task<IEnumerable<RadarrRootFolder>> GetRootFolders([FromBody] RadarrSettings settings)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
|
{
|
||||||
|
return await _radarrV3Api.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
|
return await _radarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -67,12 +78,16 @@ namespace Ombi.Controllers.V1.External
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("Profiles")]
|
[HttpGet("Profiles")]
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<RadarrProfile>> GetProfiles()
|
public async Task<IActionResult> GetProfiles()
|
||||||
{
|
{
|
||||||
var settings = await RadarrSettings.GetSettingsAsync();
|
var settings = await _radarrSettings.GetSettingsAsync();
|
||||||
if (settings.Enabled)
|
if (settings.Enabled)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetProfiles(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
|
{
|
||||||
|
return Ok(await _radarrV3Api.GetProfiles(settings.ApiKey, settings.FullUri));
|
||||||
|
}
|
||||||
|
return Ok(await _radarrApi.GetProfiles(settings.ApiKey, settings.FullUri));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -86,14 +101,18 @@ namespace Ombi.Controllers.V1.External
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<RadarrRootFolder>> GetRootFolders()
|
public async Task<IEnumerable<RadarrRootFolder>> GetRootFolders()
|
||||||
{
|
{
|
||||||
var settings = await RadarrSettings.GetSettingsAsync();
|
var settings = await _radarrSettings.GetSettingsAsync();
|
||||||
if (settings.Enabled)
|
if (settings.Enabled)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);
|
if (settings.V3)
|
||||||
|
{
|
||||||
|
return await _radarrV3Api.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
|
}
|
||||||
|
return await _radarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Radarr tags
|
/// Gets the Radarr tags
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -103,10 +122,10 @@ namespace Ombi.Controllers.V1.External
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<Tag>> GetTags([FromBody] SonarrSettings settings)
|
public async Task<IEnumerable<Tag>> GetTags([FromBody] SonarrSettings settings)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetTags(settings.ApiKey, settings.FullUri);
|
return await _radarrV3Api.GetTags(settings.ApiKey, settings.FullUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the Radarr tags
|
/// Gets the Radarr tags
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -115,10 +134,10 @@ namespace Ombi.Controllers.V1.External
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
public async Task<IEnumerable<Tag>> GetTags()
|
public async Task<IEnumerable<Tag>> GetTags()
|
||||||
{
|
{
|
||||||
var settings = await RadarrSettings.GetSettingsAsync();
|
var settings = await _radarrSettings.GetSettingsAsync();
|
||||||
if (settings.Enabled)
|
if (settings.Enabled)
|
||||||
{
|
{
|
||||||
return await RadarrApi.GetTags(settings.ApiKey, settings.FullUri);
|
return await _radarrV3Api.GetTags(settings.ApiKey, settings.FullUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue