예제 #1
0
        public void Queued()
        {
            var settings = SonarrSettings.GetSettings();

            if (settings.Enabled)
            {
                Job.SetRunning(true, JobNames.SonarrCacher);
                try
                {
                    var series = SonarrApi.GetSeries(settings.ApiKey, settings.FullUri);
                    if (series != null)
                    {
                        Cache.Set(CacheKeys.SonarrQueued, series, CacheKeys.TimeFrameMinutes.SchedulerCaching);
                    }
                }
                catch (System.Exception ex)
                {
                    Log.Error(ex, "Failed caching queued items from Sonarr");
                }
                finally
                {
                    Job.Record(JobNames.SonarrCacher);
                    Job.SetRunning(false, JobNames.SonarrCacher);
                }
            }
        }
        public static void ResetDatabase()
        {
            var defaultSettings = new PlexRequestSettings
            {
                RequireTvShowApproval = true,
                RequireMovieApproval  = true,
                SearchForMovies       = true,
                SearchForTvShows      = true,
                BaseUrl             = string.Empty,
                CollectAnalyticData = true,
            };

            UpdateSettings(defaultSettings);

            LandingPageSettings lp           = null;
            PlexSettings        plexSettings = null;
            SonarrSettings      sonarr       = null;
            CouchPotatoSettings cp           = null;
            SickRageSettings    sr           = null;

            UpdateSettings(lp);
            UpdateSettings(plexSettings);
            UpdateSettings(sonarr);
            UpdateSettings(cp);
            UpdateSettings(sr);
        }
예제 #3
0
        private async Task <SonarrAddSeries> ProcessSonarrRequestSeason(SonarrSettings sonarrSettings, RequestedModel model, int qualityId, string rootFolderPath)
        {
            // Does the series exist?
            var series = await GetSonarrSeries(sonarrSettings, model.ProviderId);

            if (series == null)
            {
                //WORKS
                // Add the series
                return(AddSeries(sonarrSettings, model, rootFolderPath, qualityId));
            }

            // Also make sure the series is now monitored otherwise we won't search for it
            series.monitored = true;
            foreach (var seasons in series.seasons)
            {
                seasons.monitored = true;
            }

            // Send the update command
            series = SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri);
            SonarrApi.SearchForSeries(series.id, sonarrSettings.ApiKey, sonarrSettings.FullUri);
            return(new SonarrAddSeries {
                title = series.title
            });
        }
예제 #4
0
        public async Task <SenderResult> Send(ChildRequests model)
        {
            var sonarr = await SonarrSettings.GetSettingsAsync();

            if (sonarr.Enabled)
            {
                var result = await SendToSonarr(model);

                if (result != null)
                {
                    return(new SenderResult
                    {
                        Sent = true,
                        Success = true
                    });
                }
            }
            var dog = await DogNzbSettings.GetSettingsAsync();

            if (dog.Enabled)
            {
                var result = await SendToDogNzb(model, dog);

                if (!result.Failure)
                {
                    return(new SenderResult
                    {
                        Sent = true,
                        Success = true
                    });
                }
                return(new SenderResult
                {
                    Message = result.ErrorMessage
                });
            }
            var sr = await SickRageSettings.GetSettingsAsync();

            if (sr.Enabled)
            {
                var result = await SendToSickRage(model, sr);

                if (result)
                {
                    return(new SenderResult
                    {
                        Sent = true,
                        Success = true
                    });
                }
                return(new SenderResult
                {
                    Message = "Could not send to SickRage!"
                });
            }
            return(new SenderResult
            {
                Success = true
            });
        }
예제 #5
0
        public void SetUp()
        {
            var mockRepo = new Mock <ISqlRepository <SonarrSettings> >();

            ExpectedLink = new SonarrSettings
            {
                Id              = 1,
                Enabled         = true,
                IpAddress       = "192",
                Port            = 25,
                ShowOnDashboard = true,
                ApiKey          = "abc"
            };
            ExpectedGetLinks = new List <SonarrSettings>
            {
                ExpectedLink,
            };


            mockRepo.Setup(x => x.GetAll()).Returns(ExpectedGetLinks).Verifiable();

            mockRepo.Setup(x => x.Get(1)).Returns(ExpectedLink).Verifiable();

            mockRepo.Setup(x => x.Update(It.IsAny <SonarrSettings>())).Returns(true).Verifiable();

            mockRepo.Setup(x => x.Insert(It.IsAny <SonarrSettings>())).Returns(1).Verifiable();


            MockRepo = mockRepo;
            Service  = new SonarrSettingsService(MockRepo.Object);
        }
