mirror of
https://github.com/morpheus65535/bazarr.git
synced 2024-09-20 07:25:58 +08:00
Added sonarr and radarr settings tags validation (#2634)
This commit is contained in:
parent
855da6b1bb
commit
0e876fcc93
|
@ -37,6 +37,12 @@ def validate_ip_address(ip_string):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def validate_tags(tags):
|
||||||
|
if not tags:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return all(re.match( r'^[a-z0-9_-]+$', item) for item in tags)
|
||||||
|
|
||||||
|
|
||||||
ONE_HUNDRED_YEARS_IN_MINUTES = 52560000
|
ONE_HUNDRED_YEARS_IN_MINUTES = 52560000
|
||||||
ONE_HUNDRED_YEARS_IN_HOURS = 876000
|
ONE_HUNDRED_YEARS_IN_HOURS = 876000
|
||||||
|
@ -178,7 +184,7 @@ validators = [
|
||||||
Validator('sonarr.only_monitored', must_exist=True, default=False, is_type_of=bool),
|
Validator('sonarr.only_monitored', must_exist=True, default=False, is_type_of=bool),
|
||||||
Validator('sonarr.series_sync', must_exist=True, default=60, is_type_of=int,
|
Validator('sonarr.series_sync', must_exist=True, default=60, is_type_of=int,
|
||||||
is_in=[15, 60, 180, 360, 720, 1440, 10080, ONE_HUNDRED_YEARS_IN_MINUTES]),
|
is_in=[15, 60, 180, 360, 720, 1440, 10080, ONE_HUNDRED_YEARS_IN_MINUTES]),
|
||||||
Validator('sonarr.excluded_tags', must_exist=True, default=[], is_type_of=list),
|
Validator('sonarr.excluded_tags', must_exist=True, default=[], is_type_of=list, condition=validate_tags),
|
||||||
Validator('sonarr.excluded_series_types', must_exist=True, default=[], is_type_of=list),
|
Validator('sonarr.excluded_series_types', must_exist=True, default=[], is_type_of=list),
|
||||||
Validator('sonarr.use_ffprobe_cache', must_exist=True, default=True, is_type_of=bool),
|
Validator('sonarr.use_ffprobe_cache', must_exist=True, default=True, is_type_of=bool),
|
||||||
Validator('sonarr.exclude_season_zero', must_exist=True, default=False, is_type_of=bool),
|
Validator('sonarr.exclude_season_zero', must_exist=True, default=False, is_type_of=bool),
|
||||||
|
@ -201,7 +207,7 @@ validators = [
|
||||||
Validator('radarr.only_monitored', must_exist=True, default=False, is_type_of=bool),
|
Validator('radarr.only_monitored', must_exist=True, default=False, is_type_of=bool),
|
||||||
Validator('radarr.movies_sync', must_exist=True, default=60, is_type_of=int,
|
Validator('radarr.movies_sync', must_exist=True, default=60, is_type_of=int,
|
||||||
is_in=[15, 60, 180, 360, 720, 1440, 10080, ONE_HUNDRED_YEARS_IN_MINUTES]),
|
is_in=[15, 60, 180, 360, 720, 1440, 10080, ONE_HUNDRED_YEARS_IN_MINUTES]),
|
||||||
Validator('radarr.excluded_tags', must_exist=True, default=[], is_type_of=list),
|
Validator('radarr.excluded_tags', must_exist=True, default=[], is_type_of=list, condition=validate_tags),
|
||||||
Validator('radarr.use_ffprobe_cache', must_exist=True, default=True, is_type_of=bool),
|
Validator('radarr.use_ffprobe_cache', must_exist=True, default=True, is_type_of=bool),
|
||||||
Validator('radarr.defer_search_signalr', must_exist=True, default=False, is_type_of=bool),
|
Validator('radarr.defer_search_signalr', must_exist=True, default=False, is_type_of=bool),
|
||||||
Validator('radarr.sync_only_monitored_movies', must_exist=True, default=False, is_type_of=bool),
|
Validator('radarr.sync_only_monitored_movies', must_exist=True, default=False, is_type_of=bool),
|
||||||
|
|
|
@ -54,6 +54,11 @@ const SettingsRadarrView: FunctionComponent = () => {
|
||||||
<Chips
|
<Chips
|
||||||
label="Excluded Tags"
|
label="Excluded Tags"
|
||||||
settingKey="settings-radarr-excluded_tags"
|
settingKey="settings-radarr-excluded_tags"
|
||||||
|
sanitizeFn={(values: string[] | null) =>
|
||||||
|
values?.map((item) =>
|
||||||
|
item.replace(/[^a-z0-9_-]/gi, "").toLowerCase(),
|
||||||
|
)
|
||||||
|
}
|
||||||
></Chips>
|
></Chips>
|
||||||
<Message>
|
<Message>
|
||||||
Movies with those tags (case sensitive) in Radarr will be excluded
|
Movies with those tags (case sensitive) in Radarr will be excluded
|
||||||
|
|
|
@ -56,6 +56,11 @@ const SettingsSonarrView: FunctionComponent = () => {
|
||||||
<Chips
|
<Chips
|
||||||
label="Excluded Tags"
|
label="Excluded Tags"
|
||||||
settingKey="settings-sonarr-excluded_tags"
|
settingKey="settings-sonarr-excluded_tags"
|
||||||
|
sanitizeFn={(values: string[] | null) =>
|
||||||
|
values?.map((item) =>
|
||||||
|
item.replace(/[^a-z0-9_-]/gi, "").toLowerCase(),
|
||||||
|
)
|
||||||
|
}
|
||||||
></Chips>
|
></Chips>
|
||||||
<Message>
|
<Message>
|
||||||
Episodes from series with those tags (case sensitive) in Sonarr will
|
Episodes from series with those tags (case sensitive) in Sonarr will
|
||||||
|
|
|
@ -160,13 +160,25 @@ export const Slider: FunctionComponent<SliderProps> = (props) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
type ChipsProp = BaseInput<string[]> &
|
type ChipsProp = BaseInput<string[]> &
|
||||||
Omit<ChipInputProps, "onChange" | "data">;
|
Omit<ChipInputProps, "onChange" | "data"> & {
|
||||||
|
sanitizeFn?: (values: string[] | null) => string[] | undefined;
|
||||||
|
};
|
||||||
|
|
||||||
export const Chips: FunctionComponent<ChipsProp> = (props) => {
|
export const Chips: FunctionComponent<ChipsProp> = (props) => {
|
||||||
const { value, update, rest } = useBaseInput(props);
|
const { value, update, rest } = useBaseInput(props);
|
||||||
|
|
||||||
|
const handleChange = (value: string[] | null) => {
|
||||||
|
const sanitizedValues = props.sanitizeFn?.(value) ?? value;
|
||||||
|
|
||||||
|
update(sanitizedValues || null);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ChipInput {...rest} value={value ?? []} onChange={update}></ChipInput>
|
<ChipInput
|
||||||
|
{...rest}
|
||||||
|
value={value ?? []}
|
||||||
|
onChange={handleChange}
|
||||||
|
></ChipInput>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue