From 229478ce64a165849b4559a034fceaf35efdefc6 Mon Sep 17 00:00:00 2001 From: sHa Date: Sat, 27 Dec 2025 05:49:56 +0000 Subject: [PATCH] feat: Enhance frame class extraction logic to include width matching and update test assertions --- dist/renamer-0.2.12-py3-none-any.whl | Bin 0 -> 33414 bytes pyproject.toml | 2 +- renamer/extractors/mediainfo_extractor.py | 59 ++++++++++++++-------- renamer/test/test_mediainfo_extractor.py | 2 +- uv.lock | 2 +- 5 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 dist/renamer-0.2.12-py3-none-any.whl diff --git a/dist/renamer-0.2.12-py3-none-any.whl b/dist/renamer-0.2.12-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..93454272e24742085cf6ec4d57da39e708f0a904 GIT binary patch literal 33414 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

D%V5Pk0xeWw86APU%g@P)`s|bHo4`IE3LPa6 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 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 5536cda..2265cd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "renamer" -version = "0.2.11" +version = "0.2.12" description = "Terminal-based media file renamer and metadata viewer" readme = "README.md" requires-python = ">=3.11" diff --git a/renamer/extractors/mediainfo_extractor.py b/renamer/extractors/mediainfo_extractor.py index fdd062b..0266d6f 100644 --- a/renamer/extractors/mediainfo_extractor.py +++ b/renamer/extractors/mediainfo_extractor.py @@ -58,28 +58,43 @@ class MediaInfoExtractor: if not self.video_tracks: return None height = getattr(self.video_tracks[0], 'height', None) - if height: - # Check if interlaced - interlaced = getattr(self.video_tracks[0], 'interlaced', None) - scan_type = 'i' if interlaced == 'Yes' else 'p' - - # First try exact match - frame_class = f"{height}{scan_type}" - if frame_class in FRAME_CLASSES: - return frame_class - - # Find closest height with same scan type - closest_height = None - min_diff = float('inf') - for fc, info in FRAME_CLASSES.items(): - if fc.endswith(scan_type): - diff = abs(height - info['nominal_height']) - if diff < min_diff: - min_diff = diff - closest_height = info['nominal_height'] - - if closest_height and min_diff <= 100: - return f"{closest_height}{scan_type}" + width = getattr(self.video_tracks[0], 'width', None) + if not height or not width: + return None + + # Check if interlaced + interlaced = getattr(self.video_tracks[0], 'interlaced', None) + scan_type = 'i' if interlaced == 'Yes' else 'p' + + # First, try to match width to typical widths + matching_classes = [] + for frame_class, info in FRAME_CLASSES.items(): + if width in info['typical_widths'] and frame_class.endswith(scan_type): + matching_classes.append((frame_class, info)) + + if matching_classes: + # If multiple matches, choose the one with closest height + closest = min(matching_classes, key=lambda x: abs(height - x[1]['nominal_height'])) + return closest[0] + + # If no width match, fall back to height-based matching + # First try exact match + frame_class = f"{height}{scan_type}" + if frame_class in FRAME_CLASSES: + return frame_class + + # Find closest height with same scan type + closest_height = None + min_diff = float('inf') + for fc, info in FRAME_CLASSES.items(): + if fc.endswith(scan_type): + diff = abs(height - info['nominal_height']) + if diff < min_diff: + min_diff = diff + closest_height = info['nominal_height'] + + if closest_height and min_diff <= 100: + return f"{closest_height}{scan_type}" return None def extract_resolution(self) -> tuple[int, int] | None: diff --git a/renamer/test/test_mediainfo_extractor.py b/renamer/test/test_mediainfo_extractor.py index 57aa6e3..a1de9d1 100644 --- a/renamer/test/test_mediainfo_extractor.py +++ b/renamer/test/test_mediainfo_extractor.py @@ -29,4 +29,4 @@ class TestMediaInfoExtractor: """Test extracting audio languages""" langs = extractor.extract_audio_langs() # Text files don't have audio tracks - assert langs == '' \ No newline at end of file + assert langs is None \ No newline at end of file diff --git a/uv.lock b/uv.lock index e2a09d0..a0c92fa 100644 --- a/uv.lock +++ b/uv.lock @@ -164,7 +164,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.2.11" +version = "0.2.12" source = { editable = "." } dependencies = [ { name = "langcodes" },