JM-EH-Downloader / jm_logic.py
jscmp4's picture
Update jm_logic.py
145d889 verified
import os
import shutil
import yaml
import logging
import io
import re
from jmcomic import create_option
from utils import BASE_DIR, PDF_FINAL_DIR, sanitize_filename, manual_merge_pdf
# --- 日志捕获设置 (专用于 JMComic) ---
log_capture_string = io.StringIO()
ch = logging.StreamHandler(log_capture_string)
ch.setLevel(logging.INFO)
logger = logging.getLogger('jmcomic')
logger.addHandler(ch)
logger.setLevel(logging.INFO)
TEMP_YML = "jm_option_temp.yml"
# 🔴 改动1:新增 quality 参数
def run_jm_download(album_ids_str, auth_type, cookies_input, username_input, password_input, quality):
# 1. 解析 ID 列表
id_list = [x.strip() for x in re.split(r'[\s,,\n]+', album_ids_str) if x.strip()]
if not id_list:
yield None, "❌ 错误: 请至少输入一个本子 ID", "未检测到 ID"
return
# 2. 初始化环境
log_capture_string.truncate(0)
log_capture_string.seek(0)
# 临时目录
raw_download_dir = os.path.join(BASE_DIR, "raw_jm")
# 3. 生成基础配置
config = {
'client': {'impl': 'api', 'retry_times': 3},
'download': {
'image': {'suffix': '.jpg', 'quality': 85}, # 这里的quality是下载时的jpg质量,和我们后期的压缩不同,保持默认即可
'threading': {'batch_count': 5}
},
'dir_rule': {'base_dir': raw_download_dir},
}
if auth_type == "使用账号密码 (推荐)":
if not username_input or not password_input:
yield None, "❌ 错误: 请填写账号和密码", "参数错误"
return
config['client']['username'] = username_input
config['client']['password'] = password_input
with open(TEMP_YML, 'w', encoding='utf-8') as f:
yaml.dump(config, f)
# 4. 创建 Option
try:
option = create_option(TEMP_YML)
if auth_type == "使用 Cookies (手动)" and cookies_input:
option.call_once()
option.headers['cookie'] = cookies_input.strip()
except Exception as e:
yield None, f"❌ 配置初始化失败: {e}", "初始化错误"
return
# 5. 循环下载
success_files = []
total_count = len(id_list)
for index, album_id in enumerate(id_list):
current_num = index + 1
progress_str = f"({current_num}/{total_count})"
# 清理旧图片
if os.path.exists(raw_download_dir):
shutil.rmtree(raw_download_dir)
os.makedirs(raw_download_dir, exist_ok=True)
yield success_files, f"🔄 {progress_str} 正在处理 ID: {album_id} ...", f"处理中 {current_num}/{total_count}"
real_title = f"Unknown_{album_id}"
try:
# A. 获取信息
client = option.build_jm_client()
try:
album_detail = client.get_album_detail(album_id)
real_title = album_detail.title
except Exception:
pass
# B. 下载
yield success_files, f"📥 {progress_str} 正在下载图片: {real_title}...", f"下载中 {current_num}/{total_count}"
option.download_album(album_id)
# C. 合并
yield success_files, f"🔨 {progress_str} 正在压缩并合并 PDF (画质:{quality})...", f"合并中 {current_num}/{total_count}"
safe_title = sanitize_filename(real_title)
# 🔴 改动2:文件名加上画质标记
quality_tag = "Original" if quality >= 100 else f"Q{quality}"
final_pdf_name = f"[JM][{quality_tag}] {safe_title}.pdf"
final_pdf_path = os.path.join(PDF_FINAL_DIR, final_pdf_name)
try:
# 🔴 改动3:传入 quality 参数
manual_merge_pdf(raw_download_dir, final_pdf_path, quality=quality)
except Exception as e:
logger.error(f"合并PDF失败: {e}")
yield success_files, f"❌ {progress_str} 合并失败: {e}", "合并出错"
continue
success_files.append(final_pdf_path)
yield success_files, f"✅ {progress_str} 完成: {real_title}", f"完成 {current_num}/{total_count}"
except Exception as e:
import traceback
traceback.print_exc()
continue
full_log = log_capture_string.getvalue()
if not success_files:
yield None, f"❌ 任务结束,无成功文件。\n日志:\n{full_log[-1000:]}", "全部失败"
else:
yield success_files, f"🎉 全部处理完毕!成功: {len(success_files)}个", "全部完成"