pull/10380/merge
geogolem 1 month ago committed by GitHub
commit 77d8fa998a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -3,7 +3,7 @@ import React, { Component } from 'react';
import NumberInput from 'Components/Form/NumberInput';
import SelectInput from 'Components/Form/SelectInput';
import TextInput from 'Components/Form/TextInput';
import { IN_LAST, IN_NEXT, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes';
import { IN_LAST, IN_NEXT, IN_PAST, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes';
import isString from 'Utilities/String/isString';
import translate from 'Utilities/String/translate';
import { NAME } from './FilterBuilderRowValue';
@ -57,6 +57,12 @@ function isInFilter(filterType) {
);
}
function isPastFutureFilter(filterType) {
return (
filterType === IN_PAST
);
}
class DateFilterBuilderRowValue extends Component {
//
@ -187,6 +193,10 @@ class DateFilterBuilderRowValue extends Component {
);
}
if (isPastFutureFilter(filterType)) {
return null;
}
return (
<TextInput
name={NAME}

@ -34,7 +34,8 @@ export const possibleFilterTypes = {
{ key: filterTypes.IN_LAST, value: 'in the last' },
{ key: filterTypes.NOT_IN_LAST, value: 'not in the last' },
{ key: filterTypes.IN_NEXT, value: 'in the next' },
{ key: filterTypes.NOT_IN_NEXT, value: 'not in the next' }
{ key: filterTypes.NOT_IN_NEXT, value: 'not in the next' },
{ key: filterTypes.IN_PAST, value: 'before today' }
],
[EQUAL]: [

@ -8,6 +8,7 @@ export const IN_NEXT = 'inNext';
export const NOT_IN_NEXT = 'notInNext';
export const LESS_THAN = 'lessThan';
export const LESS_THAN_OR_EQUAL = 'lessThanOrEqual';
export const IN_PAST = 'inPast';
export const NOT_CONTAINS = 'notContains';
export const NOT_EQUAL = 'notEqual';
export const STARTS_WITH = 'startsWith';
@ -22,6 +23,7 @@ export const all = [
GREATER_THAN_OR_EQUAL,
LESS_THAN,
LESS_THAN_OR_EQUAL,
IN_PAST,
NOT_CONTAINS,
NOT_EQUAL,
IN_LAST,

@ -73,6 +73,7 @@ function MovieIndexOverview(props: MovieIndexOverviewProps) {
tags,
hasFile,
isAvailable,
dateConsideredAvailable,
tmdbId,
imdbId,
studio,
@ -165,6 +166,7 @@ function MovieIndexOverview(props: MovieIndexOverviewProps) {
monitored={monitored}
hasFile={hasFile}
isAvailable={isAvailable}
dateConsideredAvailable={dateConsideredAvailable}
status={status}
width={posterWidth}
detailedProgressBar={overviewOptions.detailedProgressBar}

@ -77,6 +77,7 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
studio,
added,
year,
dateConsideredAvailable,
inCinemas,
physicalRelease,
digitalRelease,
@ -219,6 +220,7 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
monitored={monitored}
hasFile={hasFile}
isAvailable={isAvailable}
dateConsideredAvailable={dateConsideredAvailable}
status={status}
width={posterWidth}
detailedProgressBar={detailedProgressBar}

@ -18,6 +18,7 @@ interface MovieIndexProgressBarProps {
status: MovieStatus;
hasFile: boolean;
isAvailable: boolean;
dateConsideredAvailable: string;
width: number;
detailedProgressBar: boolean;
bottomRadius?: boolean;
@ -32,6 +33,7 @@ function MovieIndexProgressBar(props: MovieIndexProgressBarProps) {
status,
hasFile,
isAvailable,
dateConsideredAvailable,
width,
detailedProgressBar,
bottomRadius,
@ -76,6 +78,7 @@ function MovieIndexProgressBar(props: MovieIndexProgressBarProps) {
showText={detailedProgressBar}
width={width}
text={queueStatusText ? queueStatusText : movieStatus}
title={movieStatus === 'NotAvailable' ? dateConsideredAvailable : ''}
/>
);
}

@ -79,6 +79,7 @@ function MovieIndexRow(props: MovieIndexRowProps) {
tmdbId,
imdbId,
isAvailable,
dateConsideredAvailable,
hasFile,
movieFile,
youTubeTrailerId,
@ -352,6 +353,7 @@ function MovieIndexRow(props: MovieIndexRowProps) {
monitored={monitored}
hasFile={hasFile}
isAvailable={isAvailable}
dateConsideredAvailable={dateConsideredAvailable}
status={status}
width={125}
detailedProgressBar={true}

@ -83,6 +83,7 @@ interface Movie extends ModelBase {
grabbed?: boolean;
lastSearchTime?: string;
isAvailable: boolean;
dateConsideredAvailable: string;
isSaving?: boolean;
}

@ -467,6 +467,12 @@ export const defaultState = {
type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL
},
{
name: 'dateConsideredAvailable',
label: translate('DateConsideredAvailable'),
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'minimumAvailability',
label: () => translate('MinimumAvailability'),
@ -508,6 +514,12 @@ export const defaultState = {
label: () => translate('Popularity'),
type: filterBuilderTypes.NUMBER
},
{
name: 'minimumAvailabilityDate',
label: translate('MinimumAvailabilityDate'),
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'certification',
label: () => translate('Certification'),

@ -152,6 +152,14 @@ export const filterPredicates = {
return dateFilterPredicate(item.physicalRelease, filterValue, type);
},
dateConsideredAvailable: function(item, filterValue, type) {
return dateFilterPredicate(item.dateConsideredAvailable, filterValue, type);
},
minimumAvailabilityDate: function(item, filterValue, type) {
return dateFilterPredicate(item.minimumAvailabilityDate, filterValue, type);
},
digitalRelease: function(item, filterValue, type) {
return dateFilterPredicate(item.digitalRelease, filterValue, type);
},

@ -310,12 +310,24 @@ export const defaultState = {
type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL
},
{
name: 'dateConsideredAvailable',
label: translate('DateConsideredAvailable'),
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'minimumAvailability',
label: () => translate('MinimumAvailability'),
type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.MINIMUM_AVAILABILITY
},
{
name: 'minimumAvailabilityDate',
label: translate('MinimumAvailabilityDate'),
type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE
},
{
name: 'title',
label: () => translate('Title'),

@ -37,6 +37,9 @@ export default function(itemValue, filterValue, type) {
isAfter(itemValue, { [filterValue.time]: filterValue.value })
);
case filterTypes.IN_PAST:
return moment(itemValue).isBefore(new Date());
default:
return false;
}

@ -301,6 +301,7 @@
"Database": "Database",
"DatabaseMigration": "Database Migration",
"Date": "Date",
"DateConsideredAvailable": "Date Considered Available",
"Dates": "Dates",
"Day": "Day",
"DayOfWeekAt": "{day} at {time}",
@ -995,6 +996,7 @@
"MinimumAge": "Minimum Age",
"MinimumAgeHelpText": "Usenet only: Minimum age in minutes of NZBs before they are grabbed. Use this to give new releases time to propagate to your usenet provider.",
"MinimumAvailability": "Minimum Availability",
"MinimumAvailabilityDate": "Minimum Availability Date",
"MinimumCustomFormatScore": "Minimum Custom Format Score",
"MinimumCustomFormatScoreHelpText": "Minimum custom format score allowed to download",
"MinimumCustomFormatScoreIncrement": "Minimum Custom Format Score Increment",

@ -76,70 +76,40 @@ namespace NzbDrone.Core.Movies
public bool IsAvailable(int delay = 0)
{
// the below line is what was used before delay was implemented, could still be used for cases when delay==0
// return (Status >= MinimumAvailability || (MinimumAvailability == MovieStatusType.PreDB && Status >= MovieStatusType.Released));
// This more complex sequence handles the delay
DateTime minimumAvailabilityDate;
return DateTime.UtcNow >= GetReleaseDate(delay, true);
}
public DateTime? GetReleaseDate(int delay = 0, bool isAvailabilityCheck = false)
{
if (MinimumAvailability is MovieStatusType.TBA or MovieStatusType.Announced)
{
minimumAvailabilityDate = DateTime.MinValue;
}
else if (MinimumAvailability == MovieStatusType.InCinemas && MovieMetadata.Value.InCinemas.HasValue)
{
minimumAvailabilityDate = MovieMetadata.Value.InCinemas.Value;
}
else
{
if (MovieMetadata.Value.PhysicalRelease.HasValue && MovieMetadata.Value.DigitalRelease.HasValue)
{
minimumAvailabilityDate = new DateTime(Math.Min(MovieMetadata.Value.PhysicalRelease.Value.Ticks, MovieMetadata.Value.DigitalRelease.Value.Ticks));
}
else if (MovieMetadata.Value.PhysicalRelease.HasValue)
if (isAvailabilityCheck)
{
minimumAvailabilityDate = MovieMetadata.Value.PhysicalRelease.Value;
return DateTime.MinValue;
}
else if (MovieMetadata.Value.DigitalRelease.HasValue)
else if (MovieMetadata.Value.InCinemas.HasValue || MovieMetadata.Value.DigitalRelease.HasValue || MovieMetadata.Value.PhysicalRelease.HasValue)
{
minimumAvailabilityDate = MovieMetadata.Value.DigitalRelease.Value;
}
else
{
minimumAvailabilityDate = MovieMetadata.Value.InCinemas?.AddDays(90) ?? DateTime.MaxValue;
return new[] { MovieMetadata.Value.InCinemas, MovieMetadata.Value.DigitalRelease, MovieMetadata.Value.PhysicalRelease }
.Where(x => x.HasValue)
.Min()?.AddDays(delay);
}
}
if (minimumAvailabilityDate == DateTime.MinValue || minimumAvailabilityDate == DateTime.MaxValue)
else if (MinimumAvailability == MovieStatusType.InCinemas && MovieMetadata.Value.InCinemas.HasValue)
{
return DateTime.UtcNow >= minimumAvailabilityDate;
return MovieMetadata.Value.InCinemas.Value.AddDays(delay);
}
return DateTime.UtcNow >= minimumAvailabilityDate.AddDays(delay);
}
public DateTime? GetReleaseDate()
{
if (MinimumAvailability is MovieStatusType.TBA or MovieStatusType.Announced)
else if (MovieMetadata.Value.DigitalRelease.HasValue || MovieMetadata.Value.PhysicalRelease.HasValue)
{
return new[] { MovieMetadata.Value.InCinemas, MovieMetadata.Value.DigitalRelease, MovieMetadata.Value.PhysicalRelease }
return new[] { MovieMetadata.Value.DigitalRelease, MovieMetadata.Value.PhysicalRelease }
.Where(x => x.HasValue)
.Min();
.Min()?.AddDays(delay);
}
if (MinimumAvailability == MovieStatusType.InCinemas && MovieMetadata.Value.InCinemas.HasValue)
{
return MovieMetadata.Value.InCinemas.Value;
}
if (MovieMetadata.Value.DigitalRelease.HasValue || MovieMetadata.Value.PhysicalRelease.HasValue)
else if (!MovieMetadata.Value.InCinemas.HasValue && isAvailabilityCheck)
{
return new[] { MovieMetadata.Value.DigitalRelease, MovieMetadata.Value.PhysicalRelease }
.Where(x => x.HasValue)
.Min();
return DateTime.MaxValue;
}
return MovieMetadata.Value.InCinemas?.AddDays(90);
return MovieMetadata.Value.InCinemas?.AddDays(90 + delay);
}
public override string ToString()

@ -64,7 +64,9 @@ namespace Radarr.Api.V3.Movies
// Editing Only
public bool Monitored { get; set; }
public MovieStatusType MinimumAvailability { get; set; }
public DateTime? MinimumAvailabilityDate { get; set; }
public bool IsAvailable { get; set; }
public DateTime? DateConsideredAvailable { get; set; }
public string FolderName { get; set; }
public int Runtime { get; set; }
@ -143,6 +145,8 @@ namespace Radarr.Api.V3.Movies
MinimumAvailability = model.MinimumAvailability,
IsAvailable = model.IsAvailable(availDelay),
DateConsideredAvailable = model.GetReleaseDate(availDelay),
MinimumAvailabilityDate = model.GetReleaseDate(),
FolderName = model.FolderName(),
Runtime = model.MovieMetadata.Value.Runtime,

Loading…
Cancel
Save