feat: add separate size filter for anime content (#483)

* feat: add separate size filter for anime content

* fix: limit anime size filter to series only
This commit is contained in:
cats
2025-11-30 06:24:27 +03:00
committed by GitHub
parent 1e06ad987a
commit ff168cf255
3 changed files with 100 additions and 3 deletions
+3
View File
@@ -82,6 +82,9 @@ const SizeFilter = z.object({
// max: z.number().min(1).optional(),
// })
.optional(),
anime: z
.tuple([z.number().min(0), z.number().min(0)])
.optional(),
});
const SizeFilterOptions = z.object({
+4
View File
@@ -1606,6 +1606,10 @@ class StreamFilterer {
normaliseSizeRange(global?.movies);
} else {
minMax =
(isAnime
? normaliseSizeRange(resolution?.anime) ||
normaliseSizeRange(global?.anime)
: undefined) ||
normaliseSizeRange(resolution?.series) ||
normaliseSizeRange(global?.series);
}
@@ -2358,17 +2358,17 @@ function Content() {
<HeadingWithPageControls heading="Size" />
<div className="mb-4">
<p className="text-sm text-[--muted]">
Set minimum and maximum size limits for movies and series. You
Set minimum and maximum size limits for movies, series, and anime series. You
can set a global limit, and also choose to set specific limits
for each resolution. For a given stream, only one set of size
filters would be used. A resolution specific limit takes
priority.
priority. Anime series limits take precedence over regular series limits.
</p>
</div>
<div className="space-y-4">
<SettingsCard
title="Global"
description="Apply size filters for movies and series"
description="Apply size filters for movies, series, and anime series"
>
<SizeRangeSlider
label="Global Size Limits"
@@ -2379,6 +2379,9 @@ function Content() {
seriesValue={
userData.size?.global?.series || [MIN_SIZE, MAX_SIZE]
}
animeValue={
userData.size?.global?.anime || [MIN_SIZE, MAX_SIZE]
}
onMoviesChange={(value) => {
setUserData((prev: any) => ({
...prev,
@@ -2397,6 +2400,15 @@ function Content() {
},
}));
}}
onAnimeChange={(value) => {
setUserData((prev: any) => ({
...prev,
size: {
...prev.size,
global: { ...prev.size?.global, anime: value },
},
}));
}}
/>
</SettingsCard>
@@ -2423,6 +2435,12 @@ function Content() {
MAX_SIZE,
]
}
animeValue={
userData.size?.resolution?.[resolution]?.anime || [
MIN_SIZE,
MAX_SIZE,
]
}
onMoviesChange={(value) => {
setUserData((prev: any) => ({
...prev,
@@ -2453,6 +2471,21 @@ function Content() {
},
}));
}}
onAnimeChange={(value) => {
setUserData((prev: any) => ({
...prev,
size: {
...prev.size,
resolution: {
...prev.size?.resolution,
[resolution]: {
...prev.size?.resolution?.[resolution],
anime: value,
},
},
},
}));
}}
/>
))}
</div>
@@ -3543,8 +3576,10 @@ interface SizeRangeSliderProps {
help?: string;
moviesValue: [number, number];
seriesValue: [number, number];
animeValue: [number, number];
onMoviesChange: (value: [number, number]) => void;
onSeriesChange: (value: [number, number]) => void;
onAnimeChange: (value: [number, number]) => void;
min?: number;
max?: number;
}
@@ -3562,8 +3597,10 @@ function SizeRangeSlider({
help,
moviesValue,
seriesValue,
animeValue,
onMoviesChange,
onSeriesChange,
onAnimeChange,
min = MIN_SIZE,
max = MAX_SIZE,
}: SizeRangeSliderProps) {
@@ -3676,6 +3713,59 @@ function SizeRangeSlider({
</div>
</div>
</div>
{/* Anime Series Slider */}
<div className="space-y-2">
<h5 className="text-sm font-medium text-[--muted]">Anime Series</h5>
<div className="flex flex-col md:flex-row gap-4">
<div className="flex-1 min-w-0">
<Slider
min={min}
max={max}
step={max / 1000}
defaultValue={[min, max]}
value={animeValue}
onValueChange={(newValue) =>
newValue !== undefined &&
newValue?.[0] !== undefined &&
newValue?.[1] !== undefined &&
onAnimeChange([newValue[0], newValue[1]])
}
minStepsBetweenThumbs={1}
label="Anime Series Size Range"
help={help}
/>
<div className="flex justify-between mt-1 text-xs text-[--muted]">
<span>{formatBytes(animeValue[0])}</span>
<span>{formatBytes(animeValue[1])}</span>
</div>
</div>
<div className="flex gap-2 md:w-[240px] shrink-0">
<NumberInput
label="Min"
step={max / 1000}
value={animeValue[0]}
min={min}
max={animeValue[1]}
onValueChange={(newValue) =>
newValue !== undefined &&
onAnimeChange([newValue, animeValue[1]])
}
/>
<NumberInput
label="Max"
step={max / 1000}
value={animeValue[1]}
min={animeValue[0]}
max={max}
onValueChange={(newValue) =>
newValue !== undefined &&
onAnimeChange([animeValue[0], newValue])
}
/>
</div>
</div>
</div>
</div>
);
}