New: HealthCheck and Status for Movies Deleted from TMDb

This commit is contained in:
Qstick
2020-02-25 23:18:49 -05:00
parent ea9494019e
commit 0c44ee5f88
18 changed files with 505 additions and 202 deletions

View File

@@ -190,6 +190,7 @@ export const SCORE = fasUserPlus;
export const SEARCH = fasSearch;
export const MOVIE_CONTINUING = fasPlay;
export const SERIES_ENDED = fasStop;
export const MOVIE_DELETED = fasExclamationTriangle;
export const SETTINGS = fasCogs;
export const SHUTDOWN = fasPowerOff;
export const SORT = fasSort;

View File

@@ -13,7 +13,7 @@ import MovieTitleLink from 'Movie/MovieTitleLink';
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal';
import MovieStatusCell from './MovieStatusCell';
import MovieStatusConnector from 'Movie/MovieStatusConnector';
import MovieFileStatusConnector from 'Movie/MovieFileStatusConnector';
import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell';
import styles from './MovieIndexRow.css';
@@ -278,7 +278,7 @@ class MovieIndexRow extends Component {
key={name}
className={styles[name]}
>
<MovieStatusConnector
<MovieFileStatusConnector
movieId={id}
/>
</VirtualTableRowCell>

View File

@@ -3,6 +3,7 @@ import React from 'react';
import { icons } from 'Helpers/Props';
import Icon from 'Components/Icon';
import VirtualTableRowCell from 'Components/Table/Cells/TableRowCell';
import { getMovieStatusDetails } from 'Movie/MovieStatus';
import styles from './MovieStatusCell.css';
function MovieStatusCell(props) {
@@ -14,6 +15,8 @@ function MovieStatusCell(props) {
...otherProps
} = props;
const statusDetails = getMovieStatusDetails(status);
return (
<Component
className={className}
@@ -25,32 +28,12 @@ function MovieStatusCell(props) {
title={monitored ? 'Movie is monitored' : 'Movie is unmonitored'}
/>
{
status === 'announced' ?
<Icon
className={styles.statusIcon}
name={icons.ANNOUNCED}
title={'Movie is announced'}
/> : null
}
<Icon
className={styles.statusIcon}
name={statusDetails.icon}
title={`${statusDetails.title}: ${statusDetails.message}`}
/>
{
status === 'inCinemas' ?
<Icon
className={styles.statusIcon}
name={icons.IN_CINEMAS}
title={'Movie is in Cinemas'}
/> : null
}
{
status === 'released' ?
<Icon
className={styles.statusIcon}
name={icons.MOVIE_FILE}
title={'Movie is released'}
/> : null
}
</Component>
);
}

View File

@@ -0,0 +1,124 @@
import PropTypes from 'prop-types';
import React from 'react';
import { icons, kinds, sizes } from 'Helpers/Props';
import Icon from 'Components/Icon';
import ProgressBar from 'Components/ProgressBar';
import QueueDetails from 'Activity/Queue/QueueDetails';
import MovieQuality from 'Movie/MovieQuality';
import Label from 'Components/Label';
import styles from './MovieFileStatus.css';
function MovieFileStatus(props) {
const {
inCinemas,
isAvailable,
monitored,
grabbed,
queueItem,
movieFile
} = props;
const hasMovieFile = !!movieFile;
const isQueued = !!queueItem;
const hasReleased = isAvailable && inCinemas;
if (isQueued) {
const {
sizeleft,
size
} = queueItem;
const progress = (100 - sizeleft / size * 100);
return (
<div className={styles.center}>
<QueueDetails
{...queueItem}
progressBar={
<ProgressBar
title={`Movie is downloading - ${progress.toFixed(1)}% ${queueItem.title}`}
progress={progress}
kind={kinds.PURPLE}
size={sizes.MEDIUM}
/>
}
/>
</div>
);
}
if (grabbed) {
return (
<div className={styles.center}>
<Icon
name={icons.DOWNLOADING}
title="Movie is downloading"
/>
</div>
);
}
if (hasMovieFile) {
const quality = movieFile.quality;
return (
<div className={styles.center}>
<MovieQuality
title={quality.quality.name}
size={movieFile.size}
quality={quality}
isMonitored={monitored}
isCutoffNotMet={movieFile.qualityCutoffNotMet}
/>
</div>
);
}
if (!monitored) {
return (
<div className={styles.center}>
<Label
title="Announced"
kind={kinds.WARNING}
>
Not Monitored
</Label>
</div>
);
}
if (hasReleased) {
return (
<div className={styles.center}>
<Label
title="Movie Available, but Missing"
kind={kinds.DANGER}
>
Missing
</Label>
</div>
);
}
return (
<div className={styles.center}>
<Label
title="Announced"
kind={kinds.INFO}
>
Not Available
</Label>
</div>
);
}
MovieFileStatus.propTypes = {
inCinemas: PropTypes.string,
isAvailable: PropTypes.bool,
monitored: PropTypes.bool.isRequired,
grabbed: PropTypes.bool,
queueItem: PropTypes.object,
movieFile: PropTypes.object
};
export default MovieFileStatus;

View File

@@ -5,7 +5,7 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createMovieSelector from 'Store/Selectors/createMovieSelector';
import createQueueItemSelector from 'Store/Selectors/createQueueItemSelector';
import MovieStatus from './MovieStatus';
import MovieFileStatus from './MovieFileStatus';
function createMapStateToProps() {
return createSelector(
@@ -30,22 +30,22 @@ function createMapStateToProps() {
const mapDispatchToProps = {
};
class MovieStatusConnector extends Component {
class MovieFileStatusConnector extends Component {
//
// Render
render() {
return (
<MovieStatus
<MovieFileStatus
{...this.props}
/>
);
}
}
MovieStatusConnector.propTypes = {
MovieFileStatusConnector.propTypes = {
movieId: PropTypes.number.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(MovieStatusConnector);
export default connect(createMapStateToProps, mapDispatchToProps)(MovieFileStatusConnector);

View File

@@ -1,124 +1,32 @@
import PropTypes from 'prop-types';
import React from 'react';
import { icons, kinds, sizes } from 'Helpers/Props';
import Icon from 'Components/Icon';
import ProgressBar from 'Components/ProgressBar';
import QueueDetails from 'Activity/Queue/QueueDetails';
import MovieQuality from 'Movie/MovieQuality';
import Label from 'Components/Label';
import styles from './MovieStatus.css';
import { icons } from 'Helpers/Props';
function MovieStatus(props) {
const {
inCinemas,
isAvailable,
monitored,
grabbed,
queueItem,
movieFile
} = props;
export function getMovieStatusDetails(status) {
const hasMovieFile = !!movieFile;
const isQueued = !!queueItem;
const hasReleased = isAvailable && inCinemas;
let statusDetails = {
icon: icons.ANNOUNCED,
title: 'Announced',
message: 'Movie is announced'
};
if (isQueued) {
const {
sizeleft,
size
} = queueItem;
const progress = (100 - sizeleft / size * 100);
return (
<div className={styles.center}>
<QueueDetails
{...queueItem}
progressBar={
<ProgressBar
title={`Movie is downloading - ${progress.toFixed(1)}% ${queueItem.title}`}
progress={progress}
kind={kinds.PURPLE}
size={sizes.MEDIUM}
/>
}
/>
</div>
);
if (status === 'deleted') {
statusDetails = {
icon: icons.MOVIE_DELETED,
title: 'Deleted',
message: 'Movie was deleted from TMDb'
};
} else if (status === 'inCinemas') {
statusDetails = {
icon: icons.IN_CINEMAS,
title: 'In Cinemas',
message: 'Movie is in Cinemas'
};
} else if (status === 'released') {
statusDetails = {
icon: icons.MOVIE_FILE,
title: 'Released',
message: 'Movie is released'
};
}
if (grabbed) {
return (
<div className={styles.center}>
<Icon
name={icons.DOWNLOADING}
title="Movie is downloading"
/>
</div>
);
}
if (hasMovieFile) {
const quality = movieFile.quality;
return (
<div className={styles.center}>
<MovieQuality
title={quality.quality.name}
size={movieFile.size}
quality={quality}
isMonitored={monitored}
isCutoffNotMet={movieFile.qualityCutoffNotMet}
/>
</div>
);
}
if (!monitored) {
return (
<div className={styles.center}>
<Label
title="Announced"
kind={kinds.WARNING}
>
Not Monitored
</Label>
</div>
);
}
if (hasReleased) {
return (
<div className={styles.center}>
<Label
title="Movie Available, but Missing"
kind={kinds.DANGER}
>
Missing
</Label>
</div>
);
}
return (
<div className={styles.center}>
<Label
title="Announced"
kind={kinds.INFO}
>
Not Available
</Label>
</div>
);
return statusDetails;
}
MovieStatus.propTypes = {
inCinemas: PropTypes.string,
isAvailable: PropTypes.bool,
monitored: PropTypes.bool.isRequired,
grabbed: PropTypes.bool,
queueItem: PropTypes.object,
movieFile: PropTypes.object
};
export default MovieStatus;