From 6ee6de48fff1e876d47ef18ec8a6887854e90555 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 24 May 2024 08:56:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=E5=B9=B6=E5=8F=91=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/filter/RuleParser.py | 54 ++++++++++++++++++++------------ app/modules/filter/__init__.py | 1 + 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/app/modules/filter/RuleParser.py b/app/modules/filter/RuleParser.py index 5d807339..6effa6dd 100644 --- a/app/modules/filter/RuleParser.py +++ b/app/modules/filter/RuleParser.py @@ -1,30 +1,42 @@ +import threading + from pyparsing import Forward, Literal, Word, alphas, infixNotation, opAssoc, alphanums, Combine, nums, ParseResults class RuleParser: + _lock = threading.Lock() + _thread_local = threading.local() + def __init__(self): """ 定义语法规则 """ - # 表达式 - expr: Forward = Forward() - # 原子 - atom: Combine = Combine(Word(alphas, alphanums) | Word(nums) + Word(alphas, alphanums)) - # 逻辑非操作符 - operator_not: Literal = Literal('!').setParseAction(lambda t: 'not') - # 逻辑或操作符 - operator_or: Literal = Literal('|').setParseAction(lambda t: 'or') - # 逻辑与操作符 - operator_and: Literal = Literal('&').setParseAction(lambda t: 'and') - # 定义表达式的语法规则 - expr <<= operator_not + expr | operator_or | operator_and | atom | ('(' + expr + ')') + with self._lock: + if not hasattr(self._thread_local, 'initialized'): + # 表达式 + expr: Forward = Forward() + # 原子 + atom: Combine = Combine(Word(alphas, alphanums) | (Word(nums) + Word(alphas, alphanums))) + # 逻辑非操作符 + operator_not: Literal = Literal('!').setParseAction(lambda t: 'not') + # 逻辑或操作符 + operator_or: Literal = Literal('|').setParseAction(lambda t: 'or') + # 逻辑与操作符 + operator_and: Literal = Literal('&').setParseAction(lambda t: 'and') + # 定义表达式的语法规则 + expr <<= (operator_not + expr) | atom | ('(' + expr + ')') - # 运算符优先级 - self.expr = infixNotation(expr, - [(operator_not, 1, opAssoc.RIGHT), - (operator_and, 2, opAssoc.LEFT), - (operator_or, 2, opAssoc.LEFT)]) + # 运算符优先级 + self.expr = infixNotation(expr, + [(operator_not, 1, opAssoc.RIGHT), + (operator_and, 2, opAssoc.LEFT), + (operator_or, 2, opAssoc.LEFT)]) + + self._thread_local.expr = self.expr + self._thread_local.initialized = True + else: + self.expr = self._thread_local.expr def parse(self, expression: str) -> ParseResults: """ @@ -41,7 +53,9 @@ class RuleParser: if __name__ == '__main__': # 测试代码 - expression_str = "!BLU & 4K & CN > !BLU & 1080P & CN > !BLU & 4K > !BLU & 1080P" + expression_str = """ + SPECSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & 60FPS & !DOLBY & !SDR & !3D > CNSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & 60FPS & !DOLBY & !SDR & !3D > SPECSUB & 4K & !BLU & !REMUX & !WEBDL & 60FPS & !DOLBY & !SDR & !3D > CNSUB & 4K & !BLU & !REMUX & !WEBDL & 60FPS & !DOLBY & !SDR & !3D > SPECSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > CNSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > CNSUB & CNVOI & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > SPECSUB & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > CNSUB & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > CNSUB & 4K & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > SPECSUB & CNVOI & 4K & WEBDL & 60FPS & !DOLBY & !SDR & !3D > CNSUB & CNVOI & 4K & WEBDL & 60FPS & !DOLBY & !SDR & !3D > SPECSUB & 4K & WEBDL & 60FPS & !DOLBY & !SDR & !3D > CNSUB & 4K & WEBDL & 60FPS & !DOLBY & !SDR & !3D > SPECSUB & CNVOI & 4K & WEBDL & !DOLBY & HDR & !3D > CNSUB & CNVOI & 4K & WEBDL & !DOLBY & HDR & !3D > SPECSUB & CNVOI & 4K & WEBDL & !DOLBY & !3D > CNSUB & CNVOI & 4K & WEBDL & !DOLBY & !3D > SPECSUB & 4K & WEBDL & !DOLBY & HDR & !3D > CNSUB & 4K & WEBDL & !DOLBY & HDR & !3D > SPECSUB & 4K & WEBDL & !DOLBY & !3D > CNSUB & 4K & WEBDL & !DOLBY & !3D > SPECSUB & CNVOI & 4K & !BLU & !WEBDL & !DOLBY & HDR & !3D > CNSUB & CNVOI & 4K & !BLU & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & CNVOI & 4K & !BLU & !WEBDL & !DOLBY & !3D > CNSUB & CNVOI & 4K & !BLU & !WEBDL & !DOLBY & !3D > SPECSUB & 4K & !BLU & !WEBDL & !DOLBY & HDR & !3D > CNSUB & 4K & !BLU & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & 4K & !BLU & !WEBDL & !DOLBY & !SDR & !3D > CNSUB & 4K & !BLU & !WEBDL & !DOLBY & !SDR & !3D > 4K & !BLU & !REMUX & !DOLBY & HDR & !3D > 4K & !BLURAY & !REMUX & !DOLBY & !3D > SPECSUB & 1080P & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > CNSUB & 1080P & !BLU & !REMUX & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & 1080P & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > CNSUB & 1080P & !BLU & !REMUX & !WEBDL & !DOLBY & !3D > SPECSUB & 1080P & !BLU & !WEBDL & !DOLBY & HDR & !3D > CNSUB & 1080P & !BLU & !WEBDL & !DOLBY & HDR & !3D > SPECSUB & 1080P & !BLU & !WEBDL & !DOLBY & !3D > CNSUB & 1080P & !BLU & !WEBDL & !DOLBY & !3D > SPECSUB & 1080P & WEBDL & !DOLBY & HDR & !3D > CNSUB & 1080P & WEBDL & !DOLBY & HDR & !3D > SPECSUB & 1080P & WEBDL & !DOLBY & !3D > CNSUB & 1080P & WEBDL & !DOLBY & !3D > 1080P & !BLU & !REMUX & !DOLBY & HDR & !3D > 1080P & !BLU & !REMUX & !DOLBY & !3D + """ for exp in expression_str.split('>'): - parsed_expr = RuleParser().parse(exp) - print(parsed_expr.as_list()) + parsed_expr = RuleParser().parse(exp.strip()) + print(parsed_expr.asList()) diff --git a/app/modules/filter/__init__.py b/app/modules/filter/__init__.py index bcc0c7d5..5da9a9af 100644 --- a/app/modules/filter/__init__.py +++ b/app/modules/filter/__init__.py @@ -173,6 +173,7 @@ class FilterModule(_ModuleBase): continue # 能命中优先级的才返回 if not self.__get_order(torrent, rule_string): + logger.info(f"种子 {torrent.site_name} - {torrent.title} {torrent.description} 不匹配优先级规则") continue ret_torrents.append(torrent)