From 4c7b28d7448f3f129cd8eecd9b0f677f0f60d87a Mon Sep 17 00:00:00 2001 From: Viren070 Date: Sat, 18 Oct 2025 22:47:13 +0100 Subject: [PATCH] feat: add exclude season packs option --- packages/core/src/db/schemas.ts | 1 + packages/core/src/streams/filterer.ts | 14 ++++++++++++++ .../src/components/menu/miscellaneous.tsx | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/packages/core/src/db/schemas.ts b/packages/core/src/db/schemas.ts index 19f599cb..6f7ad199 100644 --- a/packages/core/src/db/schemas.ts +++ b/packages/core/src/db/schemas.ts @@ -356,6 +356,7 @@ export const UserDataSchema = z.object({ .tuple([z.number().min(0), z.number().min(0)]) .optional(), seederRangeTypes: z.array(z.enum(['p2p', 'cached', 'uncached'])).optional(), + excludeSeasonPacks: z.boolean().optional(), excludeCached: z.boolean().optional(), excludeCachedFromAddons: z.array(z.string().min(1)).optional(), excludeCachedFromServices: z.array(z.string().min(1)).optional(), diff --git a/packages/core/src/streams/filterer.ts b/packages/core/src/streams/filterer.ts index 050f09bd..763c33e1 100644 --- a/packages/core/src/streams/filterer.ts +++ b/packages/core/src/streams/filterer.ts @@ -32,6 +32,7 @@ export interface FilterStatistics { titleMatching: Reason; yearMatching: Reason; seasonEpisodeMatching: Reason; + excludeSeasonPacks: Reason; excludedStreamType: Reason; requiredStreamType: Reason; excludedResolution: Reason; @@ -89,6 +90,7 @@ class StreamFilterer { titleMatching: { total: 0, details: {} }, yearMatching: { total: 0, details: {} }, seasonEpisodeMatching: { total: 0, details: {} }, + excludeSeasonPacks: { total: 0, details: {} }, excludedStreamType: { total: 0, details: {} }, requiredStreamType: { total: 0, details: {} }, excludedResolution: { total: 0, details: {} }, @@ -1168,6 +1170,18 @@ class StreamFilterer { return false; } + if ( + this.userData.excludeSeasonPacks && + stream.parsedFile?.season && + !stream.parsedFile?.episode + ) { + this.incrementRemovalReason( + 'excludeSeasonPacks', + `${stream.parsedFile.title} - ${stream.parsedFile.season}` + ); + return false; + } + if ( excludedRegexPatterns && (await testRegexes(stream, excludedRegexPatterns)) diff --git a/packages/frontend/src/components/menu/miscellaneous.tsx b/packages/frontend/src/components/menu/miscellaneous.tsx index 34e001cf..3c36ef1a 100644 --- a/packages/frontend/src/components/menu/miscellaneous.tsx +++ b/packages/frontend/src/components/menu/miscellaneous.tsx @@ -362,6 +362,24 @@ function Content() { /> )} + {mode === 'pro' && ( + + { + setUserData((prev) => ({ + ...prev, + excludeSeasonPacks: value, + })); + }} + /> + + )} {mode === 'pro' && (