2727from beets .ui import UserError
2828
2929
30- def simple_rewriter (field , rules ):
30+ def rewriter (field , simple_rules , advanced_rules ):
3131 """Template field function factory.
3232
3333 Create a template field function that rewrites the given field
3434 with the given rewriting rules.
35- ``rules`` must be a list of (pattern, replacement) pairs.
35+ ``simple_rules`` must be a list of (pattern, replacement) pairs.
36+ ``advanced_rules`` must be a list of (query, replacement) pairs.
3637 """
3738
3839 def fieldfunc (item ):
3940 value = item ._values_fixed [field ]
40- for pattern , replacement in rules :
41+ for pattern , replacement in simple_rules :
4142 if pattern .match (value .lower ()):
4243 # Rewrite activated.
4344 return replacement
44- # Not activated; return original value.
45- return value
46-
47- return fieldfunc
48-
49-
50- def advanced_rewriter (field , rules ):
51- """Template field function factory.
52-
53- Create a template field function that rewrites the given field
54- with the given rewriting rules.
55- ``rules`` must be a list of (query, replacement) pairs.
56- """
57-
58- def fieldfunc (item ):
59- value = item ._values_fixed [field ]
60- for query , replacement in rules :
45+ for query , replacement in advanced_rules :
6146 if query .match (item ):
6247 # Rewrite activated.
6348 return replacement
@@ -97,8 +82,12 @@ def __init__(self):
9782 }
9883
9984 # Gather all the rewrite rules for each field.
100- simple_rules = defaultdict (list )
101- advanced_rules = defaultdict (list )
85+ class RulesContainer :
86+ def __init__ (self ):
87+ self .simple = []
88+ self .advanced = []
89+
90+ rules = defaultdict (RulesContainer )
10291 for rule in self .config .get (template ):
10392 if "match" not in rule :
10493 # Simple syntax
@@ -124,12 +113,12 @@ def __init__(self):
124113 f"for field { fieldname } "
125114 )
126115 pattern = re .compile (pattern .lower ())
127- simple_rules [fieldname ].append ((pattern , value ))
116+ rules [fieldname ]. simple .append ((pattern , value ))
128117
129118 # Apply the same rewrite to the corresponding album field.
130119 if fieldname in corresponding_album_fields :
131120 album_fieldname = corresponding_album_fields [fieldname ]
132- simple_rules [album_fieldname ].append ((pattern , value ))
121+ rules [album_fieldname ]. simple .append ((pattern , value ))
133122 else :
134123 # Advanced syntax
135124 match = rule ["match" ]
@@ -168,24 +157,18 @@ def __init__(self):
168157 f"for field { fieldname } "
169158 )
170159
171- advanced_rules [fieldname ].append ((query , replacement ))
160+ rules [fieldname ]. advanced .append ((query , replacement ))
172161
173162 # Apply the same rewrite to the corresponding album field.
174163 if fieldname in corresponding_album_fields :
175164 album_fieldname = corresponding_album_fields [fieldname ]
176- advanced_rules [album_fieldname ].append (
165+ rules [album_fieldname ]. advanced .append (
177166 (query , replacement )
178167 )
179168
180169 # Replace each template field with the new rewriter function.
181- for fieldname , fieldrules in simple_rules .items ():
182- getter = simple_rewriter (fieldname , fieldrules )
183- self .template_fields [fieldname ] = getter
184- if fieldname in Album ._fields :
185- self .album_template_fields [fieldname ] = getter
186-
187- for fieldname , fieldrules in advanced_rules .items ():
188- getter = advanced_rewriter (fieldname , fieldrules )
170+ for fieldname , fieldrules in rules .items ():
171+ getter = rewriter (fieldname , fieldrules .simple , fieldrules .advanced )
189172 self .template_fields [fieldname ] = getter
190173 if fieldname in Album ._fields :
191174 self .album_template_fields [fieldname ] = getter
0 commit comments