feat(domain): naming template engine (Jinja safe subset, MP variables, path layout)

- naming/engine: lexer/parser/AST/render for {{ }} / if-elif-else / whitelisted filters
  (default pad pad2 upper lower trim replace truncate date join); rejects for/set/attribute/
  subscript/call/~/% with line:col errors and 'did you mean' hints
- naming/variables: variable table aligned with MoviePilot names plus ours (cut, airDate,
  issue, slotName, libraryRoot ...); buildNamingVars from parsed release + entity + units
- naming/layout: split by literal '/', segment roles (category/root/season/sub/file),
  value escaping, reserved names, 255-byte segments, validateNamingTemplate
- naming/defaults: MP default movie/tv + our variety template, v1 syntax upgrade,
  entity > root > global override resolution, builtin preview samples
- path/binding: resolveTargetDirectory keeps bound dirs, only unbound segments render;
  renderMediaFileName = last segment of the full template; DEFAULT_TEMPLATES = MP v2
- differential: 34 cases vs MP (21 identical, 13 documented deviations)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-28 15:24:32 +08:00
1 parent e8745115f4
commit f7c75ad781
22 files changed
+2674 -281

No files matched your search

@@ -0,0 +1,110 @@
{
"generatedFrom": {
"repo": "MoviePilot",
"commit": "e6820a8"
},
"mp": {
"N01": {
"path": "Inception (2010)/Inception (2010) - 2160p.mkv"
},
"N02": {
"path": "Inception (2010)/Inception (2010).mkv"
},
"N03": {
"path": "Inception (2010)/Inception (2010)-CD1 - 1080p.mkv"
},
"N04": {
"path": "A/B:C/A/B:C.mkv"
},
"N05": {
"path": "绝命毒师 (2008)/Season 1/绝命毒师 - S01E01 - 第 1 集.mkv"
},
"N06": {
"path": "绝命毒师 (2008)/Season 1/绝命毒师 - S01E01-E02 - 第 1-2 集.mkv"
},
"N07": {
"path": "绝命毒师 (2008)/Season 1/绝命毒师 - S01E01 - 第 1 集.mkv"
},
"N08": {
"path": "绝命毒师 (2008)/Season 0/绝命毒师 - S00E03 - 第 3 集.mkv"
},
"N09": {
"path": "某剧/Season 1/某剧 - S01E05 - 第 5 集.ass"
},
"N10": {
"path": "X/Season 12/X - S12E100 - 第 100 集.mkv"
},
"N11": {
"path": "Inception (2010)/Inception (2010) - 1080p.MKV"
},
"N12": {
"path": "绝命毒师 (2008)/绝命毒师 S02.mkv"
},
"N13": {
"path": "X/BluRay DV/X.mkv"
},
"N14": {
"path": "X/X - WEB-DL 1080p.mkv"
},
"N15": {
"path": "X/X - A/B.mkv"
},
"N16": {
"path": "盗梦空间/盗梦空间.mkv"
},
"N17": {
"error": "TemplateAssertionError: No filter named 'pad'."
},
"N18": {
"path": "X ()/X.mkv"
},
"N19": {
"path": "长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长/长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长.mkv"
},
"N20": {
"path": "快乐大本营/Season 1/快乐大本营 - S01E12 - 第 12 集.mp4"
},
"N21": {
"path": "电视剧/绝命毒师 (2008)/Season 1/绝命毒师 - S01E02.mkv"
},
"N22": {
"path": "X/X.mkv"
},
"N23": {
"path": "<class 'str'>/X.mkv"
},
"N24": {
"path": "X/X"
},
"N25": {
"path": "X/X - H265.mkv"
},
"N26": {
"path": "X/X - HEVC.mkv"
},
"N27": {
"path": "X/X 10bit.mkv"
},
"N28": {
"path": "Inception.Movie/INCEPTION.mkv"
},
"N29": {
"path": "绝命毒师/Specials/绝命毒师 - S00E03.mkv"
},
"N30": {
"path": "X/X [4K].mkv"
},
"N31": {
"path": "X/X - NOGRP.mkv"
},
"N32": {
"path": "Inception (2010) [tmdbid=27205]/Inception (2010).mkv"
},
"N33": {
"path": "CON/CON.mkv"
},
"N34": {
"path": "Inception: 2010/Inception.mkv"
}
}
}