diff --git a/dist/renamer-0.3.3-py3-none-any.whl b/dist/renamer-0.3.3-py3-none-any.whl new file mode 100644 index 0000000..d29ec26 Binary files /dev/null and b/dist/renamer-0.3.3-py3-none-any.whl differ diff --git a/pyproject.toml b/pyproject.toml index ee8ffe1..96a7396 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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" diff --git a/renamer/constants.py b/renamer/constants.py index 5904934..fe06a6c 100644 --- a/renamer/constants.py +++ b/renamer/constants.py @@ -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"], +} diff --git a/renamer/extractors/filename_extractor.py b/renamer/extractors/filename_extractor.py index f9302f0..e32c497 100644 --- a/renamer/extractors/filename_extractor.py +++ b/renamer/extractors/filename_extractor.py @@ -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 diff --git a/uv.lock b/uv.lock index 21a3abf..67476df 100644 --- a/uv.lock +++ b/uv.lock @@ -164,7 +164,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.3.2" +version = "0.3.3" source = { editable = "." } dependencies = [ { name = "langcodes" },