New: View, Sort, Filter by Movie popularity on Index and Discover

Fixes #1947
pull/8794/head
Qstick 1 year ago
parent 2d18e4f89e
commit 4a66a832b3

@ -39,6 +39,12 @@
flex: 0 0 90px; flex: 0 0 90px;
} }
.popularity {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 100px;
}
.lists { .lists {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';

@ -11,6 +11,7 @@ interface CssExports {
'lists': string; 'lists': string;
'originalLanguage': string; 'originalLanguage': string;
'physicalRelease': string; 'physicalRelease': string;
'popularity': string;
'ratings': string; 'ratings': string;
'runtime': string; 'runtime': string;
'sortTitle': string; 'sortTitle': string;

@ -64,6 +64,12 @@
flex: 0 0 90px; flex: 0 0 90px;
} }
.popularity {
composes: cell;
flex: 0 0 100px;
}
.lists { .lists {
composes: cell; composes: cell;

@ -16,6 +16,7 @@ interface CssExports {
'lists': string; 'lists': string;
'originalLanguage': string; 'originalLanguage': string;
'physicalRelease': string; 'physicalRelease': string;
'popularity': string;
'ratings': string; 'ratings': string;
'runtime': string; 'runtime': string;
'sortTitle': string; 'sortTitle': string;

@ -13,6 +13,7 @@ import AddNewDiscoverMovieModal from 'DiscoverMovie/AddNewDiscoverMovieModal';
import ExcludeMovieModal from 'DiscoverMovie/Exclusion/ExcludeMovieModal'; import ExcludeMovieModal from 'DiscoverMovie/Exclusion/ExcludeMovieModal';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MoviePopularityIndex from 'Movie/MoviePopularityIndex';
import formatRuntime from 'Utilities/Date/formatRuntime'; import formatRuntime from 'Utilities/Date/formatRuntime';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import ListMovieStatusCell from './ListMovieStatusCell'; import ListMovieStatusCell from './ListMovieStatusCell';
@ -73,6 +74,7 @@ class DiscoverMovieRow extends Component {
images, images,
genres, genres,
ratings, ratings,
popularity,
certification, certification,
collection, collection,
columns, columns,
@ -261,6 +263,14 @@ class DiscoverMovieRow extends Component {
); );
} }
if (name === 'popularity') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
<MoviePopularityIndex popularity={popularity} />
</VirtualTableRowCell>
);
}
if (name === 'certification') { if (name === 'certification') {
return ( return (
<VirtualTableRowCell <VirtualTableRowCell
@ -384,6 +394,7 @@ DiscoverMovieRow.propTypes = {
runtime: PropTypes.number, runtime: PropTypes.number,
genres: PropTypes.arrayOf(PropTypes.string).isRequired, genres: PropTypes.arrayOf(PropTypes.string).isRequired,
ratings: PropTypes.object.isRequired, ratings: PropTypes.object.isRequired,
popularity: PropTypes.number.isRequired,
certification: PropTypes.string, certification: PropTypes.string,
collection: PropTypes.object, collection: PropTypes.object,
columns: PropTypes.arrayOf(PropTypes.object).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired,

@ -61,6 +61,7 @@ import {
faFileInvoice as farFileInvoice, faFileInvoice as farFileInvoice,
faFilm as fasFilm, faFilm as fasFilm,
faFilter as fasFilter, faFilter as fasFilter,
faFire as fasFire,
faFlag as fasFlag, faFlag as fasFlag,
faFolderOpen as fasFolderOpen, faFolderOpen as fasFolderOpen,
faForward as fasForward, faForward as fasForward,
@ -192,6 +193,7 @@ export const PAUSED = fasPause;
export const PENDING = farClock; export const PENDING = farClock;
export const PLAY = fasPlay; export const PLAY = fasPlay;
export const PROFILE = fasUser; export const PROFILE = fasUser;
export const POPULAR = fasFire;
export const POSTER = fasTh; export const POSTER = fasTh;
export const QUEUED = fasCloud; export const QUEUED = fasCloud;
export const QUICK = fasRocket; export const QUICK = fasRocket;

@ -118,6 +118,15 @@ function MovieIndexSortMenu(props: MovieIndexSortMenuProps) {
{translate('TmdbRating')} {translate('TmdbRating')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem
name="popularity"
sortKey={sortKey}
sortDirection={sortDirection}
onPress={onSortSelect}
>
{translate('Popularity')}
</SortMenuItem>
<SortMenuItem <SortMenuItem
name="path" name="path"
sortKey={sortKey} sortKey={sortKey}

@ -48,6 +48,7 @@
} }
.added, .added,
.popularity,
.runtime { .runtime {
composes: cell; composes: cell;

@ -18,6 +18,7 @@ interface CssExports {
'originalTitle': string; 'originalTitle': string;
'path': string; 'path': string;
'physicalRelease': string; 'physicalRelease': string;
'popularity': string;
'qualityProfileId': string; 'qualityProfileId': string;
'rottenTomatoesRating': string; 'rottenTomatoesRating': string;
'runtime': string; 'runtime': string;

@ -19,6 +19,7 @@ import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector'; import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
import createMovieIndexItemSelector from 'Movie/Index/createMovieIndexItemSelector'; import createMovieIndexItemSelector from 'Movie/Index/createMovieIndexItemSelector';
import MoviePopularityIndex from 'Movie/MoviePopularityIndex';
import MovieTitleLink from 'Movie/MovieTitleLink'; import MovieTitleLink from 'Movie/MovieTitleLink';
import { executeCommand } from 'Store/Actions/commandActions'; import { executeCommand } from 'Store/Actions/commandActions';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
@ -69,6 +70,7 @@ function MovieIndexRow(props: MovieIndexRowProps) {
sizeOnDisk, sizeOnDisk,
genres = [], genres = [],
ratings, ratings,
popularity,
certification, certification,
tags = [], tags = [],
tmdbId, tmdbId,
@ -362,6 +364,14 @@ function MovieIndexRow(props: MovieIndexRowProps) {
); );
} }
if (name === 'popularity') {
return (
<VirtualTableRowCell key={name} className={styles[name]}>
<MoviePopularityIndex popularity={popularity} />
</VirtualTableRowCell>
);
}
if (name === 'certification') { if (name === 'certification') {
return ( return (
<VirtualTableRowCell key={name} className={styles[name]}> <VirtualTableRowCell key={name} className={styles[name]}>

@ -41,6 +41,7 @@
} }
.added, .added,
.popularity,
.runtime { .runtime {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css'; composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';

@ -15,6 +15,7 @@ interface CssExports {
'originalTitle': string; 'originalTitle': string;
'path': string; 'path': string;
'physicalRelease': string; 'physicalRelease': string;
'popularity': string;
'qualityProfileId': string; 'qualityProfileId': string;
'rottenTomatoesRating': string; 'rottenTomatoesRating': string;
'runtime': string; 'runtime': string;

@ -49,6 +49,7 @@ interface Movie extends ModelBase {
sizeOnDisk: number; sizeOnDisk: number;
genres: string[]; genres: string[];
ratings: Ratings; ratings: Ratings;
popularity: number;
certification: string; certification: string;
tags: number[]; tags: number[];
images: Image[]; images: Image[];

@ -0,0 +1,5 @@
.popularityIcon {
margin-right: 2px;
width: 12px !important;
text-align: center;
}

@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'popularityIcon': string;
}
export const cssExports: CssExports;
export default cssExports;

@ -0,0 +1,23 @@
import React from 'react';
import Icon from 'Components/Icon';
import Label from 'Components/Label';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './MoviePopularityIndex.css';
interface MoviePopularityIndexProps {
popularity: number;
}
function MoviePopularityIndex(props: MoviePopularityIndexProps) {
const { popularity } = props;
return (
<Label kind={kinds.INVERSE} title={translate('PopularityIndex')}>
<Icon className={styles.popularityIcon} name={icons.POPULAR} size={11} />
{popularity.toFixed()}
</Label>
);
}
export default MoviePopularityIndex;

@ -148,6 +148,12 @@ export const defaultState = {
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{
name: 'popularity',
label: translate('Popularity'),
isSortable: true,
isVisible: false
},
{ {
name: 'certification', name: 'certification',
label: translate('Certification'), label: translate('Certification'),
@ -380,6 +386,11 @@ export const defaultState = {
label: translate('ImdbVotes'), label: translate('ImdbVotes'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{
name: 'popularity',
label: translate('Popularity'),
type: filterBuilderTypes.NUMBER
},
{ {
name: 'certification', name: 'certification',
label: 'Certification', label: 'Certification',

@ -191,6 +191,12 @@ export const defaultState = {
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{
name: 'popularity',
label: translate('Popularity'),
isSortable: true,
isVisible: false
},
{ {
name: 'certification', name: 'certification',
label: translate('Certification'), label: translate('Certification'),
@ -443,6 +449,11 @@ export const defaultState = {
label: translate('ImdbVotes'), label: translate('ImdbVotes'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{
name: 'popularity',
label: translate('Popularity'),
type: filterBuilderTypes.NUMBER
},
{ {
name: 'certification', name: 'certification',
label: translate('Certification'), label: translate('Certification'),

@ -732,6 +732,8 @@
"Permissions": "Permissions", "Permissions": "Permissions",
"PhysicalRelease": "Physical Release", "PhysicalRelease": "Physical Release",
"PhysicalReleaseDate": "Physical Release Date", "PhysicalReleaseDate": "Physical Release Date",
"Popularity": "Popularity",
"PopularityIndex": "Current Popularity Index",
"Port": "Port", "Port": "Port",
"PortNumber": "Port Number", "PortNumber": "Port Number",
"PosterOptions": "Poster Options", "PosterOptions": "Poster Options",

@ -36,6 +36,7 @@ namespace Radarr.Api.V3.ImportLists
public int TmdbId { get; set; } public int TmdbId { get; set; }
public string Folder { get; set; } public string Folder { get; set; }
public string Certification { get; set; } public string Certification { get; set; }
public float Popularity { get; set; }
public List<string> Genres { get; set; } public List<string> Genres { get; set; }
public Ratings Ratings { get; set; } public Ratings Ratings { get; set; }
public MovieCollection Collection { get; set; } public MovieCollection Collection { get; set; }
@ -78,6 +79,7 @@ namespace Radarr.Api.V3.ImportLists
Website = model.MovieMetadata.Value.Website, Website = model.MovieMetadata.Value.Website,
Genres = model.MovieMetadata.Value.Genres, Genres = model.MovieMetadata.Value.Genres,
Ratings = model.MovieMetadata.Value.Ratings, Ratings = model.MovieMetadata.Value.Ratings,
Popularity = model.MovieMetadata.Value.Popularity,
YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId, YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId,
Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId }, Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId },
Studio = model.MovieMetadata.Value.Studio Studio = model.MovieMetadata.Value.Studio
@ -115,6 +117,7 @@ namespace Radarr.Api.V3.ImportLists
Genres = model.MovieMetadata.Value.Genres, Genres = model.MovieMetadata.Value.Genres,
Ratings = model.MovieMetadata.Value.Ratings, Ratings = model.MovieMetadata.Value.Ratings,
YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId, YouTubeTrailerId = model.MovieMetadata.Value.YouTubeTrailerId,
Popularity = model.MovieMetadata.Value.Popularity,
Studio = model.MovieMetadata.Value.Studio, Studio = model.MovieMetadata.Value.Studio,
Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId }, Collection = new MovieCollection { Title = model.MovieMetadata.Value.CollectionTitle, TmdbId = model.MovieMetadata.Value.CollectionTmdbId },
Lists = new HashSet<int> { model.ListId } Lists = new HashSet<int> { model.ListId }

Loading…
Cancel
Save