Fixed: Use movie file from state for status label in add search results

This commit is contained in:
Bogdan 2024-01-14 03:36:02 +02:00
parent cc7104a814
commit 806b89abbe
6 changed files with 58 additions and 27 deletions

View File

@ -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);

View File

@ -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 &&
<MovieStatusLabel
hasMovieFiles={hasFile}
hasMovieFiles={hasMovieFile}
monitored={monitored}
isAvailable={isAvailable}
queueItem={queueItem}
@ -322,7 +323,6 @@ AddNewMovieSearchResult.propTypes = {
isSmallScreen: PropTypes.bool.isRequired,
id: PropTypes.number,
monitored: PropTypes.bool.isRequired,
hasFile: PropTypes.bool.isRequired,
isAvailable: PropTypes.bool.isRequired,
movieFile: PropTypes.object,
queueItem: PropTypes.object,

View File

@ -11,10 +11,12 @@ function createMapStateToProps() {
createExclusionMovieSelector(),
createDimensionsSelector(),
(state) => 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
};
}

View File

@ -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<MovieFile>
{
List<MovieFile> GetFilesByMovie(int movieId);
List<MovieFile> GetFilesByMovies(IEnumerable<int> movieIds);
List<MovieFile> GetFilesWithoutMediaInfo();
void DeleteForMovies(List<int> movieIds);
@ -25,6 +27,11 @@ namespace NzbDrone.Core.MediaFiles
return Query(x => x.MovieId == movieId);
}
public List<MovieFile> GetFilesByMovies(IEnumerable<int> movieIds)
{
return Query(x => movieIds.Contains(x.MovieId));
}
public List<MovieFile> GetFilesWithoutMediaInfo()
{
return Query(x => x.MediaInfo == null);

View File

@ -16,6 +16,7 @@ namespace NzbDrone.Core.MediaFiles
void Update(List<MovieFile> movieFile);
void Delete(MovieFile movieFile, DeleteMediaFileReason reason);
List<MovieFile> GetFilesByMovie(int movieId);
List<MovieFile> GetFilesByMovies(IEnumerable<int> movieIds);
List<MovieFile> GetFilesWithoutMediaInfo();
List<string> FilterExistingFiles(List<string> files, Movie movie);
MovieFile GetMovie(int id);
@ -80,6 +81,11 @@ namespace NzbDrone.Core.MediaFiles
return _mediaFileRepository.GetFilesByMovie(movieId);
}
public List<MovieFile> GetFilesByMovies(IEnumerable<int> movieIds)
{
return _mediaFileRepository.GetFilesByMovies(movieIds);
}
public List<MovieFile> GetFilesWithoutMediaInfo()
{
return _mediaFileRepository.GetFilesWithoutMediaInfo();

View File

@ -58,34 +58,26 @@ namespace Radarr.Api.V3.MovieFiles
[HttpGet]
[Produces("application/json")]
public List<MovieFileResource> GetMovieFiles(int? movieId, [FromQuery] List<int> movieFileIds)
public List<MovieFileResource> GetMovieFiles([FromQuery(Name = "movieId")] List<int> movieIds, [FromQuery] List<int> 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<MovieFileResource>();
}
return new List<MovieFileResource> { file.ToResource(movie, _qualityUpgradableSpecification, _formatCalculator) };
return new List<MovieFileResource>();
}
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]