From 4a7bf663ab6ee1820f0be5a7c502cba55a6ed2eb Mon Sep 17 00:00:00 2001 From: Abdussamet Kocak Date: Thu, 25 Jun 2026 08:46:51 +0300 Subject: [PATCH] fix(file-renamer): tighten short-date matching --- file_renamer.py | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/file_renamer.py b/file_renamer.py index 1ad494a..2c6f258 100755 --- a/file_renamer.py +++ b/file_renamer.py @@ -31,7 +31,7 @@ def load_actors() -> set[str]: re_date_only = re.compile(r"\b(\d{4})\b") # 2024 re_date_us = re.compile(r"\b(\d{2})\D(\d{2})\D(\d{2})\b") # 12/31/21 re_date_iso = re.compile(r"\b(\d{4})\D?(\d{2})\D?(\d{2})\b") # 2020-12-31 -re_date_iso_short = re.compile(r"(\d{2})\D?(\d{2})\D?(\d{2})") # 20-12-31"' +re_date_iso_short = re.compile(r"\b(\d{2})\D?(\d{2})\D?(\d{2})\b") # 20-12-31"' re_date_iso_rev = re.compile(r"\b(\d{2})\D?(\d{2})\D?(\d{4})\b") # 31-12-2020 re_date_iso_rev_short = re.compile(r"\b(\d{2})\D(\d{2})\D(\d{2})\b") # 31.12.21 @@ -57,16 +57,12 @@ def parse_date(filename: str) -> ParsedDate | None: def from_date_only(): match = re_date_only.search(filename) y = int(match.group(1)) - return ParsedDate( - datetime.date(y, 1, 1), start=match.start(), end=match.end() - ) + return ParsedDate(datetime.date(y, 1, 1), start=match.start(), end=match.end()) def from_us_format(): match = re_date_us.search(filename) m, d, y = map(int, match.groups()) - return ParsedDate( - datetime.date(y + 2000, m, d), start=match.start(), end=match.end() - ) + return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end()) def from_iso(): match = re_date_iso.search(filename) @@ -76,9 +72,7 @@ def parse_date(filename: str) -> ParsedDate | None: def from_iso_short(): match = re_date_iso_short.search(filename) y, m, d = map(int, match.groups()) - return ParsedDate( - datetime.date(y + 2000, m, d), start=match.start(), end=match.end() - ) + return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end()) def from_iso_reversed(): match = re_date_iso_rev.search(filename) @@ -88,9 +82,7 @@ def parse_date(filename: str) -> ParsedDate | None: def from_iso_reversed_short(): match = re_date_iso_rev_short.search(filename) d, m, y = map(int, match.groups()) - return ParsedDate( - datetime.date(y + 2000, m, d), start=match.start(), end=match.end() - ) + return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end()) candidates = [] for fn in [ @@ -109,9 +101,7 @@ def parse_date(filename: str) -> ParsedDate | None: today = datetime.date.today() future_threshold = today + datetime.timedelta(days=60) past_threshold = datetime.date(2010, 1, 1) - candidates = [ - it for it in candidates if past_threshold < it.date < future_threshold - ] + candidates = [it for it in candidates if past_threshold < it.date < future_threshold] if not candidates: return @@ -165,9 +155,7 @@ def filenames_to_actors(): return actors -def parse_release( - filename: str, known_actors: set[str] | None = None -) -> Release | None: +def parse_release(filename: str, known_actors: set[str] | None = None) -> Release | None: if not known_actors: known_actors = set() if any(filename.lower().endswith(ext) for ext in [".mp4", ".mkv"]): @@ -186,9 +174,7 @@ def parse_release( title=title, released_at=datetime.date.fromisoformat(date), ) - case [actors, studio, date] if studio.startswith("@") and ( - parsed := parse_date(date) - ): + case [actors, studio, date] if studio.startswith("@") and (parsed := parse_date(date)): return Release( actors=sorted(actors.split(", ")), studio=studio.removeprefix("@"), @@ -202,7 +188,7 @@ def parse_release( title=title, released_at=None, ) - case [actors, title, date] if (parsed := parse_date(date)): + case [actors, title, date] if parsed := parse_date(date): return Release( actors=sorted(actors.split(", ")), studio=None, @@ -269,9 +255,7 @@ def parse_release( def parse_args(): arger = argparse.ArgumentParser() - arger.add_argument( - "filenames", nargs="+", type=lambda v: Path(v).resolve(), help="Filenames" - ) + arger.add_argument("filenames", nargs="+", type=lambda v: Path(v).resolve(), help="Filenames") return arger.parse_args() @@ -295,10 +279,6 @@ def write_undo_script(save_dir: Path, ops: list[MoveOp]): f.write(json.dumps(it.to_dict()) + "\n") -def fix_filename(): - pass - - def main(): actors = load_actors()