fix(file-renamer): tighten short-date matching
This commit is contained in:
+10
-30
@@ -31,7 +31,7 @@ def load_actors() -> set[str]:
|
|||||||
re_date_only = re.compile(r"\b(\d{4})\b") # 2024
|
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_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 = 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 = 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
|
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():
|
def from_date_only():
|
||||||
match = re_date_only.search(filename)
|
match = re_date_only.search(filename)
|
||||||
y = int(match.group(1))
|
y = int(match.group(1))
|
||||||
return ParsedDate(
|
return ParsedDate(datetime.date(y, 1, 1), start=match.start(), end=match.end())
|
||||||
datetime.date(y, 1, 1), start=match.start(), end=match.end()
|
|
||||||
)
|
|
||||||
|
|
||||||
def from_us_format():
|
def from_us_format():
|
||||||
match = re_date_us.search(filename)
|
match = re_date_us.search(filename)
|
||||||
m, d, y = map(int, match.groups())
|
m, d, y = map(int, match.groups())
|
||||||
return ParsedDate(
|
return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end())
|
||||||
datetime.date(y + 2000, m, d), start=match.start(), end=match.end()
|
|
||||||
)
|
|
||||||
|
|
||||||
def from_iso():
|
def from_iso():
|
||||||
match = re_date_iso.search(filename)
|
match = re_date_iso.search(filename)
|
||||||
@@ -76,9 +72,7 @@ def parse_date(filename: str) -> ParsedDate | None:
|
|||||||
def from_iso_short():
|
def from_iso_short():
|
||||||
match = re_date_iso_short.search(filename)
|
match = re_date_iso_short.search(filename)
|
||||||
y, m, d = map(int, match.groups())
|
y, m, d = map(int, match.groups())
|
||||||
return ParsedDate(
|
return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end())
|
||||||
datetime.date(y + 2000, m, d), start=match.start(), end=match.end()
|
|
||||||
)
|
|
||||||
|
|
||||||
def from_iso_reversed():
|
def from_iso_reversed():
|
||||||
match = re_date_iso_rev.search(filename)
|
match = re_date_iso_rev.search(filename)
|
||||||
@@ -88,9 +82,7 @@ def parse_date(filename: str) -> ParsedDate | None:
|
|||||||
def from_iso_reversed_short():
|
def from_iso_reversed_short():
|
||||||
match = re_date_iso_rev_short.search(filename)
|
match = re_date_iso_rev_short.search(filename)
|
||||||
d, m, y = map(int, match.groups())
|
d, m, y = map(int, match.groups())
|
||||||
return ParsedDate(
|
return ParsedDate(datetime.date(y + 2000, m, d), start=match.start(), end=match.end())
|
||||||
datetime.date(y + 2000, m, d), start=match.start(), end=match.end()
|
|
||||||
)
|
|
||||||
|
|
||||||
candidates = []
|
candidates = []
|
||||||
for fn in [
|
for fn in [
|
||||||
@@ -109,9 +101,7 @@ def parse_date(filename: str) -> ParsedDate | None:
|
|||||||
today = datetime.date.today()
|
today = datetime.date.today()
|
||||||
future_threshold = today + datetime.timedelta(days=60)
|
future_threshold = today + datetime.timedelta(days=60)
|
||||||
past_threshold = datetime.date(2010, 1, 1)
|
past_threshold = datetime.date(2010, 1, 1)
|
||||||
candidates = [
|
candidates = [it for it in candidates if past_threshold < it.date < future_threshold]
|
||||||
it for it in candidates if past_threshold < it.date < future_threshold
|
|
||||||
]
|
|
||||||
|
|
||||||
if not candidates:
|
if not candidates:
|
||||||
return
|
return
|
||||||
@@ -165,9 +155,7 @@ def filenames_to_actors():
|
|||||||
return actors
|
return actors
|
||||||
|
|
||||||
|
|
||||||
def parse_release(
|
def parse_release(filename: str, known_actors: set[str] | None = None) -> Release | None:
|
||||||
filename: str, known_actors: set[str] | None = None
|
|
||||||
) -> Release | None:
|
|
||||||
if not known_actors:
|
if not known_actors:
|
||||||
known_actors = set()
|
known_actors = set()
|
||||||
if any(filename.lower().endswith(ext) for ext in [".mp4", ".mkv"]):
|
if any(filename.lower().endswith(ext) for ext in [".mp4", ".mkv"]):
|
||||||
@@ -186,9 +174,7 @@ def parse_release(
|
|||||||
title=title,
|
title=title,
|
||||||
released_at=datetime.date.fromisoformat(date),
|
released_at=datetime.date.fromisoformat(date),
|
||||||
)
|
)
|
||||||
case [actors, studio, date] if studio.startswith("@") and (
|
case [actors, studio, date] if studio.startswith("@") and (parsed := parse_date(date)):
|
||||||
parsed := parse_date(date)
|
|
||||||
):
|
|
||||||
return Release(
|
return Release(
|
||||||
actors=sorted(actors.split(", ")),
|
actors=sorted(actors.split(", ")),
|
||||||
studio=studio.removeprefix("@"),
|
studio=studio.removeprefix("@"),
|
||||||
@@ -202,7 +188,7 @@ def parse_release(
|
|||||||
title=title,
|
title=title,
|
||||||
released_at=None,
|
released_at=None,
|
||||||
)
|
)
|
||||||
case [actors, title, date] if (parsed := parse_date(date)):
|
case [actors, title, date] if parsed := parse_date(date):
|
||||||
return Release(
|
return Release(
|
||||||
actors=sorted(actors.split(", ")),
|
actors=sorted(actors.split(", ")),
|
||||||
studio=None,
|
studio=None,
|
||||||
@@ -269,9 +255,7 @@ def parse_release(
|
|||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
arger = argparse.ArgumentParser()
|
arger = argparse.ArgumentParser()
|
||||||
arger.add_argument(
|
arger.add_argument("filenames", nargs="+", type=lambda v: Path(v).resolve(), help="Filenames")
|
||||||
"filenames", nargs="+", type=lambda v: Path(v).resolve(), help="Filenames"
|
|
||||||
)
|
|
||||||
return arger.parse_args()
|
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")
|
f.write(json.dumps(it.to_dict()) + "\n")
|
||||||
|
|
||||||
|
|
||||||
def fix_filename():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
actors = load_actors()
|
actors = load_actors()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user