Spaces:
Sleeping
Sleeping
File size: 5,629 Bytes
aa69035 1b29f3e ed1fb59 97d9fdc 1b29f3e a8f4af1 d43ab45 a8f4af1 d43ab45 a8f4af1 d43ab45 a8f4af1 d43ab45 c0af962 97d9fdc c0af962 d43ab45 c0af962 d43ab45 97d9fdc d43ab45 97d9fdc d43ab45 c0af962 97d9fdc 1b29f3e d43ab45 c0af962 d43ab45 aa69035 ed1fb59 c0af962 aa69035 ed1fb59 aa69035 c0af962 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | 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) |