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)