Spaces:
Paused
Paused
Upload 20 files
Browse files- app/sub_manager.py +24 -16
app/sub_manager.py
CHANGED
|
@@ -117,40 +117,37 @@ class SubscriptionManager:
|
|
| 117 |
RuntimeError: 如果转换失败
|
| 118 |
"""
|
| 119 |
logger.info(f"正在将订阅转换为Clash配置")
|
| 120 |
-
logger.info(f"输入文件: {input_file},
|
| 121 |
|
| 122 |
# 确保数据目录存在
|
| 123 |
data_dir = os.path.dirname(self.config_path)
|
| 124 |
os.makedirs(data_dir, exist_ok=True)
|
| 125 |
|
| 126 |
-
# 准备subconverter命令 -
|
| 127 |
minimal_pref_path = os.path.join(os.path.dirname(self.subconverter_path), "minimal_pref.yml")
|
| 128 |
|
| 129 |
cmd = [
|
| 130 |
self.subconverter_path,
|
| 131 |
"-i", input_file, # 输入文件
|
| 132 |
-
"-o", self.config_path, # 输出文件
|
| 133 |
"-t", "clash", # 目标格式
|
| 134 |
"--config", minimal_pref_path # 强制使用空白配置,避免默认行为
|
| 135 |
]
|
| 136 |
|
| 137 |
logger.info(f"执行命令: {' '.join(cmd)}")
|
| 138 |
|
| 139 |
-
# 检查 subconverter 是否存在
|
| 140 |
if not os.path.exists(self.subconverter_path):
|
| 141 |
-
# ... (省略 subconverter 未找到的回退逻辑) ...
|
| 142 |
logger.error(f"subconverter未找到: {self.subconverter_path}. 无法转换配置。")
|
| 143 |
raise RuntimeError(f"无法转换配置 (subconverter未找到)")
|
| 144 |
|
| 145 |
# --- 正式执行 subconverter ---
|
| 146 |
try:
|
| 147 |
-
# 执行subconverter
|
| 148 |
process = subprocess.Popen(
|
| 149 |
cmd,
|
| 150 |
stdout=subprocess.PIPE,
|
| 151 |
stderr=subprocess.PIPE,
|
| 152 |
universal_newlines=True,
|
| 153 |
-
cwd=os.path.dirname(self.subconverter_path) # 尝试在subconverter目录下运行
|
| 154 |
)
|
| 155 |
stdout, stderr = process.communicate(timeout=60)
|
| 156 |
|
|
@@ -162,19 +159,30 @@ class SubscriptionManager:
|
|
| 162 |
# 检查 subconverter 返回码
|
| 163 |
if process.returncode != 0:
|
| 164 |
logger.error(f"subconverter执行失败,返回码: {process.returncode}.")
|
| 165 |
-
# ... (省略 subconverter 失败的回退逻辑) ...
|
| 166 |
raise RuntimeError(f"subconverter转换失败(code {process.returncode})。 Subconverter STDERR: {stderr[:200]}...")
|
| 167 |
else:
|
| 168 |
-
# subconverter 返回码为 0
|
| 169 |
logger.info("subconverter成功执行 (返回码 0)")
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
else:
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
raise RuntimeError(f"subconverter执行成功但未生成有效配置文件。 Subconverter STDERR: {error_detail[:500]}...")
|
| 178 |
|
| 179 |
except subprocess.TimeoutExpired:
|
| 180 |
logger.error(f"执行subconverter超时 (超过60秒)")
|
|
|
|
| 117 |
RuntimeError: 如果转换失败
|
| 118 |
"""
|
| 119 |
logger.info(f"正在将订阅转换为Clash配置")
|
| 120 |
+
logger.info(f"输入文件: {input_file}, 预期配置路径: {self.config_path}")
|
| 121 |
|
| 122 |
# 确保数据目录存在
|
| 123 |
data_dir = os.path.dirname(self.config_path)
|
| 124 |
os.makedirs(data_dir, exist_ok=True)
|
| 125 |
|
| 126 |
+
# 准备subconverter命令 - 尝试捕获stdout,移除 -o
|
| 127 |
minimal_pref_path = os.path.join(os.path.dirname(self.subconverter_path), "minimal_pref.yml")
|
| 128 |
|
| 129 |
cmd = [
|
| 130 |
self.subconverter_path,
|
| 131 |
"-i", input_file, # 输入文件
|
|
|
|
| 132 |
"-t", "clash", # 目标格式
|
| 133 |
"--config", minimal_pref_path # 强制使用空白配置,避免默认行为
|
| 134 |
]
|
| 135 |
|
| 136 |
logger.info(f"执行命令: {' '.join(cmd)}")
|
| 137 |
|
| 138 |
+
# 检查 subconverter 是否存在
|
| 139 |
if not os.path.exists(self.subconverter_path):
|
|
|
|
| 140 |
logger.error(f"subconverter未找到: {self.subconverter_path}. 无法转换配置。")
|
| 141 |
raise RuntimeError(f"无法转换配置 (subconverter未找到)")
|
| 142 |
|
| 143 |
# --- 正式执行 subconverter ---
|
| 144 |
try:
|
| 145 |
+
# 执行subconverter,移除 cwd
|
| 146 |
process = subprocess.Popen(
|
| 147 |
cmd,
|
| 148 |
stdout=subprocess.PIPE,
|
| 149 |
stderr=subprocess.PIPE,
|
| 150 |
universal_newlines=True,
|
|
|
|
| 151 |
)
|
| 152 |
stdout, stderr = process.communicate(timeout=60)
|
| 153 |
|
|
|
|
| 159 |
# 检查 subconverter 返回码
|
| 160 |
if process.returncode != 0:
|
| 161 |
logger.error(f"subconverter执行失败,返回码: {process.returncode}.")
|
|
|
|
| 162 |
raise RuntimeError(f"subconverter转换失败(code {process.returncode})。 Subconverter STDERR: {stderr[:200]}...")
|
| 163 |
else:
|
| 164 |
+
# subconverter 返回码为 0
|
| 165 |
logger.info("subconverter成功执行 (返回码 0)")
|
| 166 |
+
|
| 167 |
+
# 检查 stdout 是否有内容
|
| 168 |
+
if stdout and len(stdout.strip()) > 10: # 简单检查非空且有一定长度
|
| 169 |
+
logger.info("subconverter 输出了内容到 stdout,尝试写入文件...")
|
| 170 |
+
try:
|
| 171 |
+
with open(self.config_path, "w", encoding="utf-8") as f:
|
| 172 |
+
f.write(stdout)
|
| 173 |
+
# 验证文件写入和大小
|
| 174 |
+
if os.path.exists(self.config_path) and os.path.getsize(self.config_path) > 0:
|
| 175 |
+
logger.info(f"配置文件已通过 stdout 成功生成,路径: {self.config_path},大小: {os.path.getsize(self.config_path)} 字节")
|
| 176 |
+
else:
|
| 177 |
+
logger.error(f"尝试通过 stdout 写入配置文件失败或文件为空: {self.config_path}")
|
| 178 |
+
raise RuntimeError("subconverter 成功执行但无法将 stdout 写入有效配置文件")
|
| 179 |
+
except Exception as write_e:
|
| 180 |
+
logger.error(f"将 subconverter stdout 写入文件时出错: {write_e}")
|
| 181 |
+
raise RuntimeError(f"将 subconverter stdout 写入文件时出错: {write_e}")
|
| 182 |
else:
|
| 183 |
+
# 返回码 0 但 stdout 为空
|
| 184 |
+
logger.error(f"subconverter执行成功,但未输出任何内容到 stdout。请检查 subconverter 日志。 Subconverter STDERR: {stderr[:500]}...")
|
| 185 |
+
raise RuntimeError(f"subconverter执行成功但未产生任何输出。 Subconverter STDERR: {stderr[:500]}...")
|
|
|
|
| 186 |
|
| 187 |
except subprocess.TimeoutExpired:
|
| 188 |
logger.error(f"执行subconverter超时 (超过60秒)")
|