From b7280a97eb34fb0ea6660f563f263885a53e3244 Mon Sep 17 00:00:00 2001 From: Viren070 Date: Sun, 28 Sep 2025 15:24:50 +0100 Subject: [PATCH] feat: add `allAddons` variable to dynamic exit condition and add placeholder exit conditions --- packages/core/src/parser/streamExpression.ts | 12 ++++++++++-- packages/core/src/streams/fetcher.ts | 6 +++++- .../frontend/src/components/menu/addons.tsx | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/core/src/parser/streamExpression.ts b/packages/core/src/parser/streamExpression.ts index b88d6764..9b184f4f 100644 --- a/packages/core/src/parser/streamExpression.ts +++ b/packages/core/src/parser/streamExpression.ts @@ -615,13 +615,15 @@ export class ExitConditionEvaluator extends StreamExpressionEngine { private totalStreams: ParsedStream[], private totalTimeTaken: number, private queryType: string, - private queriedAddons: string[] + private queriedAddons: string[], + private allAddons: string[] ) { super(); this.parser.consts.totalStreams = this.totalStreams; this.parser.consts.totalTimeTaken = this.totalTimeTaken; this.parser.consts.queryType = this.queryType; this.parser.consts.queriedAddons = this.queriedAddons; + this.parser.consts.allAddons = this.allAddons; } async evaluate(condition: string) { @@ -629,7 +631,13 @@ export class ExitConditionEvaluator extends StreamExpressionEngine { } static async testEvaluate(condition: string) { - const parser = new ExitConditionEvaluator([], 200, 'movie', ['Test Addon']); + const parser = new ExitConditionEvaluator( + [], + 200, + 'movie', + ['Test Addon'], + ['Test Addon'] + ); return await parser.evaluate(condition); } } diff --git a/packages/core/src/streams/fetcher.ts b/packages/core/src/streams/fetcher.ts index 809acc0d..271d87f5 100644 --- a/packages/core/src/streams/fetcher.ts +++ b/packages/core/src/streams/fetcher.ts @@ -202,6 +202,9 @@ class StreamFetcher { await new Promise((resolve) => { const queriedAddons: string[] = []; + const allAddons: string[] = Array.from( + new Set(addons.map((addon) => addon.name)) + ); const presetProgress = addons.reduce( (acc, addon) => { const id = addon.preset.id; @@ -227,7 +230,8 @@ class StreamFetcher { allStreams, timeTaken, queryType, - queriedAddons + queriedAddons, + allAddons ); const shouldExit = await evaluator.evaluate(condition); diff --git a/packages/frontend/src/components/menu/addons.tsx b/packages/frontend/src/components/menu/addons.tsx index 036aba1c..5861ab83 100644 --- a/packages/frontend/src/components/menu/addons.tsx +++ b/packages/frontend/src/components/menu/addons.tsx @@ -1261,6 +1261,15 @@ function AddonFetchingBehaviorCard() { 'All addons start fetching at the same time. As soon as any addon returns results, the exit condition is evaluated. If the condition is met, results are returned immediately and any remaining addon results are ignored.', }; + const placeholderExitConditions = [ + 'count(resolution(totalStreams, "2160p")) > 0 or totalTimeTaken > 5000', + "queryType == 'anime' ? (count(resolution(totalStreams, '1080p')) > 0 or totalTimeTaken > 5000) : false", + "'addon' in queriedAddons and (totalTimeTaken >= 6000 or count(totalStreams) >= 5)", + "count(seeders(size(totalStreams, '5GB', '20GB'), 50)) > 0", + "queryType == 'movie' ? count(cached(resolution(totalStreams, '2160p'))) > 0 : count(resolution(totalStreams, '1080p')) >= 2", + "count(cached(quality(totalStreams, 'Bluray REMUX', 'Bluray', 'WEB-DL'))) > 0", + ]; + return ( { setUserData((prev) => ({ @@ -1421,6 +1435,10 @@ function AddonFetchingBehaviorCard() { Tip: use the in operator to check if a specific addon has been queried. +
  • + allAddons: All addons that were intended to be + used for that query. +
  • }