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)