internal async Task RequestAllEpisodesWithExistingSeries(RequestedModel model, Series selectedSeries, SonarrSettings sonarrSettings) { // Show Exists // Look up all episodes var ep = SonarrApi.GetEpisodes(selectedSeries.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); var episodes = ep?.ToList() ?? new List <SonarrEpisodes>(); var internalEpisodeIds = new List <int>(); var tasks = new List <Task>(); foreach (var r in episodes) { if (r.monitored || r.hasFile) // If it's already montiored or has the file, there is no point in updating it { continue; } // Lookup the individual episode details var episodeInfo = SonarrApi.GetEpisode(r.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); episodeInfo.monitored = true; // Set the episode to monitored tasks.Add(Task.Run(() => SonarrApi.UpdateEpisode(episodeInfo, sonarrSettings.ApiKey, sonarrSettings.FullUri))); internalEpisodeIds.Add(r.id); } await Task.WhenAll(tasks.ToArray()); SonarrApi.SearchForEpisodes(internalEpisodeIds.ToArray(), sonarrSettings.ApiKey, sonarrSettings.FullUri); }
internal async Task RequestEpisodesWithExistingSeries(RequestedModel model, Series selectedSeries, SonarrSettings sonarrSettings) { // Show Exists // Look up all episodes var ep = SonarrApi.GetEpisodes(selectedSeries.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); var episodes = ep?.ToList() ?? new List <SonarrEpisodes>(); var internalEpisodeIds = new List <int>(); var tasks = new List <Task>(); foreach (var r in model.Episodes) { // Match the episode and season number. // If the episode is monitored we might not be searching for it. var episode = episodes.FirstOrDefault( x => x.episodeNumber == r.EpisodeNumber && x.seasonNumber == r.SeasonNumber); if (episode == null) { continue; } var episodeInfo = SonarrApi.GetEpisode(episode.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); episodeInfo.monitored = true; // Set the episode to monitored tasks.Add(Task.Run(() => SonarrApi.UpdateEpisode(episodeInfo, sonarrSettings.ApiKey, sonarrSettings.FullUri))); internalEpisodeIds.Add(episode.id); } await Task.WhenAll(tasks.ToArray()); SonarrApi.SearchForEpisodes(internalEpisodeIds.ToArray(), sonarrSettings.ApiKey, sonarrSettings.FullUri); }
internal async Task RequestAllEpisodesInASeasonWithExistingSeries(RequestedModel model, Series selectedSeries, SonarrSettings sonarrSettings) { // Show Exists // Look up all episodes var ep = SonarrApi.GetEpisodes(selectedSeries.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); var episodes = ep?.ToList() ?? new List <SonarrEpisodes>(); var internalEpisodeIds = new List <int>(); var tasks = new List <Task>(); var requestedEpisodes = model.Episodes; foreach (var r in episodes) { if (r.hasFile) // If it already has the file, there is no point in updating it { continue; } var epComparison = new EpisodesModel { EpisodeNumber = r.episodeNumber, SeasonNumber = r.seasonNumber }; // Make sure we are looking for the right episode and season if (!requestedEpisodes.Contains(epComparison)) { continue; } // Lookup the individual episode details var episodeInfo = SonarrApi.GetEpisode(r.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); // If the season is not in thr episodeInfo.monitored = true; // Set the episode to monitored tasks.Add(Task.Run(() => SonarrApi.UpdateEpisode(episodeInfo, sonarrSettings.ApiKey, sonarrSettings.FullUri))); internalEpisodeIds.Add(r.id); } await Task.WhenAll(tasks.ToArray()); SonarrApi.SearchForEpisodes(internalEpisodeIds.ToArray(), sonarrSettings.ApiKey, sonarrSettings.FullUri); }
/// <summary> /// Broken Way /// </summary> /// <param name="sonarrSettings"></param> /// <param name="model"></param> /// <param name="qualityId"></param> /// <returns></returns> public async Task <SonarrAddSeries> SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model, string qualityId) { var qualityProfile = 0; var episodeRequest = model.Episodes.Any(); if (!string.IsNullOrEmpty(qualityId)) // try to parse the passed in quality, otherwise use the settings default quality { int.TryParse(qualityId, out qualityProfile); } if (qualityProfile <= 0) { int.TryParse(sonarrSettings.QualityProfile, out qualityProfile); } var series = await GetSonarrSeries(sonarrSettings, model.ProviderId); var requestAll = model.SeasonsRequested?.Equals("All", StringComparison.CurrentCultureIgnoreCase); var first = model.SeasonsRequested?.Equals("First", StringComparison.CurrentCultureIgnoreCase); var latest = model.SeasonsRequested?.Equals("Latest", StringComparison.CurrentCultureIgnoreCase); var specificSeasonRequest = model.SeasonList?.Any(); var rootFolderPath = model.RootFolderSelected <= 0 ? sonarrSettings.FullRootPath : await GetRootPath(model.RootFolderSelected, sonarrSettings); if (episodeRequest) { // Does series exist? if (series != null) { // Series Exists // Request the episodes in the existing series await RequestEpisodesWithExistingSeries(model, series, sonarrSettings); return(new SonarrAddSeries { title = series.title }); } // Series doesn't exist, need to add it as unmonitored. var addResult = await Task.Run(() => SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile, sonarrSettings.SeasonFolders, rootFolderPath, 0, new int[0], sonarrSettings.ApiKey, sonarrSettings.FullUri, false)); // Get the series that was just added series = await GetSonarrSeries(sonarrSettings, model.ProviderId); series.monitored = true; // We want to make sure we are monitoring the series // Un-monitor all seasons foreach (var season in series.seasons) { season.monitored = false; } // Update the series, Since we cannot add as un-monitored due to the following bug: https://github.com/Sonarr/Sonarr/issues/1404 SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); // We now have the series in Sonarr, update it to request the episodes. await RequestAllEpisodesInASeasonWithExistingSeries(model, series, sonarrSettings); return(addResult); } // Series exists, don't need to add it if (series == null) { // Set the series as monitored with a season count as 0 so it doesn't search for anything SonarrApi.AddSeriesNew(model.ProviderId, model.Title, qualityProfile, sonarrSettings.SeasonFolders, rootFolderPath, new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }, sonarrSettings.ApiKey, sonarrSettings.FullUri); await Task.Delay(TimeSpan.FromSeconds(1)); series = await GetSonarrSeries(sonarrSettings, model.ProviderId); foreach (var s in series.seasons) { s.monitored = false; } SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); } if (requestAll ?? false) { // Monitor all seasons foreach (var season in series.seasons) { season.monitored = true; } SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); SonarrApi.SearchForSeries(series.id, sonarrSettings.ApiKey, sonarrSettings.FullUri); // Search For all episodes!" //// This is a work around for this issue: https://github.com/Sonarr/Sonarr/issues/1507 //// The above is the previous code. //SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile, // sonarrSettings.SeasonFolders, sonarrSettings.RootPath, 0, model.SeasonList, sonarrSettings.ApiKey, // sonarrSettings.FullUri, true, true); return(new SonarrAddSeries { title = series.title }); // We have updated it } if (first ?? false) { var firstSeries = (series?.seasons?.OrderBy(x => x.seasonNumber)).FirstOrDefault(x => x.seasonNumber > 0) ?? new Season(); firstSeries.monitored = true; var episodes = SonarrApi.GetEpisodes(series.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); // Need to get the episodes so we mark them as monitored var episodesToUpdate = new List <SonarrEpisodes>(); foreach (var e in episodes) { if (e.hasFile || e.seasonNumber != firstSeries.seasonNumber) { continue; } e.monitored = true; // Mark only the episodes we want as monitored episodesToUpdate.Add(e); } foreach (var sonarrEpisode in episodesToUpdate) { SonarrApi.UpdateEpisode(sonarrEpisode, sonarrSettings.ApiKey, sonarrSettings.FullUri); } SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); SonarrApi.SearchForSeason(series.id, firstSeries.seasonNumber, sonarrSettings.ApiKey, sonarrSettings.FullUri); return(new SonarrAddSeries { title = series.title }); // We have updated it } if (latest ?? false) { var lastSeries = series?.seasons?.OrderByDescending(x => x.seasonNumber)?.FirstOrDefault() ?? new Season(); lastSeries.monitored = true; var episodes = SonarrApi.GetEpisodes(series.id.ToString(), sonarrSettings.ApiKey, sonarrSettings.FullUri); // Need to get the episodes so we mark them as monitored var episodesToUpdate = new List <SonarrEpisodes>(); foreach (var e in episodes) { if (e.hasFile || e.seasonNumber != lastSeries.seasonNumber) { continue; } e.monitored = true; // Mark only the episodes we want as monitored episodesToUpdate.Add(e); } foreach (var sonarrEpisode in episodesToUpdate) { SonarrApi.UpdateEpisode(sonarrEpisode, sonarrSettings.ApiKey, sonarrSettings.FullUri); } SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); SonarrApi.SearchForSeason(series.id, lastSeries.seasonNumber, sonarrSettings.ApiKey, sonarrSettings.FullUri); return(new SonarrAddSeries { title = series.title }); // We have updated it } if (specificSeasonRequest ?? false) { // Monitor the seasons that we have chosen foreach (var season in series.seasons) { if (model.SeasonList.Contains(season.seasonNumber)) { season.monitored = true; SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri); SonarrApi.SearchForSeason(series.id, season.seasonNumber, sonarrSettings.ApiKey, sonarrSettings.FullUri); } } return(new SonarrAddSeries { title = series.title }); // We have updated it } return(null); }
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); } }