예제 #6
0
        private async Task <string> GetRootPath(int pathId, SonarrSettings sonarrSettings)
        {
            var rootFoldersResult = await Cache.GetOrSetAsync(CacheKeys.SonarrRootFolders, async() =>
            {
                return(await Task.Run(() => SonarrApi.GetRootFolders(sonarrSettings.ApiKey, sonarrSettings.FullUri)));
            });

            foreach (var r in rootFoldersResult.Where(r => r.id == pathId))
            {
                return(r.path);
            }

            int outRoot;
            var defaultPath = int.TryParse(sonarrSettings.RootPath, out outRoot);

            if (defaultPath)
            {
                // Return default path
                return(rootFoldersResult.FirstOrDefault(x => x.id.Equals(outRoot))?.path ?? string.Empty);
            }
            else
            {
                return(rootFoldersResult.FirstOrDefault()?.path ?? string.Empty);
            }
        }
예제 #7
0
        private async Task <Response> ChangeRootFolder(int id, int rootFolderId)
        {
            // Get all root folders
            var settings = await SonarrSettings.GetSettingsAsync();

            var rootFolders = SonarrApi.GetRootFolders(settings.ApiKey, settings.FullUri);

            // Get Request
            var allRequests = await Service.GetAllAsync();

            var request = allRequests.FirstOrDefault(x => x.Id == id);

            if (request == null)
            {
                return(Response.AsJson(new JsonResponseModel {
                    Result = false
                }));
            }

            foreach (var folder in rootFolders)
            {
                if (folder.id.Equals(rootFolderId))
                {
                    request.RootFolderSelected = folder.id;
                    break;
                }
            }

            await Service.UpdateRequestAsync(request);

            return(Response.AsJson(new JsonResponseModel {
                Result = true
            }));
        }
예제 #8
0
        private async Task <Series> GetSonarrSeries(SonarrSettings sonarrSettings, int showId)
        {
            var task = await Task.Run(() => SonarrApi.GetSeries(sonarrSettings.ApiKey, sonarrSettings.FullUri)).ConfigureAwait(false);

            var selectedSeries = task.FirstOrDefault(series => series.tvdbId == showId);

            return(selectedSeries);
        }
예제 #9
0
        public async Task <bool> SonarrSettings([FromBody] SonarrSettings settings)
        {
            var result = await Save(settings);

            if (result)
            {
                await OmbiQuartz.TriggerJob(nameof(ISonarrSync), "DVR");
            }
            return(result);
        }
예제 #10
0
        private SonarrSettings GetSonarrSettings()
        {
            var sonarrSettings = new SonarrSettings
            {
                ApiKey  = "abc",
                Enabled = true,
                Ip      = "192.168.1.1",
                Port    = 8989,
            };

            return(sonarrSettings);
        }
예제 #11
0
        private async Task <SonarrAddSeries> ProcessSonarrEpisodeRequest(SonarrSettings sonarrSettings, RequestedModel model, int qualityId, string rootFolderPath)
        {
            // Does the series exist?

            var series = await GetSonarrSeries(sonarrSettings, model.ProviderId);

            if (series == null)
            {
                var seriesToAdd = new SonarrAddSeries
                {
                    seasonFolder     = sonarrSettings.SeasonFolders,
                    title            = model.Title,
                    qualityProfileId = qualityId,
                    tvdbId           = model.ProviderId,
                    titleSlug        = model.Title,
                    seasons          = new List <Season>(),
                    rootFolderPath   = rootFolderPath,
                    monitored        = true, // Montior the series
                    images           = new List <SonarrImage>(),
                    addOptions       = new AddOptions
                    {
                        ignoreEpisodesWithFiles    = true, // We don't really care about these
                        ignoreEpisodesWithoutFiles = true, // We do not want to grab random episodes missing
                        searchForMissingEpisodes   = false // we want don't want to search for the missing episodes either
                    }
                };

                for (var i = 1; i <= model.SeasonCount; i++)
                {
                    var season = new Season
                    {
                        seasonNumber = i,
                        monitored    = false // Do not monitor any seasons
                    };
                    seriesToAdd.seasons.Add(season);
                }

                // Add the series now
                var result = SonarrApi.AddSeries(seriesToAdd, sonarrSettings.ApiKey, sonarrSettings.FullUri);

                await RequestEpisodesForSonarr(model, result.id, sonarrSettings);
            }
            else
            {
                await RequestEpisodesForSonarr(model, series.id, sonarrSettings);
            }

            return(new SonarrAddSeries()
            {
                title = model.Title
            });
        }
