feat: Bump version to 0.3.3, update special editions structure, and enhance filename extraction logic

This commit is contained in:
sHa
2025-12-28 07:33:37 +00:00
parent 3b7ab1d54e
commit 97bacf602c
5 changed files with 72 additions and 65 deletions

BIN
dist/renamer-0.3.3-py3-none-any.whl vendored Normal file

Binary file not shown.

View File

@@ -1,6 +1,6 @@
[project]
name = "renamer"
version = "0.3.2"
version = "0.3.3"
description = "Terminal-based media file renamer and metadata viewer"
readme = "README.md"
requires-python = ">=3.11"

View File

@@ -133,50 +133,56 @@ MOVIE_DB_DICT = {
},
}
SPECIAL_EDITIONS = [
"Theatrical Cut",
"Director's Cut",
"Director Cut",
"Extended Edition",
"Ultimate Extended Edition",
"Special Edition",
"Collector's Edition",
"Criterion Collection",
"Fundamental Collection",
"Anniversary Edition",
"Redux",
"Final Cut",
"Alternate Cut",
"International Cut",
"Restored Version",
"Remastered",
"Unrated",
"Uncensored",
"Definitive Edition",
"Platinum Edition",
"Gold Edition",
"Diamond Edition",
"Steelbook Edition",
"Limited Edition",
"Deluxe Edition",
"Premium Edition",
"Complete Edition",
"Restored Edition",
"4K Restoration",
"HD Remaster",
"Director's Definitive Cut",
"Extended Director's Cut",
"Ultimate Director's Cut",
"Original Cut",
"Cinematic Cut",
"Roadshow Cut",
"Premiere Cut",
"Festival Cut",
"Workprint",
"Rough Cut",
"Special Assembly Cut",
"Amazon Edition",
"Amazon",
"Netflix Edition",
"HBO Edition",
]
SPECIAL_EDITIONS = {
"Theatrical Cut": ["Theatrical Cut"],
"Director's Cut": ["Director's Cut", "Director Cut"],
"Extended Edition": ["Extended Edition", "Ultimate Extended Edition"],
"Special Edition": ["Special Edition"],
"Collector's Edition": ["Collector's Edition"],
"Criterion Collection": ["Criterion Collection"],
"Anniversary Edition": ["Anniversary Edition"],
"Redux": ["Redux"],
"Final Cut": ["Final Cut"],
"Alternate Cut": ["Alternate Cut"],
"International Cut": ["International Cut"],
"Restored Edition": [
"Restored Edition",
"Restored Version",
"4K Restoration",
"Restoration",
],
"Remastered": ["Remastered", "Remaster", "HD Remaster"],
"Unrated": ["Unrated"],
"Uncensored": ["Uncensored"],
"Definitive Edition": ["Definitive Edition"],
"Platinum Edition": ["Platinum Edition"],
"Gold Edition": ["Gold Edition"],
"Diamond Edition": ["Diamond Edition"],
"Steelbook Edition": ["Steelbook Edition"],
"Limited Edition": ["Limited Edition"],
"Deluxe Edition": ["Deluxe Edition"],
"Premium Edition": ["Premium Edition"],
"Complete Edition": ["Complete Edition"],
"AI Remaster": ["AI Remaster", "AI Remastered"],
"Upscaled": [
"AI Upscaled",
"AI Enhanced",
"AI Upscale",
"Upscaled",
"Upscale",
"Upscaling",
],
"Director's Definitive Cut": ["Director's Definitive Cut"],
"Extended Director's Cut": ["Extended Director's Cut", "Ultimate Director's Cut"],
"Original Cut": ["Original Cut"],
"Cinematic Cut": ["Cinematic Cut"],
"Roadshow Cut": ["Roadshow Cut"],
"Premiere Cut": ["Premiere Cut"],
"Festival Cut": ["Festival Cut"],
"Workprint": ["Workprint"],
"Rough Cut": ["Rough Cut"],
"Special Assembly Cut": ["Special Assembly Cut"],
"Amazon Edition": ["Amazon Edition", "Amazon"],
"Netflix Edition": ["Netflix Edition"],
"HBO Edition": ["HBO Edition"],
}

View File

@@ -216,22 +216,23 @@ class FilenameExtractor:
# Look for special edition indicators in brackets or as standalone text
special_info = []
for edition in SPECIAL_EDITIONS:
# Check in brackets: [Theatrical Cut], [Director's Cut], etc.
bracket_pattern = r'\[([^\]]+)\]'
brackets = re.findall(bracket_pattern, self.file_name)
for bracket in brackets:
# Check if bracket contains comma-separated items
items = [item.strip() for item in bracket.split(',')]
for item in items:
if edition.lower() == item.lower().strip():
if edition not in special_info:
special_info.append(edition)
# Check as standalone text (case-insensitive)
if re.search(r'\b' + re.escape(edition) + r'\b', self.file_name, re.IGNORECASE):
if edition not in special_info:
special_info.append(edition)
for canonical_edition, variants in SPECIAL_EDITIONS.items():
for edition in variants:
# Check in brackets: [Theatrical Cut], [Director's Cut], etc.
bracket_pattern = r'\[([^\]]+)\]'
brackets = re.findall(bracket_pattern, self.file_name)
for bracket in brackets:
# Check if bracket contains comma-separated items
items = [item.strip() for item in bracket.split(',')]
for item in items:
if edition.lower() == item.lower().strip():
if canonical_edition not in special_info:
special_info.append(canonical_edition)
# Check as standalone text (case-insensitive)
if re.search(r'\b' + re.escape(edition) + r'\b', self.file_name, re.IGNORECASE):
if canonical_edition not in special_info:
special_info.append(canonical_edition)
return special_info

2
uv.lock generated
View File

@@ -164,7 +164,7 @@ wheels = [
[[package]]
name = "renamer"
version = "0.3.2"
version = "0.3.3"
source = { editable = "." }
dependencies = [
{ name = "langcodes" },