mirror of
https://github.com/Radarr/Radarr.git
synced 2024-10-03 22:57:18 +02:00
Fixed: Use movie file from state for status label in add search results
This commit is contained in:
parent
cc7104a814
commit
806b89abbe
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
};
|
||||
}
|
||||
|
@ -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 @@ public List<MovieFile> GetFilesByMovie(int movieId)
|
||||
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);
|
||||
|
@ -16,6 +16,7 @@ public interface IMediaFileService
|
||||
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 @@ public List<MovieFile> GetFilesByMovie(int movieId)
|
||||
return _mediaFileRepository.GetFilesByMovie(movieId);
|
||||
}
|
||||
|
||||
public List<MovieFile> GetFilesByMovies(IEnumerable<int> movieIds)
|
||||
{
|
||||
return _mediaFileRepository.GetFilesByMovies(movieIds);
|
||||
}
|
||||
|
||||
public List<MovieFile> GetFilesWithoutMediaInfo()
|
||||
{
|
||||
return _mediaFileRepository.GetFilesWithoutMediaInfo();
|
||||
|
@ -58,34 +58,26 @@ protected override MovieFileResource GetResourceById(int id)
|
||||
|
||||
[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]
|
||||
|
Loading…
Reference in New Issue
Block a user