From d01e5f5ee2280e2bdc46dc7bc0fae1afbca0ef0b Mon Sep 17 00:00:00 2001 From: maxDorninger <97409287+maxDorninger@users.noreply.github.com> Date: Wed, 16 Jul 2025 23:23:11 +0200 Subject: [PATCH] add scoring rules to config and add evaluate indexer query result function --- media_manager/indexer/config.py | 17 +++++++++++++++++ media_manager/indexer/utils.py | 21 +++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 media_manager/indexer/utils.py diff --git a/media_manager/indexer/config.py b/media_manager/indexer/config.py index 4507800..c9a953f 100644 --- a/media_manager/indexer/config.py +++ b/media_manager/indexer/config.py @@ -13,7 +13,24 @@ class JackettConfig(BaseSettings): url: str = "http://localhost:9696" indexers: list[str] = ["all"] +class ScoringRule(BaseSettings): + name: str + score_modifier: int = 0 + negate: bool = False + +class TitleScoringRule(ScoringRule): + keywords: list[str] + +class IndexerFlagScoringRule(ScoringRule): + flags: list[str] + +class ScoringRuleSet(BaseSettings): + name: str + tags: list[str] = [] + rule_names: list[str] = [] class IndexerConfig(BaseSettings): prowlarr: ProwlarrConfig jackett: JackettConfig + title_scoring_rules: list[TitleScoringRule] = [] + indexer_flag_scoring_rules: list[IndexerFlagScoringRule] = [] \ No newline at end of file diff --git a/media_manager/indexer/utils.py b/media_manager/indexer/utils.py new file mode 100644 index 0000000..caf033e --- /dev/null +++ b/media_manager/indexer/utils.py @@ -0,0 +1,21 @@ +from media_manager.config import AllEncompassingConfig +from media_manager.indexer.config import ScoringRuleSet +from media_manager.indexer.schemas import IndexerQueryResult + + +def evaluate_indexer_query_result(query_result: IndexerQueryResult, ruleset: ScoringRuleSet) -> IndexerQueryResult|None: + title_rules = AllEncompassingConfig().indexers.title_scoring_rules + indexer_flag_rules = AllEncompassingConfig().indexers.indexer_flag_scoring_rules + for rule_name in ruleset.rule_names: + for rule in title_rules: + if rule.name == rule_name: + if any(keyword.lower() in query_result.title.lower() for keyword in rule.keywords) and not rule.negate: + query_result.score += rule.score_modifier + for rule in indexer_flag_rules: + if rule.name == rule_name: + if any(flag in query_result.flags for flag in rule.flags) and not rule.negate: + query_result.score += rule.score_modifier + if query_result.score <= 0: + return None + + return query_result \ No newline at end of file