fix for windows
This commit is contained in:
parent
842e15c4f0
commit
6133d3e243
2 changed files with 19 additions and 21 deletions
|
|
@ -10,12 +10,8 @@ from ytdl_sub.validators.string_formatter_validators import OverridesStringForma
|
|||
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
|
||||
from ytdl_sub.validators.validators import StringValidator
|
||||
|
||||
_MAX_FILE_NAME_LEN: int = 0
|
||||
_MAX_FILE_NAME_BYTES: int = 0
|
||||
if IS_WINDOWS:
|
||||
from ctypes.wintypes import MAX_PATH
|
||||
|
||||
_MAX_FILE_NAME_LEN = MAX_PATH
|
||||
_MAX_FILE_NAME_BYTES = 255
|
||||
else:
|
||||
_MAX_FILE_NAME_BYTES = os.pathconf("/", "PC_NAME_MAX")
|
||||
|
||||
|
|
@ -48,9 +44,7 @@ class StringFormatterFilePathValidator(StringFormatterValidator):
|
|||
|
||||
@classmethod
|
||||
def _is_file_name_too_long(cls, file_name: str) -> bool:
|
||||
return (_MAX_FILE_NAME_LEN and len(file_name) > _MAX_FILE_NAME_LEN) or (
|
||||
_MAX_FILE_NAME_BYTES and len(file_name.encode("utf-8")) > _MAX_FILE_NAME_BYTES
|
||||
)
|
||||
return len(file_name.encode("utf-8")) > _MAX_FILE_NAME_BYTES
|
||||
|
||||
@classmethod
|
||||
def _get_extension_split(cls, file_name: str) -> Tuple[str, str]:
|
||||
|
|
@ -71,13 +65,10 @@ class StringFormatterFilePathValidator(StringFormatterValidator):
|
|||
@classmethod
|
||||
def _truncate_file_name(cls, file_name: str) -> str:
|
||||
file_sub_name, file_ext = cls._get_extension_split(file_name)
|
||||
if _MAX_FILE_NAME_LEN:
|
||||
to_trim = len(file_name) - _MAX_FILE_NAME_LEN + 1
|
||||
file_sub_name = file_sub_name[:-to_trim]
|
||||
elif _MAX_FILE_NAME_BYTES:
|
||||
desired_size = _MAX_FILE_NAME_BYTES - len(file_ext.encode("utf-8")) - 1
|
||||
while len(file_sub_name.encode("utf-8")) > desired_size:
|
||||
file_sub_name = file_sub_name[:-1]
|
||||
|
||||
desired_size = _MAX_FILE_NAME_BYTES - len(file_ext.encode("utf-8")) - 1
|
||||
while len(file_sub_name.encode("utf-8")) > desired_size:
|
||||
file_sub_name = file_sub_name[:-1]
|
||||
|
||||
return f"{file_sub_name}.{file_ext}"
|
||||
|
||||
|
|
|
|||
|
|
@ -11,14 +11,17 @@ class TestStringFormatterFilePathValidator:
|
|||
@pytest.mark.parametrize(
|
||||
"ext",
|
||||
[
|
||||
".mp4",
|
||||
".info.json",
|
||||
"mp4",
|
||||
"info.json",
|
||||
]
|
||||
+ [f".en.{ext}" for ext in SUBTITLE_EXTENSIONS],
|
||||
+ [f"en-US.{ext}" for ext in SUBTITLE_EXTENSIONS],
|
||||
)
|
||||
def test_truncates_file_name_successfully(self, ext: str):
|
||||
@pytest.mark.parametrize('file_name_char', ['a', '𒃀'])
|
||||
@pytest.mark.parametrize('file_name_len', [10, 10000])
|
||||
def test_truncates_file_name_successfully(self, ext: str, file_name_char: str, file_name_len: int):
|
||||
ext = f".{ext}" # pytest args with . in the beginning act weird
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
file_name = ("a" * 10000) + ext
|
||||
file_name = (file_name_char * file_name_len) + ext
|
||||
file_path = str(Path(temp_dir) / file_name)
|
||||
|
||||
formatter = StringFormatterFilePathValidator(name="test", value=str(file_path))
|
||||
|
|
@ -30,4 +33,8 @@ class TestStringFormatterFilePathValidator:
|
|||
|
||||
# Ensure it can actually open the file
|
||||
with open(truncated_file_path, "w", encoding="utf-8"):
|
||||
pass
|
||||
# Make sure the file is actually in the directory
|
||||
dir_paths = list(Path(temp_dir).rglob("*"))
|
||||
|
||||
assert len(dir_paths) == 1
|
||||
assert Path(truncated_file_path) == dir_paths[0]
|
||||
|
|
|
|||
Loading…
Reference in a new issue