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); }
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); }
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, }); }
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); }
/// <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); }
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 }); }
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)); }
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); }
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 }); }
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); }
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, }); }
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" }); }
public async Task <MovieRequests> UpdateRequest([FromBody] MovieRequests model) { return(await MovieRequestEngine.UpdateMovieRequest(model)); }
/// <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)); }
/// <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)); }