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] [project]
name = "renamer" name = "renamer"
version = "0.3.2" version = "0.3.3"
description = "Terminal-based media file renamer and metadata viewer" description = "Terminal-based media file renamer and metadata viewer"
readme = "README.md" readme = "README.md"
requires-python = ">=3.11" requires-python = ">=3.11"

View File

@@ -133,50 +133,56 @@ MOVIE_DB_DICT = {
}, },
} }
SPECIAL_EDITIONS = [ SPECIAL_EDITIONS = {
"Theatrical Cut", "Theatrical Cut": ["Theatrical Cut"],
"Director's Cut", "Director's Cut": ["Director's Cut", "Director Cut"],
"Director Cut", "Extended Edition": ["Extended Edition", "Ultimate Extended Edition"],
"Extended Edition", "Special Edition": ["Special Edition"],
"Ultimate Extended Edition", "Collector's Edition": ["Collector's Edition"],
"Special Edition", "Criterion Collection": ["Criterion Collection"],
"Collector's Edition", "Anniversary Edition": ["Anniversary Edition"],
"Criterion Collection", "Redux": ["Redux"],
"Fundamental Collection", "Final Cut": ["Final Cut"],
"Anniversary Edition", "Alternate Cut": ["Alternate Cut"],
"Redux", "International Cut": ["International Cut"],
"Final Cut", "Restored Edition": [
"Alternate Cut", "Restored Edition",
"International Cut", "Restored Version",
"Restored Version", "4K Restoration",
"Remastered", "Restoration",
"Unrated", ],
"Uncensored", "Remastered": ["Remastered", "Remaster", "HD Remaster"],
"Definitive Edition", "Unrated": ["Unrated"],
"Platinum Edition", "Uncensored": ["Uncensored"],
"Gold Edition", "Definitive Edition": ["Definitive Edition"],
"Diamond Edition", "Platinum Edition": ["Platinum Edition"],
"Steelbook Edition", "Gold Edition": ["Gold Edition"],
"Limited Edition", "Diamond Edition": ["Diamond Edition"],
"Deluxe Edition", "Steelbook Edition": ["Steelbook Edition"],
"Premium Edition", "Limited Edition": ["Limited Edition"],
"Complete Edition", "Deluxe Edition": ["Deluxe Edition"],
"Restored Edition", "Premium Edition": ["Premium Edition"],
"4K Restoration", "Complete Edition": ["Complete Edition"],
"HD Remaster", "AI Remaster": ["AI Remaster", "AI Remastered"],
"Director's Definitive Cut", "Upscaled": [
"Extended Director's Cut", "AI Upscaled",
"Ultimate Director's Cut", "AI Enhanced",
"Original Cut", "AI Upscale",
"Cinematic Cut", "Upscaled",
"Roadshow Cut", "Upscale",
"Premiere Cut", "Upscaling",
"Festival Cut", ],
"Workprint", "Director's Definitive Cut": ["Director's Definitive Cut"],
"Rough Cut", "Extended Director's Cut": ["Extended Director's Cut", "Ultimate Director's Cut"],
"Special Assembly Cut", "Original Cut": ["Original Cut"],
"Amazon Edition", "Cinematic Cut": ["Cinematic Cut"],
"Amazon", "Roadshow Cut": ["Roadshow Cut"],
"Netflix Edition", "Premiere Cut": ["Premiere Cut"],
"HBO Edition", "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 # Look for special edition indicators in brackets or as standalone text
special_info = [] special_info = []
for edition in SPECIAL_EDITIONS: for canonical_edition, variants in SPECIAL_EDITIONS.items():
# Check in brackets: [Theatrical Cut], [Director's Cut], etc. for edition in variants:
bracket_pattern = r'\[([^\]]+)\]' # Check in brackets: [Theatrical Cut], [Director's Cut], etc.
brackets = re.findall(bracket_pattern, self.file_name) bracket_pattern = r'\[([^\]]+)\]'
for bracket in brackets: brackets = re.findall(bracket_pattern, self.file_name)
# Check if bracket contains comma-separated items for bracket in brackets:
items = [item.strip() for item in bracket.split(',')] # Check if bracket contains comma-separated items
for item in items: items = [item.strip() for item in bracket.split(',')]
if edition.lower() == item.lower().strip(): for item in items:
if edition not in special_info: if edition.lower() == item.lower().strip():
special_info.append(edition) 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): # Check as standalone text (case-insensitive)
if edition not in special_info: if re.search(r'\b' + re.escape(edition) + r'\b', self.file_name, re.IGNORECASE):
special_info.append(edition) if canonical_edition not in special_info:
special_info.append(canonical_edition)
return special_info return special_info

2
uv.lock generated
View File

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