예제 #12
0
        private void ProcessMissingInformation(List <RequestQueue> requests)
        {
            if (!requests.Any())
            {
                return;
            }

            var sonarrSettings   = SonarrSettings.GetSettings();
            var sickrageSettings = SickrageSettings.GetSettings();

            var tv = requests.Where(x => x.Type == RequestType.TvShow);

            // TV
            var tvApi = new TvMazeApi();

            foreach (var t in tv)
            {
                var providerId = int.Parse(t.PrimaryIdentifier);
                var showInfo   = tvApi.ShowLookup(providerId);

                if (showInfo.externals?.thetvdb != null)
                {
                    // We now have the info
                    var tvModel = ByteConverterHelper.ReturnObject <RequestedModel>(t.Content);
                    tvModel.ProviderId = showInfo.externals.thetvdb.Value;
                    var result = ProcessTvShow(tvModel, sonarrSettings, sickrageSettings);

                    if (!result)
                    {
                        // we now have the info but couldn't add it, so add it back into the queue but with a different fault
                        t.Content   = ByteConverterHelper.ReturnBytes(tvModel);
                        t.FaultType = FaultType.RequestFault;
                        t.LastRetry = DateTime.UtcNow;
                        Repo.Update(t);
                    }
                    else
                    {
                        // Make sure it's been requested
                        var existingRequests = RequestService.GetAll();
                        var thisItem         = existingRequests.Any(x => x.Title.Equals(tvModel.Title));
                        if (!thisItem)
                        {
                            tvModel.Approved = true;
                            RequestService.AddRequest(tvModel);
                        }

                        // Successful, remove from the fault queue
                        Repo.Delete(t);
                    }
                }
            }
        }
예제 #13
0
파일: TvSender.cs 프로젝트: uzegonemad/Ombi
        private async Task <string> GetRootPath(int pathId, SonarrSettings sonarrSettings)
        {
            var rootFoldersResult = await Cache.GetOrSetAsync(CacheKeys.SonarrRootFolders, async() =>
            {
                return(await Task.Run(() => SonarrApi.GetRootFolders(sonarrSettings.ApiKey, sonarrSettings.FullUri)));
            });

            foreach (var r in rootFoldersResult.Where(r => r.id == pathId))
            {
                return(r.path);
            }
            return(string.Empty);
        }
예제 #14
0
        public async Task <bool> Sonarr([FromBody] SonarrSettings settings)
        {
            try
            {
                var result = await SonarrApi.SystemStatus(settings.ApiKey, settings.FullUri);

                return(result.version != null);
            }
            catch (Exception e)
            {
                Log.LogError(LoggingEvents.Api, e, "Could not test Sonarr");
                return(false);
            }
        }
예제 #15
0
        public void Queued(long check)
        {
            Log.Trace("This is check no. {0}", check);
            Log.Trace("Getting the settings");

            var settings = SonarrSettings.GetSettings();

            if (settings.Enabled)
            {
                Log.Trace("Getting all tv series from Sonarr");
                var series = SonarrApi.GetSeries(settings.ApiKey, settings.FullUri);
                Cache.Set(CacheKeys.SonarrQueued, series, 10);
            }
        }
예제 #16
0
        public async Task <SonarrAddSeries> SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model,
                                                         string qualityId)
        {
            var qualityProfile = 0;

            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 rootFolderPath = model.RootFolderSelected <= 0 ? sonarrSettings.FullRootPath : await GetSonarrRootPath(model.RootFolderSelected, sonarrSettings);

            var episodeRequest        = model.Episodes.Any();
            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();

            if (episodeRequest)
            {
                return(await ProcessSonarrEpisodeRequest(sonarrSettings, model, qualityProfile, rootFolderPath));
            }

            if (requestAll ?? false)
            {
                return(await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath));
            }

            if (first ?? false)
            {
                return(await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath));
            }

            if (latest ?? false)
            {
                return(await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath));
            }

            if (specificSeasonRequest ?? false)
            {
                return(await ProcessSonarrRequestSeason(sonarrSettings, model, qualityProfile, rootFolderPath));
            }

            return(null);
        }
