コード例 #1
0
        public async Task ExistingRequestRule_Movie_Has_Been_Requested_With_TheMovieDBId()
        {
            ContextMock.Setup(x => x.GetAll()).Returns(new List <MovieRequests>
            {
                new MovieRequests
                {
                    TheMovieDbId = 1,
                    RequestType  = RequestType.Movie
                }
            }.AsQueryable().BuildMock().Object);
            var o = new MovieRequests
            {
                TheMovieDbId = 1,
            };
            var result = await Rule.Execute(o);

            Assert.That(result.Success, Is.False);
            Assert.That(result.Message, Is.Not.Empty);
        }
コード例 #2
0
        public async Task ShouldBe_NotRequested_WhenNewMovie()
        {
            var list = new MovieRequests
            {
                TheMovieDbId = 123,
                Approved     = true
            };

            MovieMock.Setup(x => x.GetRequest(123)).Returns(list);
            var search = new SearchMovieViewModel
            {
                Id = 999,
            };
            var result = await Rule.Execute(search);

            Assert.True(result.Success);
            Assert.False(search.Approved);
            Assert.False(search.Requested);
        }
コード例 #3
0
ファイル: MovieSender.cs プロジェクト: uncleiven/Ombi
        public async Task <SenderResult> Send(MovieRequests model)
        {
            var cpSettings = await CouchPotatoSettings.GetSettingsAsync();

            //var watcherSettings = await WatcherSettings.GetSettingsAsync();
            var radarrSettings = await RadarrSettings.GetSettingsAsync();

            if (radarrSettings.Enabled)
            {
                return(await SendToRadarr(model, radarrSettings));
            }

            var dogSettings = await DogNzbSettings.GetSettingsAsync();

            if (dogSettings.Enabled)
            {
                await SendToDogNzb(model, dogSettings);

                return(new SenderResult
                {
                    Success = true,
                    Sent = true,
                });
            }

            if (cpSettings.Enabled)
            {
                return(await SendToCp(model, cpSettings, cpSettings.DefaultProfileId));
            }

            //if (watcherSettings.Enabled)
            //{
            //    return SendToWatcher(model, watcherSettings);
            //}


            return(new SenderResult
            {
                Success = true,
                Sent = false,
            });
        }
コード例 #4
0
        public async Task ShouldBe_Requested_WhenExisitngMovie()
        {
            var list = new MovieRequests
            {
                TheMovieDbId = 123,
                Approved     = true,
                RequestType  = RequestType.Movie
            };

            MovieMock.Setup(x => x.GetRequestAsync(123)).ReturnsAsync(list);
            var search = new SearchMovieViewModel
            {
                Id = 123,
            };
            var result = await Rule.Execute(search);

            Assert.That(result.Success, Is.True);
            Assert.That(search.Approved, Is.True);
            Assert.That(search.Requested, Is.True);
        }
コード例 #5
0
        /// <summary>
        /// Updates the movie request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns></returns>
        public async Task <MovieRequests> UpdateMovieRequest(MovieRequests request)
        {
            var allRequests = await MovieRepository.GetWithUser().ToListAsync();

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

            results.Approved         = request.Approved;
            results.Available        = request.Available;
            results.Denied           = request.Denied;
            results.DeniedReason     = request.DeniedReason;
            results.ImdbId           = request.ImdbId;
            results.IssueId          = request.IssueId;
            results.Issues           = request.Issues;
            results.Overview         = request.Overview;
            results.PosterPath       = PosterPathHelper.FixPosterPath(request.PosterPath);
            results.QualityOverride  = request.QualityOverride;
            results.RootPathOverride = request.RootPathOverride;

            await MovieRepository.Update(results);

            return(results);
        }
コード例 #6
0
        private async Task <RequestEngineResult> AddMovieRequest(MovieRequests model, string movieName)
        {
            await MovieRepository.Add(model);

            var result = await RunSpecificRule(model, SpecificRules.CanSendNotification);

            if (result.Success)
            {
                NotificationHelper.NewRequest(model);
            }

            await _requestLog.Add(new RequestLog
            {
                UserId      = (await GetUser()).Id,
                RequestDate = DateTime.UtcNow,
                RequestId   = model.Id,
                RequestType = RequestType.Movie,
            });

            return(new RequestEngineResult {
                Result = true, Message = $"{movieName} has been successfully added!", RequestId = model.Id
            });
        }
コード例 #7
0
        public async Task RequestMovie_IsAlreadyAvailable()
        {
            var content = new List <PlexServerContent> {
                new PlexServerContent
                {
                    TheMovieDbId = 123.ToString(),
                }
            };

            PlexContentRepo.Setup(x => x.GetAll()).Returns(content.AsQueryable().BuildMock().Object);

            var req = new MovieRequests
            {
                RequestType  = RequestType.Movie,
                TheMovieDbId = 123,
                Id           = 1,
            };
            var result = await Rule.Execute(req);


            Assert.That(result.Success, Is.False);
            Assert.That(result.ErrorCode, Is.EqualTo(ErrorCode.AlreadyRequested));
        }
