jscmp4's picture
Update app.py
ed1fb59 verified
import gradio as gr
from jm_logic import run_jm_download
# 合并导入,避免重复
from eh_logic import run_eh_download, debug_eh_info
# --- 界面构建 ---
with gr.Blocks(title="二次元聚合下载器") as demo:
gr.Markdown("## 📦 二次元聚合下载器 (JMComic + E-Hentai)")
gr.Markdown("支持多线程下载、自动合并 PDF、智能画质压缩。")
with gr.Tabs():
# ================= JMComic Tab =================
with gr.TabItem("🦄 JMComic (ID下载)"):
gr.Markdown("一行一个 ID,下载完一个才会开始下一个,稳定防崩。")
with gr.Row():
jm_inp_ids = gr.Textbox(
label="输入本子 ID 列表 (回车分隔)",
placeholder="438696\n123456",
lines=5
)
with gr.Row():
# ✨ JM 也加上了画质滑块
jm_quality = gr.Slider(
minimum=10, maximum=100, value=75, step=5,
label="PDF 画质压缩 (100=原图无损, 75=推荐均衡)",
info="JM原图通常很大,建议设置 75 以大幅节省体积。"
)
with gr.Row():
jm_auth_select = gr.Radio(
["使用账号密码 (推荐)", "使用 Cookies (手动)"],
label="登录方式",
value="使用账号密码 (推荐)"
)
with gr.Group(visible=True) as group_user:
with gr.Row():
jm_inp_user = gr.Textbox(label="用户名", placeholder="JM账号")
jm_inp_pass = gr.Textbox(label="密码", type="password")
with gr.Group(visible=False) as group_cookie:
jm_inp_cookie = gr.Textbox(label="Cookies", placeholder="key=value...")
def toggle_auth(choice):
if choice == "使用账号密码 (推荐)":
return gr.update(visible=True), gr.update(visible=False)
else:
return gr.update(visible=False), gr.update(visible=True)
jm_auth_select.change(fn=toggle_auth, inputs=jm_auth_select, outputs=[group_user, group_cookie])
jm_btn = gr.Button("🚀 开始下载 (JM)", variant="primary")
with gr.Row():
jm_badge = gr.Label(value="Ready", label="状态")
jm_log = gr.Textbox(label="运行日志", lines=5)
jm_files = gr.File(label="下载结果", file_count="multiple")
# 🔴 记得传入 jm_quality
jm_btn.click(
fn=run_jm_download,
inputs=[jm_inp_ids, jm_auth_select, jm_inp_cookie, jm_inp_user, jm_inp_pass, jm_quality],
outputs=[jm_files, jm_log, jm_badge]
)
# ================= E-Hentai Tab =================
with gr.TabItem("🐼 E-Hentai (链接下载)"):
gr.Markdown("**提示**:必须填写 Cookies (Netscape格式) 才能下载 EX 站或原图。")
with gr.Row():
eh_url = gr.Textbox(
label="画廊链接 (URL)",
placeholder="https://e-hentai.org/g/xxxxx/yyyy/"
)
with gr.Row():
eh_quality = gr.Slider(
minimum=10, maximum=100, value=75, step=5,
label="PDF 画质压缩 (100=原图无损, 75=推荐均衡)",
info="数值越小文件越小。100为直接打包原图(速度最快),<100会进行重压缩(较慢)。"
)
with gr.Row():
eh_cookie = gr.Textbox(
label="Cookies (Netscape 格式)",
placeholder="# Netscape HTTP Cookie File\n.e-hentai.org\tTRUE\t/ ...",
lines=5,
info="请使用 Chrome 插件 'Get cookies.txt LOCALLY' 导出并在粘贴至此。"
)
eh_btn = gr.Button("🚀 开始下载 (EH)", variant="primary")
with gr.Row():
eh_badge = gr.Label(value="Ready", label="状态")
eh_log = gr.Textbox(label="运行日志 (自动滚动)", lines=5)
eh_files = gr.File(label="下载结果")
# --- 正常下载事件绑定 ---
eh_btn.click(
fn=run_eh_download,
inputs=[eh_url, eh_cookie, eh_quality],
outputs=[eh_files, eh_log, eh_badge]
)
# ================= 🆕 新增:调试工具区域 =================
gr.Markdown("---") # 分割线
with gr.Accordion("🛠️ 调试工具 (遇到 Unknown_Gallery 或 失败时点我)", open=False):
gr.Markdown("如果不清楚为什么下载失败,或者标题显示 Unknown,请点击下方按钮查看详细诊断报告。")
debug_btn = gr.Button("🔍 运行标题诊断", variant="secondary")
debug_out = gr.Textbox(label="诊断报告 (原始 JSON 输出)", lines=15)
# --- 调试按钮事件绑定 ---
debug_btn.click(
fn=debug_eh_info,
inputs=[eh_url, eh_cookie],
outputs=[debug_out]
)
if __name__ == "__main__":
demo.queue().launch(ssr_mode=False, show_error=True)