mirror of
https://github.com/Viren070/AIOStreams.git
synced 2025-12-01 23:14:04 +01:00
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:
@@ -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({
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user