clash-linux commited on
Commit
a3023dd
·
verified ·
1 Parent(s): d8d9884

Upload 20 files

Browse files
Files changed (1) hide show
  1. 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}, 预期配置路径: {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,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
- # 检查 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秒)")
 
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秒)")