예제 #17
0
파일: TvSender.cs 프로젝트: itzfk0/ombi
        private async Task <string> GetSonarrRootPath(int pathId, SonarrSettings sonarrSettings)
        {
            var rootFoldersResult = await SonarrApi.GetRootFolders(sonarrSettings.ApiKey, sonarrSettings.FullUri);

            if (pathId == 0)
            {
                return(rootFoldersResult.FirstOrDefault().path);
            }

            foreach (var r in rootFoldersResult.Where(r => r.id == pathId))
            {
                return(r.path);
            }
            return(string.Empty);
        }
예제 #18
0
        private void ProcessTransientErrors(List <RequestQueue> requests)
        {
            var sonarrSettings   = SonarrSettings.GetSettings();
            var sickrageSettings = SickrageSettings.GetSettings();
            var cpSettings       = CpSettings.GetSettings();
            var hpSettings       = HeadphoneSettings.GetSettings();

            if (!requests.Any())
            {
                return;
            }

            foreach (var request in requests)
            {
                var  model = ByteConverterHelper.ReturnObject <RequestedModel>(request.Content);
                bool result;
                switch (request.Type)
                {
                case RequestType.Movie:
                    result = ProcessMovies(model);
                    break;

                case RequestType.TvShow:
                    result = ProcessTvShow(model, sonarrSettings, sickrageSettings);
                    break;

                case RequestType.Album:
                    result = ProcessAlbums(model, hpSettings);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (!result)
                {
                    // we now have the info but couldn't add it, so do nothing now.
                    request.LastRetry = DateTime.UtcNow;
                    Repo.Update(request);
                }
                else
                {
                    // Successful, remove from the fault queue
                    Repo.Delete(request);
                }
            }
        }
        private Response GetSonarrSettings()
        {
            var model = new ApiModel <SonarrSettings>();

            try
            {
                var settings = SonarrSettings.GetSettings();
                model.Data = settings;
                return(ReturnReponse(model));
            }
            catch (Exception e)
            {
                model.ErrorMessage = e.Message;
                model.Error        = true;
                return(ReturnReponse(model));
            }
        }
예제 #20
0
        public SonarrAddSeries SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model, string qualityId)
        {
            int qualityProfile;

            if (!string.IsNullOrEmpty(qualityId) || !int.TryParse(qualityId, out qualityProfile)) // try to parse the passed in quality, otherwise use the settings default quality
            {
                int.TryParse(sonarrSettings.QualityProfile, out qualityProfile);
            }

            var result = SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile,
                                             sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.SeasonCount, model.SeasonList, sonarrSettings.ApiKey,
                                             sonarrSettings.FullUri);

            Log.Trace("Sonarr Add Result: ");
            Log.Trace(result.DumpJson());

            return(result);
        }
예제 #21
0
        public async Task <TesterResultModel> Sonarr([FromBody] SonarrSettings settings)
        {
            try
            {
                var result = await SonarrApi.SystemStatus(settings.ApiKey, settings.FullUri);

                return(new TesterResultModel
                {
                    IsValid = result.urlBase == settings.SubDir || string.IsNullOrEmpty(result.urlBase) && string.IsNullOrEmpty(settings.SubDir),
                    ExpectedSubDir = result.urlBase
                });
            }
            catch (Exception e)
            {
                Log.LogError(LoggingEvents.Api, e, "Could not test Sonarr");
                return(new TesterResultModel {
                    IsValid = false
                });
            }
        }
예제 #22
0
        public void SaveBadSonarrSettings()
        {
            var model = new SonarrSettings
            {
                Ip  = "q",
                Ssl = true,
            };
            var browser = new Browser(Bootstrapper);
            var result  = browser.Post("/api/settings/sonarr", with =>
            {
                with.HttpRequest();
                with.Header("Accept", "application/json");
                with.Query("apikey", "api");
                with.JsonBody(model);
            });

            var body = JsonConvert.DeserializeObject <ApiModel <bool> >(result.Body.AsString());

            Assert.That(body.Data, Is.EqualTo(false));
            Assert.That(body.Error, Is.True);
            Assert.That(body.ErrorMessage, Is.EqualTo("Could not update the settings"));
        }
