Spaces:
Paused
Paused
Upload 20 files
Browse files- app/sub_manager.py +18 -26
app/sub_manager.py
CHANGED
|
@@ -117,37 +117,40 @@ 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 |
-
"-
|
| 133 |
-
"
|
| 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
|
| 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,30 +162,19 @@ class SubscriptionManager:
|
|
| 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 |
-
|
| 168 |
-
|
| 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 |
-
|
| 184 |
-
|
| 185 |
-
|
|
|
|
| 186 |
|
| 187 |
except subprocess.TimeoutExpired:
|
| 188 |
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命令 - 使用 -i/-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 |
+
"-f", # 添加强制转换文件标志,禁止服务器模式
|
| 132 |
"-i", input_file, # 输入文件
|
| 133 |
+
"-o", self.config_path, # 输出文件
|
| 134 |
+
"-t", "clash" # 目标格式
|
| 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 |
# 检查 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 |
+
if os.path.exists(self.config_path) and os.path.getsize(self.config_path) > 0:
|
| 172 |
+
logger.info(f"配置文件已生成,路径: {self.config_path},大小: {os.path.getsize(self.config_path)} 字节")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
else:
|
| 174 |
+
logger.error(f"subconverter执行成功,但配置文件不存在或为空: {self.config_path}. 请检查subconverter日志了解详情。")
|
| 175 |
+
# 检查STDERR中是否有线索
|
| 176 |
+
error_detail = stderr if stderr else "(无错误输出)"
|
| 177 |
+
raise RuntimeError(f"subconverter执行成功但未生成有效配置文件。 Subconverter STDERR: {error_detail[:500]}...")
|
| 178 |
|
| 179 |
except subprocess.TimeoutExpired:
|
| 180 |
logger.error(f"执行subconverter超时 (超过60秒)")
|