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

Upload 20 files

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