From 7ec8939cdf6e50717dc2cbd8f6022e5e5ff95762 Mon Sep 17 00:00:00 2001 From: tidusjar Date: Tue, 12 Apr 2022 10:27:36 +0100 Subject: [PATCH] Do not allow already available movies to be imported via the watchlist --- .../Request/ExistingPlexRequestRuleTests.cs | 42 +++++++++++++++++++ .../Rules/Request/ExistingPlexRequestRule.cs | 9 ++++ .../PlexWatchlistImportTests.cs | 4 +- .../Jobs/Plex/PlexWatchlistImport.cs | 29 ++++++------- 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/src/Ombi.Core.Tests/Rule/Request/ExistingPlexRequestRuleTests.cs b/src/Ombi.Core.Tests/Rule/Request/ExistingPlexRequestRuleTests.cs index 3cabfa438..314b543b8 100644 --- a/src/Ombi.Core.Tests/Rule/Request/ExistingPlexRequestRuleTests.cs +++ b/src/Ombi.Core.Tests/Rule/Request/ExistingPlexRequestRuleTests.cs @@ -1,6 +1,7 @@ using MockQueryable.Moq; using Moq; using NUnit.Framework; +using Ombi.Core.Engine; using Ombi.Core.Rule.Rules.Request; using Ombi.Store.Entities; using Ombi.Store.Entities.Requests; @@ -176,6 +177,47 @@ namespace Ombi.Core.Tests.Rule.Request Assert.That(result.Success, Is.True); } + [Test] + public async Task RequestMovie_IsSuccessful() + { + SetupMockData(); + + var req = new MovieRequests + { + RequestType = RequestType.Movie, + TheMovieDbId = 123, + Id = 1, + }; + var result = await Rule.Execute(req); + + + Assert.That(result.Success, Is.True); + } + + [Test] + public async Task RequestMovie_IsAlreadyAvailable() + { + var content = new List { + 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)); + } + private void SetupMockData() { var childRequests = new List diff --git a/src/Ombi.Core/Rule/Rules/Request/ExistingPlexRequestRule.cs b/src/Ombi.Core/Rule/Rules/Request/ExistingPlexRequestRule.cs index 40be1c73e..4f32c2eb8 100644 --- a/src/Ombi.Core/Rule/Rules/Request/ExistingPlexRequestRule.cs +++ b/src/Ombi.Core/Rule/Rules/Request/ExistingPlexRequestRule.cs @@ -54,6 +54,15 @@ namespace Ombi.Core.Rule.Rules.Request // looks like we have a match on the TVDbID return CheckExistingContent(tvRequest, anyMovieDbMatches); } + if (obj.RequestType == RequestType.Movie) + { + var movie = (MovieRequests)obj; + var exists = _plexContent.GetAll().Where(x => x.Type == MediaType.Movie).Any(x => x.TheMovieDbId == movie.Id.ToString() || x.TheMovieDbId == movie.TheMovieDbId.ToString()); + if (exists) + { + return Fail(ErrorCode.AlreadyRequested, "This movie is already available." ); + } + } return Success(); } diff --git a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs index ec66b1cea..ff3af5018 100644 --- a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs +++ b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs @@ -267,7 +267,7 @@ namespace Ombi.Schedule.Tests _mocker.Verify(x => x.GetWatchlistMetadata("abc", It.IsAny(), It.IsAny()), Times.Once); _mocker.Verify(x => x.SetUser(It.Is(x => x.Id == "abc")), Times.Once); _mocker.Verify>(x => x.GetAll(), Times.Once); - _mocker.Verify>(x => x.Add(It.IsAny()), Times.Never); + _mocker.Verify>(x => x.Add(It.IsAny()), Times.Once); } [Test] @@ -316,7 +316,7 @@ namespace Ombi.Schedule.Tests _mocker.Verify(x => x.GetWatchlistMetadata("abc", It.IsAny(), It.IsAny()), Times.Once); _mocker.Verify(x => x.SetUser(It.Is(x => x.Id == "abc")), Times.Once); _mocker.Verify>(x => x.GetAll(), Times.Once); - _mocker.Verify>(x => x.Add(It.IsAny()), Times.Never); + _mocker.Verify>(x => x.Add(It.IsAny()), Times.Once); } [Test] diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs index 202287bf6..36a448130 100644 --- a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs +++ b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs @@ -124,24 +124,19 @@ namespace Ombi.Schedule.Jobs.Plex if (response.ErrorCode == ErrorCode.AlreadyRequested) { _logger.LogDebug($"Movie already requested for user '{user.UserName}'"); + await AddToHistory(theMovieDbId); return; } _logger.LogInformation($"Error adding title from PlexWatchlist for user '{user.UserName}'. Message: '{response.ErrorMessage}'"); } else { - // Add to the watchlist history - var history = new PlexWatchlistHistory - { - TmdbId = theMovieDbId.ToString() - }; - await _watchlistRepo.Add(history); - + await AddToHistory(theMovieDbId); + _logger.LogInformation($"Added title from PlexWatchlist for user '{user.UserName}'. {response.Message}"); } } - private async Task ProcessShow(int theMovieDbId, OmbiUser user) { _tvRequestEngine.SetUser(user); @@ -151,21 +146,27 @@ namespace Ombi.Schedule.Jobs.Plex if (response.ErrorCode == ErrorCode.AlreadyRequested) { _logger.LogDebug($"Show already requested for user '{user.UserName}'"); + await AddToHistory(theMovieDbId); return; } _logger.LogInformation($"Error adding title from PlexWatchlist for user '{user.UserName}'. Message: '{response.ErrorMessage}'"); } else { - // Add to the watchlist history - var history = new PlexWatchlistHistory - { - TmdbId = theMovieDbId.ToString() - }; - await _watchlistRepo.Add(history); + await AddToHistory(theMovieDbId); _logger.LogInformation($"Added title from PlexWatchlist for user '{user.UserName}'. {response.Message}"); } } + private async Task AddToHistory(int theMovieDbId) + { + + // Add to the watchlist history + var history = new PlexWatchlistHistory + { + TmdbId = theMovieDbId.ToString() + }; + await _watchlistRepo.Add(history); + } private async Task GetProviderIds(string authToken, Metadata movie, CancellationToken cancellationToken) {