From 36b6aafbc1d1c8cf7991004c3f67064ae7052e36 Mon Sep 17 00:00:00 2001 From: Serene-Arc Date: Sat, 13 Mar 2021 12:39:54 +1000 Subject: [PATCH] Limit name byte length --- bulkredditdownloader/file_name_formatter.py | 7 ++++--- bulkredditdownloader/tests/test_file_name_formatter.py | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bulkredditdownloader/file_name_formatter.py b/bulkredditdownloader/file_name_formatter.py index ecd71be..8003c6a 100644 --- a/bulkredditdownloader/file_name_formatter.py +++ b/bulkredditdownloader/file_name_formatter.py @@ -59,9 +59,10 @@ class FileNameFormatter: @staticmethod def _limit_file_name_length(filename: str, ending: str) -> str: - max_length = 255 - len(ending) - if len(filename) > max_length: - filename = filename[:max_length] + max_length_chars = 255 - len(ending) + max_length_bytes = 255 - len(ending.encode('utf-8')) + while len(filename) > max_length_chars or len(filename.encode('utf-8')) > max_length_bytes: + filename = filename[:-1] return filename + ending def format_resource_paths(self, resources: list[Resource], diff --git a/bulkredditdownloader/tests/test_file_name_formatter.py b/bulkredditdownloader/tests/test_file_name_formatter.py index 2e9d7bc..ba8042d 100644 --- a/bulkredditdownloader/tests/test_file_name_formatter.py +++ b/bulkredditdownloader/tests/test_file_name_formatter.py @@ -131,10 +131,13 @@ def test_format_multiple_resources(): ('A' * 300, '.png'), ('A' * 300, '_1.png'), ('a' * 300, '_1000.jpeg'), + ('😍💕✨' * 100, '_1.png'), )) def test_limit_filename_length(test_filename: str, test_ending: str): result = FileNameFormatter._limit_file_name_length(test_filename, test_ending) assert len(result) <= 255 + assert len(result.encode('utf-8')) <= 255 + assert isinstance(result, str) @pytest.mark.online