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' && (