using System; using System.Net.Http; using System.Collections.Generic; using System.Threading.Tasks; using Ombi.Api.Sonarr.Models; using Newtonsoft.Json; using System.Linq; namespace Ombi.Api.Sonarr { public class SonarrApi : ISonarrApi { public SonarrApi(IApi api) { Api = api; } protected IApi Api { get; } protected virtual string ApiBaseUrl => "/api/"; public virtual async Task> GetProfiles(string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}profile", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request>(request); } public async Task> GetRootFolders(string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}rootfolder", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request>(request); } /// /// Returns all the series in Sonarr /// /// /// /// public async Task> GetSeries(string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}series", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); var results = await Api.Request>(request); foreach (var s in results) { if (s.seasons.Length > 0) { s.seasons.ToList().RemoveAt(0); } } return results; } /// /// Returns the series by the Sonarr ID /// /// Sonarr ID for the series /// /// /// public async Task GetSeriesById(int id, string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}series/{id}", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); var result = await Api.Request(request); if (result?.seasons?.Length > 0) { result?.seasons?.ToList().RemoveAt(0); } return result; } /// /// Update the following series /// /// The series to update /// /// /// public async Task UpdateSeries(SonarrSeries updated, string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}series/", baseUrl, HttpMethod.Put); request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(updated); return await Api.Request(request); } public async Task AddSeries(NewSeries seriesToAdd, string apiKey, string baseUrl) { if (!string.IsNullOrEmpty(seriesToAdd.Validate())) { return new NewSeries { ErrorMessages = new List { seriesToAdd.Validate() } }; } var request = new Request($"{ApiBaseUrl}series/", baseUrl, HttpMethod.Post); request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(seriesToAdd); try { return await Api.Request(request); } catch (JsonSerializationException) { var error = await Api.Request>(request); var messages = error?.Select(x => x.errorMessage).ToList(); return new NewSeries { ErrorMessages = messages }; } } /// /// Returns the episodes for the series /// /// The Sonarr SeriesId value /// /// /// public async Task> GetEpisodes(int seriesId, string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}Episode?seriesId={seriesId}", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request>(request); } /// /// Returns the episode for the series /// /// The Sonarr Episode ID /// /// /// public async Task GetEpisodeById(int episodeId, string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}Episode/{episodeId}", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request(request); } public async Task UpdateEpisode(Episode episodeToUpdate, string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}Episode/", baseUrl, HttpMethod.Put); request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(episodeToUpdate); return await Api.Request(request); } /// /// Search for a list of episodes /// /// The episodes to search for /// /// /// public async Task EpisodeSearch(int[] episodeIds, string apiKey, string baseUrl) { var result = await Command(apiKey, baseUrl, new { name = "EpisodeSearch", episodeIds }); return result != null; } /// /// Search for all episodes of a particular season /// /// Series to search for /// Season to get all episodes /// /// /// public async Task SeasonSearch(int seriesId, int seasonNumber, string apiKey, string baseUrl) { var result = await Command(apiKey, baseUrl, new { name = "SeasonSearch", seriesId, seasonNumber }); return result != null; } /// /// Search for all episodes in a series /// /// Series to search for /// /// /// public async Task SeriesSearch(int seriesId, string apiKey, string baseUrl) { var result = await Command(apiKey, baseUrl, new { name = "SeriesSearch", seriesId }); return result != null; } private async Task Command(string apiKey, string baseUrl, object body) { var request = new Request($"{ApiBaseUrl}Command/", baseUrl, HttpMethod.Post); request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(body); return await Api.Request(request); } public async Task SystemStatus(string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}system/status", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request(request); } public async Task SeasonPass(string apiKey, string baseUrl, SonarrSeries series) { var seasonPass = new SeasonPass { series = new [] { series }, monitoringOptions = new Monitoringoptions { ignoreEpisodesWithFiles = false, ignoreEpisodesWithoutFiles = false, } }; var request = new Request($"{ApiBaseUrl}seasonpass", baseUrl, HttpMethod.Post); request.AddHeader("X-Api-Key", apiKey); request.AddJsonBody(seasonPass); var content = await Api.RequestContent(request); return content.Equals("ok", StringComparison.CurrentCultureIgnoreCase); } public async Task> GetTags(string apiKey, string baseUrl) { var request = new Request($"{ApiBaseUrl}tag", baseUrl, HttpMethod.Get); request.AddHeader("X-Api-Key", apiKey); return await Api.Request>(request); } } }