예제 #23
0
        private bool ProcessTvShow(RequestedModel tvModel, SonarrSettings sonarr, SickRageSettings sickrage)
        {
            try
            {
                var sender = new TvSenderOld(SonarrApi, SrApi);
                if (sonarr.Enabled)
                {
                    var task = sender.SendToSonarr(sonarr, tvModel, sonarr.QualityProfile);
                    var a    = task.Result;
                    if (string.IsNullOrEmpty(a?.title))
                    {
                        // Couldn't send it
                        return(false);
                    }
                    return(true);
                }

                if (sickrage.Enabled)
                {
                    var result = sender.SendToSickRage(sickrage, tvModel);
                    if (result?.result != "success")
                    {
                        // Couldn't send it
                        return(false);
                    }

                    // Approve it
                    tvModel.Approved = true;
                    RequestService.UpdateRequest(tvModel);
                    return(true);
                }
                return(false);
            }
            catch (Exception e)
            {
                Log.Error(e);
                return(false); // It fails so it will get added back into the queue
            }
        }
        private Response PostSonarrSettings()
        {
            var newSettings = JsonConvert.DeserializeObject <SonarrSettings>(Request.Body.AsString());
            var result      = this.Validate(newSettings);

            if (!result.IsValid)
            {
                return(ReturnValidationReponse(result));
            }

            var model    = new ApiModel <bool>();
            var settings = SonarrSettings.SaveSettings(newSettings);

            if (settings)
            {
                model.Data = true;
                return(ReturnReponse(model));
            }

            model.Error        = true;
            model.ErrorMessage = "Could not update the settings";
            return(ReturnReponse(model));
        }
예제 #25
0
        public bool SaveSettings(SonarrSettingsViewModelDto model)
        {
            var entity = Repo.Get(model.Id);

            if (entity == null)
            {
                var newEntity = new SonarrSettings();
                newEntity.InjectFrom(model);

                var insertResult = Repo.Insert(newEntity);
                return(insertResult != long.MinValue);
            }

            entity.Enabled         = model.Enabled;
            entity.IpAddress       = model.IpAddress;
            entity.Port            = model.Port;
            entity.ApiKey          = model.ApiKey;
            entity.Id              = model.Id;
            entity.ShowOnDashboard = model.ShowOnDashboard;

            var result = Repo.Update(entity);

            return(result);
        }
예제 #26
0
        public SonarrAddSeries AddSeries(SonarrSettings sonarrSettings, RequestedModel model, string rootFolderPath, int qualityId)
        {
            //WORKS
            // Add the series
            var seriesToAdd = new SonarrAddSeries
            {
                seasonFolder     = sonarrSettings.SeasonFolders,
                title            = model.Title,
                qualityProfileId = qualityId,
                tvdbId           = model.ProviderId,
                titleSlug        = model.Title,
                seasons          = new List <Season>(),
                rootFolderPath   = rootFolderPath,
                monitored        = true, // Montior the series
                images           = new List <SonarrImage>(),
                addOptions       = new AddOptions
                {
                    ignoreEpisodesWithFiles    = true,  // We don't really care about these
                    ignoreEpisodesWithoutFiles = false, // We want to get the whole season
                    searchForMissingEpisodes   = true   // we want to search for missing
                }
            };

            for (var i = 1; i <= model.SeasonCount; i++)
            {
                var season = new Season
                {
                    seasonNumber = i,
                    // The model.SeasonList.Lenth is 0 when this is a "request all"
                    monitored = model.SeasonList.Length == 0 || model.SeasonList.Any(x => x == i)
                };
                seriesToAdd.seasons.Add(season);
            }

            return(SonarrApi.AddSeries(seriesToAdd, sonarrSettings.ApiKey, sonarrSettings.FullUri));
        }
        private Response GetTvShows() // TODO: async await the API calls
        {
            var settings = PrSettings.GetSettings();

            List <Task> taskList = new List <Task>();

            List <RequestedModel> dbTv = new List <RequestedModel>();

            taskList.Add(Task.Factory.StartNew(() =>
            {
                return(Service.GetAll().Where(x => x.Type == RequestType.TvShow));
            }).ContinueWith((t) =>
            {
                dbTv = t.Result.ToList();

                if (settings.UsersCanViewOnlyOwnRequests && !IsAdmin)
                {
                    dbTv = dbTv.Where(x => x.UserHasRequested(Username)).ToList();
                }
            }));

            List <QualityModel> qualities = new List <QualityModel>();

            if (IsAdmin)
            {
                var sonarrSettings = SonarrSettings.GetSettings();
                if (sonarrSettings.Enabled)
                {
                    taskList.Add(Task.Factory.StartNew(() =>
                    {
                        return(Cache.GetOrSet(CacheKeys.SonarrQualityProfiles, () =>
                        {
                            return SonarrApi.GetProfiles(sonarrSettings.ApiKey, sonarrSettings.FullUri); // TODO: cache this!
                        }));
                    }).ContinueWith((t) =>
                    {
                        qualities = t.Result.Select(x => new QualityModel()
                        {
                            Id = x.id.ToString(), Name = x.name
                        }).ToList();
                    }));
                }
                else
                {
                    var sickRageSettings = SickRageSettings.GetSettings();
                    if (sickRageSettings.Enabled)
                    {
                        qualities = sickRageSettings.Qualities.Select(x => new QualityModel()
                        {
                            Id = x.Key, Name = x.Value
                        }).ToList();
                    }
                }
            }

            Task.WaitAll(taskList.ToArray());

            var viewModel = dbTv.Select(tv =>
            {
                return(new RequestViewModel
                {
                    ProviderId = tv.ProviderId,
                    Type = tv.Type,
                    Status = tv.Status,
                    ImdbId = tv.ImdbId,
                    Id = tv.Id,
                    PosterPath = tv.PosterPath,
                    ReleaseDate = tv.ReleaseDate,
                    ReleaseDateTicks = tv.ReleaseDate.Ticks,
                    RequestedDate = tv.RequestedDate,
                    RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(tv.RequestedDate, DateTimeOffset).Ticks,
                    Released = DateTime.Now > tv.ReleaseDate,
                    Approved = tv.Available || tv.Approved,
                    Title = tv.Title,
                    Overview = tv.Overview,
                    RequestedUsers = IsAdmin ? tv.AllUsers.ToArray() : new string[] { },
                    ReleaseYear = tv.ReleaseDate.Year.ToString(),
                    Available = tv.Available,
                    Admin = IsAdmin,
                    Issues = tv.Issues.ToString().CamelCaseToWords(),
                    OtherMessage = tv.OtherMessage,
                    AdminNotes = tv.AdminNote,
                    TvSeriesRequestType = tv.SeasonsRequested,
                    Qualities = qualities.ToArray()
                });
            }).ToList();

            return(Response.AsJson(viewModel));
        }
