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