コード例 #8
0
        public async Task ExistingRequestRule_Movie_HasAlready4K_Request()
        {
            ContextMock.Setup(x => x.GetAll()).Returns(new List <MovieRequests>
            {
                new MovieRequests
                {
                    TheMovieDbId = 2,
                    ImdbId       = "2",
                    RequestType  = RequestType.Movie,
                    Is4kRequest  = true
                }
            }.AsQueryable().BuildMock().Object);
            var o = new MovieRequests
            {
                TheMovieDbId = 2,
                ImdbId       = "1",
                Has4KRequest = true
            };
            var result = await Rule.Execute(o);

            Assert.That(result.Success, Is.False);
            Assert.That(result.Message, Is.Not.Empty);
        }
コード例 #9
0
        private async Task <RequestEngineResult> AddMovieRequest(MovieRequests model, string movieName, string requestOnBehalf, bool isExisting, bool is4k)
        {
            if (is4k)
            {
                model.Has4KRequest = true;
            }
            if (!isExisting)
            {
                await MovieRepository.Add(model);
            }
            else
            {
                await MovieRepository.Update(model);
            }

            var result = await RunSpecificRule(model, SpecificRules.CanSendNotification, requestOnBehalf);

            if (result.Success)
            {
                await NotificationHelper.NewRequest(model);
            }

            await _mediaCacheService.Purge();

            await _requestLog.Add(new RequestLog
            {
                UserId      = requestOnBehalf.HasValue() ? requestOnBehalf : (await GetUser()).Id,
                RequestDate = DateTime.UtcNow,
                RequestId   = model.Id,
                RequestType = RequestType.Movie,
            });

            return(new RequestEngineResult {
                Result = true, Message = $"{movieName} has been successfully added!", RequestId = model.Id
            });
        }
コード例 #10
0
        public async Task ExistingRequestRule_Movie_4K_Request_FeatureNotEnabled()
        {
            FeatureService.Setup(x => x.FeatureEnabled(FeatureNames.Movie4KRequests)).ReturnsAsync(false);
            ContextMock.Setup(x => x.GetAll()).Returns(new List <MovieRequests>
            {
                new MovieRequests
                {
                    TheMovieDbId = 2,
                    ImdbId       = "2",
                    RequestType  = RequestType.Movie,
                    Is4kRequest  = false
                }
            }.AsQueryable().BuildMock().Object);
            var o = new MovieRequests
            {
                TheMovieDbId = 2,
                ImdbId       = "1",
                Is4kRequest  = true
            };
            var result = await Rule.Execute(o);

            Assert.That(result.Success, Is.False);
            Assert.That(result.Message, Is.Not.Null);
        }
コード例 #11
0
        public async Task <SenderResult> Send(MovieRequests model)
        {
            try
            {
                var cpSettings = await CouchPotatoSettings.GetSettingsAsync();

                //var watcherSettings = await WatcherSettings.GetSettingsAsync();
                var radarrSettings = await RadarrSettings.GetSettingsAsync();

                if (radarrSettings.Enabled)
                {
                    return(await SendToRadarr(model, radarrSettings));
                }

                var dogSettings = await DogNzbSettings.GetSettingsAsync();

                if (dogSettings.Enabled)
                {
                    await SendToDogNzb(model, dogSettings);

                    return(new SenderResult
                    {
                        Success = true,
                        Sent = true,
                    });
                }

                if (cpSettings.Enabled)
                {
                    return(await SendToCp(model, cpSettings, cpSettings.DefaultProfileId));
                }
            }
            catch (Exception e)
            {
                Log.LogError(e, "Error when seing movie to DVR app, added to the request queue");

                // Check if already in request quee
                var existingQueue = await _requestQueuRepository.FirstOrDefaultAsync(x => x.RequestId == model.Id);

                if (existingQueue != null)
                {
                    existingQueue.RetryCount++;
                    existingQueue.Error = e.Message;
                    await _requestQueuRepository.SaveChangesAsync();
                }
                else
                {
                    await _requestQueuRepository.Add(new RequestQueue
                    {
                        Dts        = DateTime.UtcNow,
                        Error      = e.Message,
                        RequestId  = model.Id,
                        Type       = RequestType.Movie,
                        RetryCount = 0
                    });

                    _notificationHelper.Notify(model, NotificationType.ItemAddedToFaultQueue);
                }
            }

            return(new SenderResult
            {
                Success = true,
                Sent = false,
            });
        }
