fix: 修复 Linux 下路径含空格被 shell 切割及输出目录不存在问题
1. _process_patterns 新增防御性合并逻辑: - 检测 patterns 中是否包含 > 重定向标记 - 若存在则将所有 token 合并为完整 pattern(用空格还原) - 解决 Linux bash 将 '路径/歌曲名.ncm>./1/2.flac' 切割成多个 token 的问题 2. convert_file 新增自动创建输出目录: - 在调用 _convert_audio 前自动 mkdir -p 父目录 - 目录创建失败时记录警告并标记为失败 测试用例: - Linux shell 切割合并测试 ✓ - _split_line 保留空格测试 ✓ - _parse_gt_output 空格规范化测试 ✓
This commit is contained in:
+17
-1
@@ -397,6 +397,14 @@ def convert_file(file_path, output_fmt="mp3", delete_flag=False, output_path=Non
|
|||||||
out_fmt = "mp3"
|
out_fmt = "mp3"
|
||||||
if output_path is None:
|
if output_path is None:
|
||||||
output_path = _resolve_output(file_path, out_fmt)
|
output_path = _resolve_output(file_path, out_fmt)
|
||||||
|
# 防御工程:确保输出目录存在,不存在则自动创建
|
||||||
|
try:
|
||||||
|
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
except Exception as e:
|
||||||
|
print(" [WARN] 无法创建输出目录: " + str(Path(output_path).parent) + " -> " + str(e))
|
||||||
|
stats["failed"] += 1
|
||||||
|
stats["files"].append((file_path, False))
|
||||||
|
return
|
||||||
try:
|
try:
|
||||||
_convert_audio(raw, container, out_fmt, output_path)
|
_convert_audio(raw, container, out_fmt, output_path)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -434,7 +442,15 @@ def expand_files(patterns):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def _process_patterns(patterns, output_fmt, delete_flag):
|
def _process_patterns(patterns, output_fmt, delete_flag):
|
||||||
"""处理文件模式列表,支持 > 重定向语法。"""
|
"""处理文件模式列表,支持 > 重定向语法。
|
||||||
|
|
||||||
|
防御工程:Linux shell 会把含空格路径在 '>' 处切开的 token 拆成多个,
|
||||||
|
例如用户输入 `路径/歌曲名.mp3>./1/2.flac` 变成 ["...mp3>./1", "2.flac"],
|
||||||
|
这里做后处理合并,把它们重新拼成一个完整的重定向 pattern。
|
||||||
|
"""
|
||||||
|
# 如果任何 token 包含 >,说明是重定向模式,合并所有 token(用空格还原原始输入)
|
||||||
|
if any(">" in pat for pat in patterns):
|
||||||
|
patterns = [" ".join(patterns)]
|
||||||
for pat in patterns:
|
for pat in patterns:
|
||||||
if ">" in pat:
|
if ">" in pat:
|
||||||
input_spec, output_spec = pat.split(">", 1)
|
input_spec, output_spec = pat.split(">", 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user