From 806b89abbe5421124689bbc76cea1efd6faf8495 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 14 Jan 2024 03:36:02 +0200 Subject: [PATCH] Fixed: Use movie file from state for status label in add search results --- .../AddNewMovie/AddNewMovieConnector.js | 27 ++++++++++++++-- .../AddNewMovie/AddNewMovieSearchResult.js | 8 ++--- .../AddNewMovieSearchResultConnector.js | 5 ++- .../MediaFiles/MediaFileRepository.cs | 7 ++++ .../MediaFiles/MediaFileService.cs | 6 ++++ .../MovieFiles/MovieFileController.cs | 32 +++++++------------ 6 files changed, 58 insertions(+), 27 deletions(-) diff --git a/frontend/src/AddMovie/AddNewMovie/AddNewMovieConnector.js b/frontend/src/AddMovie/AddNewMovie/AddNewMovieConnector.js index 238c10d43..c4dbaabbe 100644 --- a/frontend/src/AddMovie/AddNewMovie/AddNewMovieConnector.js +++ b/frontend/src/AddMovie/AddNewMovie/AddNewMovieConnector.js @@ -3,10 +3,13 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { clearAddMovie, lookupMovie } from 'Store/Actions/addMovieActions'; +import { clearMovieFiles, fetchMovieFiles } from 'Store/Actions/movieFileActions'; import { clearQueueDetails, fetchQueueDetails } from 'Store/Actions/queueActions'; import { fetchRootFolders } from 'Store/Actions/rootFolderActions'; import { fetchImportExclusions } from 'Store/Actions/Settings/importExclusions'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; +import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; +import selectUniqueIds from 'Utilities/Object/selectUniqueIds'; import parseUrl from 'Utilities/String/parseUrl'; import AddNewMovie from './AddNewMovie'; @@ -35,7 +38,9 @@ const mapDispatchToProps = { fetchRootFolders, fetchImportExclusions, fetchQueueDetails, - clearQueueDetails + clearQueueDetails, + fetchMovieFiles, + clearMovieFiles }; class AddNewMovieConnector extends Component { @@ -55,6 +60,20 @@ class AddNewMovieConnector extends Component { this.props.fetchQueueDetails(); } + componentDidUpdate(prevProps) { + const { + items + } = this.props; + + if (hasDifferentItems(prevProps.items, items)) { + const movieIds = selectUniqueIds(items, 'internalId'); + + if (movieIds.length) { + this.props.fetchMovieFiles({ movieId: movieIds }); + } + } + } + componentWillUnmount() { if (this._movieLookupTimeout) { clearTimeout(this._movieLookupTimeout); @@ -62,6 +81,7 @@ class AddNewMovieConnector extends Component { this.props.clearAddMovie(); this.props.clearQueueDetails(); + this.props.clearMovieFiles(); } // @@ -107,12 +127,15 @@ class AddNewMovieConnector extends Component { AddNewMovieConnector.propTypes = { term: PropTypes.string, + items: PropTypes.arrayOf(PropTypes.object).isRequired, lookupMovie: PropTypes.func.isRequired, clearAddMovie: PropTypes.func.isRequired, fetchRootFolders: PropTypes.func.isRequired, fetchImportExclusions: PropTypes.func.isRequired, fetchQueueDetails: PropTypes.func.isRequired, - clearQueueDetails: PropTypes.func.isRequired + clearQueueDetails: PropTypes.func.isRequired, + fetchMovieFiles: PropTypes.func.isRequired, + clearMovieFiles: PropTypes.func.isRequired }; export default connect(createMapStateToProps, mapDispatchToProps)(AddNewMovieConnector); diff --git a/frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.js b/frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.js index aa37a2963..e72f7695d 100644 --- a/frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.js +++ b/frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.js @@ -75,7 +75,6 @@ class AddNewMovieSearchResult extends Component { colorImpairedMode, id, monitored, - hasFile, isAvailable, movieFile, queueItem, @@ -88,6 +87,8 @@ class AddNewMovieSearchResult extends Component { isNewAddMovieModalOpen } = this.state; + const hasMovieFile = !!movieFile; + const linkProps = isExistingMovie ? { to: `/movie/${titleSlug}` } : { onPress: this.onPress }; const posterWidth = 167; const posterHeight = 250; @@ -126,7 +127,7 @@ class AddNewMovieSearchResult extends Component { movieId={existingMovieId} movieFile={movieFile} monitored={monitored} - hasFile={hasFile} + hasFile={hasMovieFile} status={status} width={posterWidth} detailedProgressBar={true} @@ -270,7 +271,7 @@ class AddNewMovieSearchResult extends Component { { isExistingMovie && isSmallScreen && state.queue.details.items, + (state) => state.movieFiles.items, (state, { internalId }) => internalId, (state) => state.settings.ui.item.movieRuntimeFormat, - (isExistingMovie, isExclusionMovie, dimensions, queueItems, internalId, movieRuntimeFormat) => { + (isExistingMovie, isExclusionMovie, dimensions, queueItems, movieFiles, internalId, movieRuntimeFormat) => { const queueItem = queueItems.find((item) => internalId > 0 && item.movieId === internalId); + const movieFile = movieFiles.find((item) => internalId > 0 && item.movieId === internalId); return { existingMovieId: internalId, @@ -22,6 +24,7 @@ function createMapStateToProps() { isExclusionMovie, isSmallScreen: dimensions.isSmallScreen, queueItem, + movieFile, movieRuntimeFormat }; } diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs index 088c95d5d..8cddd14fc 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using NzbDrone.Core.Datastore; using NzbDrone.Core.Messaging.Events; @@ -7,6 +8,7 @@ namespace NzbDrone.Core.MediaFiles public interface IMediaFileRepository : IBasicRepository { List GetFilesByMovie(int movieId); + List GetFilesByMovies(IEnumerable movieIds); List GetFilesWithoutMediaInfo(); void DeleteForMovies(List movieIds); @@ -25,6 +27,11 @@ namespace NzbDrone.Core.MediaFiles return Query(x => x.MovieId == movieId); } + public List GetFilesByMovies(IEnumerable movieIds) + { + return Query(x => movieIds.Contains(x.MovieId)); + } + public List GetFilesWithoutMediaInfo() { return Query(x => x.MediaInfo == null); diff --git a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs index 3c09f5fe4..11475d9e4 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaFileService.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaFileService.cs @@ -16,6 +16,7 @@ namespace NzbDrone.Core.MediaFiles void Update(List movieFile); void Delete(MovieFile movieFile, DeleteMediaFileReason reason); List GetFilesByMovie(int movieId); + List GetFilesByMovies(IEnumerable movieIds); List GetFilesWithoutMediaInfo(); List FilterExistingFiles(List files, Movie movie); MovieFile GetMovie(int id); @@ -80,6 +81,11 @@ namespace NzbDrone.Core.MediaFiles return _mediaFileRepository.GetFilesByMovie(movieId); } + public List GetFilesByMovies(IEnumerable movieIds) + { + return _mediaFileRepository.GetFilesByMovies(movieIds); + } + public List GetFilesWithoutMediaInfo() { return _mediaFileRepository.GetFilesWithoutMediaInfo(); diff --git a/src/Radarr.Api.V3/MovieFiles/MovieFileController.cs b/src/Radarr.Api.V3/MovieFiles/MovieFileController.cs index 9f256e51d..ad3acede5 100644 --- a/src/Radarr.Api.V3/MovieFiles/MovieFileController.cs +++ b/src/Radarr.Api.V3/MovieFiles/MovieFileController.cs @@ -58,34 +58,26 @@ namespace Radarr.Api.V3.MovieFiles [HttpGet] [Produces("application/json")] - public List GetMovieFiles(int? movieId, [FromQuery] List movieFileIds) + public List GetMovieFiles([FromQuery(Name = "movieId")] List movieIds, [FromQuery] List movieFileIds) { - if (!movieId.HasValue && !movieFileIds.Any()) + if (!movieIds.Any() && !movieFileIds.Any()) { throw new BadRequestException("movieId or movieFileIds must be provided"); } - if (movieId.HasValue) + var movieFiles = movieIds.Any() + ? _mediaFileService.GetFilesByMovies(movieIds) + : _mediaFileService.GetMovies(movieFileIds); + + if (movieFiles == null) { - var movie = _movieService.GetMovie(movieId.Value); - var file = _mediaFileService.GetFilesByMovie(movieId.Value).FirstOrDefault(); - - if (file == null) - { - return new List(); - } - - return new List { file.ToResource(movie, _qualityUpgradableSpecification, _formatCalculator) }; + return new List(); } - else - { - var movieFiles = _mediaFileService.GetMovies(movieFileIds); - return movieFiles.GroupBy(e => e.MovieId) - .SelectMany(f => f.ToList() - .ConvertAll(e => e.ToResource(_movieService.GetMovie(f.Key), _qualityUpgradableSpecification, _formatCalculator))) - .ToList(); - } + return movieFiles.GroupBy(e => e.MovieId) + .SelectMany(f => f.ToList() + .ConvertAll(e => e.ToResource(_movieService.GetMovie(f.Key), _qualityUpgradableSpecification, _formatCalculator))) + .ToList(); } [RestPutById]