尝试修复过滤器并发报错
This commit is contained in:
parent
671bdad77c
commit
6ee6de48ff
@ -1,16 +1,23 @@
|
|||||||
|
import threading
|
||||||
|
|
||||||
from pyparsing import Forward, Literal, Word, alphas, infixNotation, opAssoc, alphanums, Combine, nums, ParseResults
|
from pyparsing import Forward, Literal, Word, alphas, infixNotation, opAssoc, alphanums, Combine, nums, ParseResults
|
||||||
|
|
||||||
|
|
||||||
class RuleParser:
|
class RuleParser:
|
||||||
|
|
||||||
|
_lock = threading.Lock()
|
||||||
|
_thread_local = threading.local()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""
|
"""
|
||||||
定义语法规则
|
定义语法规则
|
||||||
"""
|
"""
|
||||||
|
with self._lock:
|
||||||
|
if not hasattr(self._thread_local, 'initialized'):
|
||||||
# 表达式
|
# 表达式
|
||||||
expr: Forward = Forward()
|
expr: Forward = Forward()
|
||||||
# 原子
|
# 原子
|
||||||
atom: Combine = Combine(Word(alphas, alphanums) | Word(nums) + Word(alphas, alphanums))
|
atom: Combine = Combine(Word(alphas, alphanums) | (Word(nums) + Word(alphas, alphanums)))
|
||||||
# 逻辑非操作符
|
# 逻辑非操作符
|
||||||
operator_not: Literal = Literal('!').setParseAction(lambda t: 'not')
|
operator_not: Literal = Literal('!').setParseAction(lambda t: 'not')
|
||||||
# 逻辑或操作符
|
# 逻辑或操作符
|
||||||
@ -18,7 +25,7 @@ class RuleParser:
|
|||||||
# 逻辑与操作符
|
# 逻辑与操作符
|
||||||
operator_and: Literal = Literal('&').setParseAction(lambda t: 'and')
|
operator_and: Literal = Literal('&').setParseAction(lambda t: 'and')
|
||||||
# 定义表达式的语法规则
|
# 定义表达式的语法规则
|
||||||
expr <<= operator_not + expr | operator_or | operator_and | atom | ('(' + expr + ')')
|
expr <<= (operator_not + expr) | atom | ('(' + expr + ')')
|
||||||
|
|
||||||
# 运算符优先级
|
# 运算符优先级
|
||||||
self.expr = infixNotation(expr,
|
self.expr = infixNotation(expr,
|
||||||
@ -26,6 +33,11 @@ class RuleParser:
|
|||||||
(operator_and, 2, opAssoc.LEFT),
|
(operator_and, 2, opAssoc.LEFT),
|
||||||
(operator_or, 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:
|
def parse(self, expression: str) -> ParseResults:
|
||||||
"""
|
"""
|
||||||
解析给定的表达式。
|
解析给定的表达式。
|
||||||
@ -41,7 +53,9 @@ class RuleParser:
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
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('>'):
|
for exp in expression_str.split('>'):
|
||||||
parsed_expr = RuleParser().parse(exp)
|
parsed_expr = RuleParser().parse(exp.strip())
|
||||||
print(parsed_expr.as_list())
|
print(parsed_expr.asList())
|
||||||
|
@ -173,6 +173,7 @@ class FilterModule(_ModuleBase):
|
|||||||
continue
|
continue
|
||||||
# 能命中优先级的才返回
|
# 能命中优先级的才返回
|
||||||
if not self.__get_order(torrent, rule_string):
|
if not self.__get_order(torrent, rule_string):
|
||||||
|
logger.info(f"种子 {torrent.site_name} - {torrent.title} {torrent.description} 不匹配优先级规则")
|
||||||
continue
|
continue
|
||||||
ret_torrents.append(torrent)
|
ret_torrents.append(torrent)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user