v1.0.2: multi-episode rename (S01E01-E02), VERSION file, docs

Made-with: Cursor
This commit is contained in:
Bulk Renamer
2026-03-29 20:50:00 -05:00
parent d306188805
commit 76574e2bee
7 changed files with 110 additions and 10 deletions
+33 -7
View File
@@ -201,14 +201,14 @@ class NumberingRule(Rule):
return stem, ext
# Episode renumber: match SxxExx or similar, replace episode number only, keep title
# Episode renumber: match SxxExx or SxxExx-Eyy, replace episode block; keep title
@dataclass
class EpisodeRenumberRule(Rule):
start: int = 1
step: int = 1
padding: int = 2
# Pattern: group 1 = prefix (e.g. "S01E"), group 2 = episode digits, group 3 = rest (title)
pattern: str = r"(.*?[Ss]\d+[Ee])(\d+)(.*)"
# Group 1 = prefix (e.g. "S01E"), 2 = first ep digits, 3 = full "-E06" or None, 4 = second ep if range, 5 = rest (title)
pattern: str = r"(.*?[Ss]\d+[Ee])(\d+)(-[Ee](\d+))?(.*)"
def apply(
self,
@@ -224,10 +224,36 @@ class EpisodeRenumberRule(Rule):
return stem, ext
if not m:
return stem, ext
prefix, _old_ep, rest = m.group(1), m.group(2), m.group(3)
ep_num = self.start + index * self.step
ep_str = str(ep_num).zfill(max(1, self.padding))
new_stem = f"{prefix}{ep_str}{rest}"
prefix, old_first_s, range_dash_e, old_second_s, rest = (
m.group(1),
m.group(2),
m.group(3),
m.group(4),
m.group(5),
)
try:
old_first = int(old_first_s)
except ValueError:
return stem, ext
span = 1
if old_second_s is not None:
try:
old_second = int(old_second_s)
except ValueError:
return stem, ext
span = old_second - old_first + 1
if span < 1:
span = 1
ep_new_first = self.start + index * self.step
pad = max(1, self.padding)
e1 = str(ep_new_first).zfill(pad)
if span <= 1:
new_stem = f"{prefix}{e1}{rest}"
else:
ep_new_last = ep_new_first + span - 1
e2 = str(ep_new_last).zfill(pad)
# Match common style: S01E01-E02 (second block uses E again)
new_stem = f"{prefix}{e1}-E{e2}{rest}"
return new_stem, ext