diff --git a/packages/core/src/db/schemas.ts b/packages/core/src/db/schemas.ts index 24dc472b..6fb09c8f 100644 --- a/packages/core/src/db/schemas.ts +++ b/packages/core/src/db/schemas.ts @@ -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({ diff --git a/packages/core/src/streams/filterer.ts b/packages/core/src/streams/filterer.ts index 283848fb..17e0f377 100644 --- a/packages/core/src/streams/filterer.ts +++ b/packages/core/src/streams/filterer.ts @@ -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); } diff --git a/packages/frontend/src/components/menu/filters.tsx b/packages/frontend/src/components/menu/filters.tsx index 9968f17b..7faaa8a1 100644 --- a/packages/frontend/src/components/menu/filters.tsx +++ b/packages/frontend/src/components/menu/filters.tsx @@ -2358,17 +2358,17 @@ function Content() {

- 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.

{ 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 }, + }, + })); + }} /> @@ -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, + }, + }, + }, + })); + }} /> ))}
@@ -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({ + + {/* Anime Series Slider */} +
+
Anime Series
+
+
+ + newValue !== undefined && + newValue?.[0] !== undefined && + newValue?.[1] !== undefined && + onAnimeChange([newValue[0], newValue[1]]) + } + minStepsBetweenThumbs={1} + label="Anime Series Size Range" + help={help} + /> +
+ {formatBytes(animeValue[0])} + {formatBytes(animeValue[1])} +
+
+
+ + newValue !== undefined && + onAnimeChange([newValue, animeValue[1]]) + } + /> + + newValue !== undefined && + onAnimeChange([animeValue[0], newValue]) + } + /> +
+
+
); }