コード例 #12
0
        private async Task <SenderResult> SendToRadarr(MovieRequests model, RadarrSettings settings)
        {
            var qualityToUse = int.Parse(settings.DefaultQualityProfile);

            var rootFolderPath = settings.DefaultRootPath;

            var profiles = await _userProfiles.GetAll().FirstOrDefaultAsync(x => x.UserId == model.RequestedUserId);

            if (profiles != null)
            {
                if (profiles.RadarrRootPath > 0)
                {
                    var tempPath = await RadarrRootPath(profiles.RadarrRootPath, settings);

                    if (tempPath.HasValue())
                    {
                        rootFolderPath = tempPath;
                    }
                }
                if (profiles.RadarrQualityProfile > 0)
                {
                    qualityToUse = profiles.RadarrQualityProfile;
                }
            }

            // Overrides on the request take priority
            if (model.QualityOverride > 0)
            {
                qualityToUse = model.QualityOverride;
            }
            if (model.RootPathOverride > 0)
            {
                rootFolderPath = await RadarrRootPath(model.RootPathOverride, settings);
            }

            // Check if the movie already exists? Since it could be unmonitored
            var movies = await RadarrApi.GetMovies(settings.ApiKey, settings.FullUri);

            var existingMovie = movies.FirstOrDefault(x => x.tmdbId == model.TheMovieDbId);

            if (existingMovie == null)
            {
                var result = await RadarrApi.AddMovie(model.TheMovieDbId, model.Title, model.ReleaseDate.Year,
                                                      qualityToUse, rootFolderPath, settings.ApiKey, settings.FullUri, !settings.AddOnly,
                                                      settings.MinimumAvailability);

                if (!string.IsNullOrEmpty(result.Error?.message))
                {
                    Log.LogError(LoggingEvents.RadarrCacher, result.Error.message);
                    return(new SenderResult {
                        Success = false, Message = result.Error.message, Sent = false
                    });
                }
                if (!string.IsNullOrEmpty(result.title))
                {
                    return(new SenderResult {
                        Success = true, Sent = false
                    });
                }
                return(new SenderResult {
                    Success = true, Sent = false
                });
            }
            // We have the movie, check if we can request it or change the status
            if (!existingMovie.monitored)
            {
                // let's set it to monitored and search for it
                existingMovie.monitored = true;
                await RadarrApi.UpdateMovie(existingMovie, settings.ApiKey, settings.FullUri);

                // Search for it
                if (!settings.AddOnly)
                {
                    await RadarrApi.MovieSearch(new[] { existingMovie.id }, settings.ApiKey, settings.FullUri);
                }

                return(new SenderResult {
                    Success = true, Sent = true
                });
            }

            return(new SenderResult {
                Success = false, Sent = false, Message = "Movie is already monitored"
            });
        }
コード例 #13
0
 public async Task <MovieRequests> UpdateRequest([FromBody] MovieRequests model)
 {
     return(await MovieRequestEngine.UpdateMovieRequest(model));
 }
