/// <summary> /// Update the following series /// </summary> /// <param name="updated">The series to update</param> /// <param name="apiKey"></param> /// <param name="baseUrl"></param> /// <returns></returns> public async Task <SonarrSeries> 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 <SonarrSeries>(request)); }
public async Task <bool> 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)); }
private async Task SearchForRequest(ChildRequests model, IEnumerable <Episode> sonarrEpList, SonarrSeries existingSeries, SonarrSettings s, IReadOnlyCollection <Episode> episodesToUpdate) { foreach (var season in model.SeasonRequests) { var sonarrSeason = sonarrEpList.Where(x => x.seasonNumber == season.SeasonNumber); var sonarrEpCount = sonarrSeason.Count(); var ourRequestCount = season.Episodes.Count; if (sonarrEpCount == ourRequestCount) { // We have the same amount of requests as all of the episodes in the season. // Do a season search await SonarrApi.SeasonSearch(existingSeries.id, season.SeasonNumber, s.ApiKey, s.FullUri); } else { // There is a miss-match, let's search the episodes indiviaully await SonarrApi.EpisodeSearch(episodesToUpdate.Select(x => x.id).ToArray(), s.ApiKey, s.FullUri); } } }
private async Task SendToSonarr(ChildRequests model, SonarrSeries result, SonarrSettings s) { var episodesToUpdate = new List <Episode>(); // Ok, now let's sort out the episodes. if (model.SeriesType == SeriesType.Anime) { result.seriesType = "anime"; await SonarrApi.UpdateSeries(result, s.ApiKey, s.FullUri); } var sonarrEpisodes = await SonarrApi.GetEpisodes(result.id, s.ApiKey, s.FullUri); var sonarrEpList = sonarrEpisodes.ToList() ?? new List <Episode>(); while (!sonarrEpList.Any()) { // It could be that the series metadata is not ready yet. So wait sonarrEpList = (await SonarrApi.GetEpisodes(result.id, s.ApiKey, s.FullUri)).ToList(); await Task.Delay(500); } foreach (var req in model.SeasonRequests) { foreach (var ep in req.Episodes) { var sonarrEp = sonarrEpList.FirstOrDefault(x => x.episodeNumber == ep.EpisodeNumber && x.seasonNumber == req.SeasonNumber); if (sonarrEp != null && !sonarrEp.monitored) { sonarrEp.monitored = true; episodesToUpdate.Add(sonarrEp); } } } var seriesChanges = false; foreach (var season in model.SeasonRequests) { var sonarrEpisodeList = sonarrEpList.Where(x => x.seasonNumber == season.SeasonNumber).ToList(); var sonarrEpCount = sonarrEpisodeList.Count; var ourRequestCount = season.Episodes.Count; var ourEpisodes = season.Episodes.Select(x => x.EpisodeNumber).ToList(); var unairedEpisodes = sonarrEpisodeList.Where(x => x.airDateUtc > DateTime.UtcNow).Select(x => x.episodeNumber).ToList(); //// Check if we have requested all the latest episodes, if we have then monitor //// NOTE, not sure if needed since ombi ui displays future episodes anyway... //ourEpisodes.AddRange(unairedEpisodes); //var distinctEpisodes = ourEpisodes.Distinct().ToList(); //var missingEpisodes = Enumerable.Range(distinctEpisodes.Min(), distinctEpisodes.Count).Except(distinctEpisodes); var existingSeason = result.seasons.FirstOrDefault(x => x.seasonNumber == season.SeasonNumber); if (existingSeason == null) { Logger.LogError("There was no season numer {0} in Sonarr for title {1}", season.SeasonNumber, model.ParentRequest.Title); continue; } if (sonarrEpCount == ourRequestCount /*|| !missingEpisodes.Any()*/) { // We have the same amount of requests as all of the episodes in the season. if (!existingSeason.monitored) { existingSeason.monitored = true; seriesChanges = true; } } else { // Make sure this season is set to monitored if (!existingSeason.monitored) { // We need to monitor it, problem being is all episodes will now be monitored // So we need to monitor the series but unmonitor every episode // Except the episodes that are already monitored before we update the series (we do not want to unmonitored episodes that are monitored beforehand) existingSeason.monitored = true; var sea = result.seasons.FirstOrDefault(x => x.seasonNumber == existingSeason.seasonNumber); sea.monitored = true; //var previouslyMonitoredEpisodes = sonarrEpList.Where(x => // x.seasonNumber == existingSeason.seasonNumber && x.monitored).Select(x => x.episodeNumber).ToList(); // We probably don't actually care about this result = await SonarrApi.UpdateSeries(result, s.ApiKey, s.FullUri); var epToUnmonitored = new List <Episode>(); var newEpList = sonarrEpList.ConvertAll(ep => new Episode(ep)); // Clone it so we don't modify the original member foreach (var ep in newEpList.Where(x => x.seasonNumber == existingSeason.seasonNumber).ToList()) { //if (previouslyMonitoredEpisodes.Contains(ep.episodeNumber)) //{ // // This was previously monitored. // continue; //} ep.monitored = false; epToUnmonitored.Add(ep); } foreach (var epToUpdate in epToUnmonitored) { await SonarrApi.UpdateEpisode(epToUpdate, s.ApiKey, s.FullUri); } } // Now update the episodes that need updating foreach (var epToUpdate in episodesToUpdate.Where(x => x.seasonNumber == season.SeasonNumber)) { await SonarrApi.UpdateEpisode(epToUpdate, s.ApiKey, s.FullUri); } } } if (seriesChanges) { await SonarrApi.SeasonPass(s.ApiKey, s.FullUri, result); } if (!s.AddOnly) { await SearchForRequest(model, sonarrEpList, result, s, episodesToUpdate); } }
private async Task SendToSonarr(ChildRequests model, SonarrSeries result, SonarrSettings s) { var episodesToUpdate = new List <Episode>(); // Ok, now let's sort out the episodes. if (model.SeriesType == SeriesType.Anime) { result.seriesType = "anime"; await SonarrApi.UpdateSeries(result, s.ApiKey, s.FullUri); } var sonarrEpisodes = await SonarrApi.GetEpisodes(result.id, s.ApiKey, s.FullUri); var sonarrEpList = sonarrEpisodes.ToList() ?? new List <Episode>(); while (!sonarrEpList.Any()) { // It could be that the series metadata is not ready yet. So wait sonarrEpList = (await SonarrApi.GetEpisodes(result.id, s.ApiKey, s.FullUri)).ToList(); await Task.Delay(500); } foreach (var req in model.SeasonRequests) { foreach (var ep in req.Episodes) { var sonarrEp = sonarrEpList.FirstOrDefault(x => x.episodeNumber == ep.EpisodeNumber && x.seasonNumber == req.SeasonNumber); if (sonarrEp != null) { sonarrEp.monitored = true; episodesToUpdate.Add(sonarrEp); } } } var seriesChanges = false; foreach (var season in model.SeasonRequests) { var sonarrSeason = sonarrEpList.Where(x => x.seasonNumber == season.SeasonNumber); var sonarrEpCount = sonarrSeason.Count(); var ourRequestCount = season.Episodes.Count; if (sonarrEpCount == ourRequestCount) { // We have the same amount of requests as all of the episodes in the season. var existingSeason = result.seasons.First(x => x.seasonNumber == season.SeasonNumber); existingSeason.monitored = true; seriesChanges = true; } else { // Now update the episodes that need updating foreach (var epToUpdate in episodesToUpdate.Where(x => x.seasonNumber == season.SeasonNumber)) { await SonarrApi.UpdateEpisode(epToUpdate, s.ApiKey, s.FullUri); } } } if (seriesChanges) { await SonarrApi.SeasonPass(s.ApiKey, s.FullUri, result); } if (!s.AddOnly) { await SearchForRequest(model, sonarrEpList, result, s, episodesToUpdate); } }
public Series(KodiTvShow kodi, SonarrSeries sonarr) { Kodi = kodi; Sonarr = sonarr; }