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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        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);
            }
        }
Example #6
0
        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);
            }
        }