コード例 #14
0
        /// <summary>
        /// Requests the movie.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <returns></returns>
        public async Task <RequestEngineResult> RequestMovie(MovieRequestViewModel model)
        {
            var movieInfo = await MovieApi.GetMovieInformationWithExtraInfo(model.TheMovieDbId, model.LanguageCode);

            if (movieInfo == null || movieInfo.Id == 0)
            {
                return(new RequestEngineResult
                {
                    Result = false,
                    Message = "There was an issue adding this movie!",
                    ErrorMessage = $"Please try again later"
                });
            }

            var fullMovieName =
                $"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";

            var userDetails = await GetUser();

            var canRequestOnBehalf = model.RequestOnBehalf.HasValue();

            var isAdmin = await UserManager.IsInRoleAsync(userDetails, OmbiRoles.PowerUser) || await UserManager.IsInRoleAsync(userDetails, OmbiRoles.Admin);

            if (canRequestOnBehalf && !isAdmin)
            {
                return(new RequestEngineResult
                {
                    Result = false,
                    Message = "You do not have the correct permissions to request on behalf of users!",
                    ErrorMessage = $"You do not have the correct permissions to request on behalf of users!"
                });
            }

            if ((model.RootFolderOverride.HasValue || model.QualityPathOverride.HasValue) && !isAdmin)
            {
                return(new RequestEngineResult
                {
                    Result = false,
                    Message = "You do not have the correct permissions!",
                    ErrorMessage = $"You do not have the correct permissions!"
                });
            }

            var requestModel = new MovieRequests
            {
                TheMovieDbId = movieInfo.Id,
                RequestType  = RequestType.Movie,
                Overview     = movieInfo.Overview,
                ImdbId       = movieInfo.ImdbId,
                PosterPath   = PosterPathHelper.FixPosterPath(movieInfo.PosterPath),
                Title        = movieInfo.Title,
                ReleaseDate  = !string.IsNullOrEmpty(movieInfo.ReleaseDate)
                    ? DateTime.Parse(movieInfo.ReleaseDate)
                    : DateTime.MinValue,
                Status           = movieInfo.Status,
                RequestedDate    = DateTime.UtcNow,
                Approved         = false,
                RequestedUserId  = canRequestOnBehalf ? model.RequestOnBehalf : userDetails.Id,
                Background       = movieInfo.BackdropPath,
                LangCode         = model.LanguageCode,
                RequestedByAlias = model.RequestedByAlias,
                RootPathOverride = model.RootFolderOverride.GetValueOrDefault(),
                QualityOverride  = model.QualityPathOverride.GetValueOrDefault()
            };

            var usDates = movieInfo.ReleaseDates?.Results?.FirstOrDefault(x => x.IsoCode == "US");

            requestModel.DigitalReleaseDate = usDates?.ReleaseDate
                                              ?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate;

            var ruleResults       = (await RunRequestRules(requestModel)).ToList();
            var ruleResultInError = ruleResults.Find(x => !x.Success);

            if (ruleResultInError != null)
            {
                return(new RequestEngineResult
                {
                    ErrorMessage = ruleResultInError.Message,
                    ErrorCode = ruleResultInError.ErrorCode
                });
            }

            if (requestModel.Approved) // The rules have auto approved this
            {
                var requestEngineResult = await AddMovieRequest(requestModel, fullMovieName, model.RequestOnBehalf);

                if (requestEngineResult.Result)
                {
                    var result = await ApproveMovie(requestModel);

                    if (result.IsError)
                    {
                        Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message);
                        return(new RequestEngineResult
                        {
                            Message = result.Message,
                            ErrorMessage = result.Message,
                            Result = false
                        });
                    }

                    return(requestEngineResult);
                }

                // If there are no providers then it's successful but movie has not been sent
            }

            return(await AddMovieRequest(requestModel, fullMovieName, model.RequestOnBehalf));
        }
コード例 #15
0
        /// <summary>
        /// Requests the movie.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <returns></returns>
        public async Task <RequestEngineResult> RequestMovie(MovieRequestViewModel model)
        {
            var movieInfo = await MovieApi.GetMovieInformationWithExtraInfo(model.TheMovieDbId);

            if (movieInfo == null || movieInfo.Id == 0)
            {
                return(new RequestEngineResult
                {
                    Result = false,
                    Message = "There was an issue adding this movie!",
                    ErrorMessage = $"Please try again later"
                });
            }

            var fullMovieName =
                $"{movieInfo.Title}{(!string.IsNullOrEmpty(movieInfo.ReleaseDate) ? $" ({DateTime.Parse(movieInfo.ReleaseDate).Year})" : string.Empty)}";

            var userDetails = await GetUser();

            var requestModel = new MovieRequests
            {
                TheMovieDbId = movieInfo.Id,
                RequestType  = RequestType.Movie,
                Overview     = movieInfo.Overview,
                ImdbId       = movieInfo.ImdbId,
                PosterPath   = PosterPathHelper.FixPosterPath(movieInfo.PosterPath),
                Title        = movieInfo.Title,
                ReleaseDate  = !string.IsNullOrEmpty(movieInfo.ReleaseDate)
                    ? DateTime.Parse(movieInfo.ReleaseDate)
                    : DateTime.MinValue,
                Status          = movieInfo.Status,
                RequestedDate   = DateTime.UtcNow,
                Approved        = false,
                RequestedUserId = userDetails.Id,
                Background      = movieInfo.BackdropPath
            };

            var usDates = movieInfo.ReleaseDates?.Results?.FirstOrDefault(x => x.IsoCode == "US");

            requestModel.DigitalReleaseDate = usDates?.ReleaseDate
                                              ?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate;

            var ruleResults = (await RunRequestRules(requestModel)).ToList();

            if (ruleResults.Any(x => !x.Success))
            {
                return(new RequestEngineResult
                {
                    ErrorMessage = ruleResults.FirstOrDefault(x => x.Message.HasValue()).Message
                });
            }

            if (requestModel.Approved) // The rules have auto approved this
            {
                var requestEngineResult = await AddMovieRequest(requestModel, fullMovieName);

                if (requestEngineResult.Result)
                {
                    var result = await ApproveMovie(requestModel);

                    if (result.IsError)
                    {
                        Logger.LogWarning("Tried auto sending movie but failed. Message: {0}", result.Message);
                        return(new RequestEngineResult
                        {
                            Message = result.Message,
                            ErrorMessage = result.Message,
                            Result = false
                        });
                    }

                    return(requestEngineResult);
                }

                // If there are no providers then it's successful but movie has not been sent
            }

            return(await AddMovieRequest(requestModel, fullMovieName));
        }