40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
import re
|
|
|
|
PATTERN_BASIC = re.compile(r'#(.+?)#')
|
|
|
|
|
|
def match_rules(filename, rules):
|
|
for r in rules:
|
|
match = r.apply(filename)
|
|
if match:
|
|
return r, match
|
|
return None
|
|
|
|
|
|
class FileRule:
|
|
def __init__(self, rule, conf):
|
|
# trouve les marqueurs dans la règle
|
|
self.patterns = PATTERN_BASIC.findall(rule)
|
|
rg = PATTERN_BASIC.sub(lambda m: self.regFor(match=m, conf=conf), rule)
|
|
self.rule = re.compile(rg) # on garde la version compilée (donc optimisée)
|
|
|
|
@staticmethod
|
|
def regFor(match, conf):
|
|
name = match.group(0)
|
|
trunc_name = name[1:-1]
|
|
if name == '#EXT#':
|
|
return '(' + '|'.join(conf.extensions) + ')'
|
|
elif name in ['#EPISODE_NUM#', '#SEASON_NUM#']:
|
|
return '([0-9]+)'
|
|
return '([^/]+)'
|
|
|
|
def apply(self, filename):
|
|
# applique la règle à un objet file
|
|
match = self.rule.match(filename)
|
|
if not match:
|
|
return None
|
|
# trouve les différents marqueurs de règle
|
|
patterns = {}
|
|
for i in range(len(self.patterns)):
|
|
patterns[self.patterns[i]] = match.group(i + 1)
|
|
return patterns
|