예제 #28
0
        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);

            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, sonarrSettings.RootPath, 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);
            }

            if (series != null)
            {
                var requestAll = model.SeasonsRequested.Equals("All", StringComparison.CurrentCultureIgnoreCase);
                var first      = model.SeasonsRequested.Equals("First", StringComparison.CurrentCultureIgnoreCase);
                var latest     = model.SeasonsRequested.Equals("Latest", StringComparison.CurrentCultureIgnoreCase);

                if (model.SeasonList.Any())
                {
                    // Monitor the seasons that we have chosen
                    foreach (var season in series.seasons)
                    {
                        if (model.SeasonList.Contains(season.seasonNumber))
                        {
                            season.monitored = true;
                        }
                    }
                }

                if (requestAll)
                {
                    // Monitor all seasons
                    foreach (var season in series.seasons)
                    {
                        season.monitored = true;
                    }
                }

                if (first)
                {
                    var firstSeries = series?.seasons?.OrderBy(x => x.seasonNumber)?.FirstOrDefault() ?? new Season();
                    firstSeries.monitored = true;
                }

                if (latest)
                {
                    var lastSeries = series?.seasons?.OrderByDescending(x => x.seasonNumber)?.FirstOrDefault() ?? new Season();
                    lastSeries.monitored = true;
                }


                // Update the series in sonarr with the new monitored status
                SonarrApi.UpdateSeries(series, sonarrSettings.ApiKey, sonarrSettings.FullUri);
                await RequestAllEpisodesInASeasonWithExistingSeries(model, series, sonarrSettings);

                return(new SonarrAddSeries {
                    title = series.title
                });                                                  // We have updated it
            }


            var result = SonarrApi.AddSeries(model.ProviderId, model.Title, qualityProfile,
                                             sonarrSettings.SeasonFolders, sonarrSettings.RootPath, model.SeasonCount, model.SeasonList, sonarrSettings.ApiKey,
                                             sonarrSettings.FullUri, true, true);

            return(result);
        }
예제 #29
0
 public async Task <SonarrAddSeries> SendToSonarr(SonarrSettings sonarrSettings, RequestedModel model)
 {
     return(await SendToSonarr(sonarrSettings, model, string.Empty));
 }
예제 #30
0
        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);
        }