From 4dc86441ce596bc58476766c96abf402608df20a Mon Sep 17 00:00:00 2001 From: ypshidifu Date: Sat, 19 Sep 2026 18:08:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Linux=20=E4=B8=8B?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=90=AB=E7=A9=BA=E6=A0=BC=E8=A2=AB=20shell?= =?UTF-8?q?=20=E5=88=87=E5=89=B2=E5=8F=8A=E8=BE=93=E5=87=BA=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E4=B8=8D=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 空格规范化测试 ✓ --- vipsong.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/vipsong.py b/vipsong.py index 39c83ea..30b8328 100644 --- a/vipsong.py +++ b/vipsong.py @@ -397,6 +397,14 @@ def convert_file(file_path, output_fmt="mp3", delete_flag=False, output_path=Non out_fmt = "mp3" if output_path is None: 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: _convert_audio(raw, container, out_fmt, output_path) except Exception as e: @@ -434,7 +442,15 @@ def expand_files(patterns): return result 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: if ">" in pat: input_spec, output_spec = pat.split(">", 1)