Skip to content

Commit 90a261f

Browse files
authored
Merge-build: v2.7.1-beta
2 parents e93964c + 8aeeb09 commit 90a261f

File tree

17 files changed

+106
-90
lines changed

17 files changed

+106
-90
lines changed

GUI/browser_window.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from PyQt5.QtCore import Qt, QUrl
55
from PyQt5.QtNetwork import QNetworkCookie
66
from PyQt5.QtWidgets import QMainWindow
7+
from PyQt5.QtWebEngineWidgets import QWebEnginePage
78
from PyQt5.QtWebEngineCore import QWebEngineUrlRequestInterceptor
89
from qfluentwidgets import InfoBar, InfoBarPosition, FluentIcon as FIF, ToolTipFilter, ToolTipPosition
910
from qframelesswindow.webengine import FramelessWebEngineView
@@ -31,6 +32,23 @@ def interceptRequest(self, info):
3132
info.setHttpHeader(b"referer", self.referer_url.encode())
3233

3334

35+
class CustomWebEnginePage(QWebEnginePage):
36+
def createWindow(self, _type):
37+
new_page = QWebEnginePage(self.profile(), self.parent())
38+
new_page.urlChanged.connect(lambda url: self.setUrl(url) if url.isValid() else None)
39+
return new_page
40+
41+
42+
class CustomFramelessWebEngineView(FramelessWebEngineView):
43+
def createPage(self):
44+
return CustomWebEnginePage(self.page().profile(), self)
45+
46+
def __init__(self, parent=None):
47+
super().__init__(parent)
48+
custom_page = self.createPage()
49+
self.setPage(custom_page)
50+
51+
3452
class BrowserWindow(QMainWindow, Ui_browser):
3553
def __init__(self, gui, proxies: str = None):
3654
super(BrowserWindow, self).__init__()
@@ -40,8 +58,10 @@ def __init__(self, gui, proxies: str = None):
4058
if proxies:
4159
self.set_proxies(proxies)
4260
self.gui = gui
43-
self.view = FramelessWebEngineView(self)
61+
self.view = CustomFramelessWebEngineView(self)
4462
self.profile = self.view.page().profile()
63+
self.profile.setHttpUserAgent(
64+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36")
4565
self.profile.setUrlRequestInterceptor(self.interceptor)
4666
self.home_url = QUrl.fromLocalFile(self.gui.tf)
4767
self.set_env_mode()
@@ -65,7 +85,7 @@ def set_env_mode(self):
6585
self.set_cookies("ehentai")
6686
elif index == 6: # hitomi
6787
self.set_referer_nterceptor(self.gui.spiderUtils.index)
68-
88+
6989
def _set_dev_tools(self):
7090
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
7191
settings = self.view.settings()
@@ -222,8 +242,12 @@ def refresh_tf(html):
222242
self.js_execute("get_curr_hml();", refresh_tf)
223243

224244
# ---子任务模块
225-
def init_tasks_progress_panel(self):
226-
self.js_execute("initTaskPanel();", lambda _: self.gui.tf.set_tasks_progress_panel())
245+
def init_tasks_progress_panel(self, callback=None):
246+
def on_init_complete(_):
247+
self.gui.tf.set_tasks_progress_panel()
248+
if callback:
249+
callback()
250+
self.js_execute("initTaskPanel();", on_init_complete)
227251

228252
def add_task(self, tasks_obj):
229253
_js_code = f"""addTask('{tasks_obj.taskid}', `{tasks_obj.display_title}`, `{tasks_obj.tasks_count}`, `{tasks_obj.title_url}`);"""

GUI/conf_dialog.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
import yaml
1010
from PyQt5 import QtCore
1111
from PyQt5.QtWidgets import QDialog, QSizePolicy, QFileDialog, QCompleter, QApplication
12-
from PyQt5.QtGui import QDesktopServices
13-
from PyQt5.QtCore import QUrl, Qt
12+
from PyQt5.QtCore import Qt
1413
from qfluentwidgets import (
1514
FluentIcon as FIF, PushButton, PrimaryPushButton, TransparentPushButton,
1615
PushSettingCard, InfoBarPosition, TransparentToggleToolButton, InfoBar, ComboBox
@@ -169,7 +168,7 @@ def refresh_size_for_expand(self, _):
169168

170169
def bind_logic(self):
171170
def _open_docs():
172-
QDesktopServices.openUrl(QUrl('https://doc.comicguispider.nyc.mn/'))
171+
self.gui.open_url_by_browser('https://doc.comicguispider.nyc.mn/')
173172
self.descBtn.clicked.connect(_open_docs)
174173
def _switch_mode():
175174
if self.darkTheme.isChecked():
@@ -183,7 +182,7 @@ def _regular_update():
183182
Updater(self.gui).run()
184183
self.updateBtn.clicked.connect(_regular_update)
185184
self.supportBtn.clicked.connect(lambda: CustomFlyout.make(
186-
view=SupportView(Proj.url, self), target=self.supportBtn, parent=self
185+
view=SupportView(self), target=self.supportBtn, parent=self
187186
))
188187
def _tip_lang_change(idx):
189188
if self.langBox.itemData(idx) != conf.lang:
@@ -196,7 +195,7 @@ def _tip_lang_change(idx):
196195
def _tip_meta_change(idx):
197196
match self.metaTypeBox.itemText(idx):
198197
case "ComicInfo.xml":
199-
_meta_tip = "适配平台例如:ComicRack, Komga, kavita"
198+
_meta_tip = "适配平台例如:ComicRack, Komga, kavita\n保存并内置重启后生效"
200199
case _:
201200
_meta_tip = ""
202201
if _meta_tip:

GUI/gui.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from multiprocessing import Process
77
import multiprocessing.managers as m
88
from PyQt5.QtGui import QKeySequence, QGuiApplication
9-
from PyQt5.QtCore import QThread, Qt, QCoreApplication, QRect, QTimer
9+
from PyQt5.QtCore import QThread, Qt, QCoreApplication, QUrl, QRect, QTimer
1010
from PyQt5.QtWidgets import QMainWindow, QCompleter, QShortcut
1111

1212
from GUI.uic.qfluent import (
@@ -112,7 +112,6 @@ def finish_setup(self):
112112
self.keep_books = []
113113
self.eps = []
114114
self.conf_dia = ConfDialog(self)
115-
self.textBrowser.setOpenExternalLinks(True)
116115
self.textBrowser.append(TextUtils.description())
117116
self.progressBar.setStyleSheet(r'QProgressBar {text-align: center; border-color: #0000ff;}'
118117
r'QProgressBar::chunk {background-color: #0cc7ff; width: 3px;}')
@@ -329,14 +328,15 @@ def preprocess_preview(self, url_str):
329328
self.preview.duel_contents()
330329
self.tf = self.preview.created_temp_html
331330

332-
def set_preview(self):
331+
def set_preview(self, rect=None):
333332
self.BrowserWindow = BrowserWindowCls(self)
334333
preview_y = self.y() + self.funcGroupBox.y() - self.BrowserWindow.height() - 28
335-
self.BrowserWindow.setGeometry(QRect(
334+
rect = rect or QRect(
336335
self.x() + self.funcGroupBox.x(),
337336
preview_y if preview_y > 0 else 200,
338337
self.BrowserWindow.width(), self.BrowserWindow.height()
339-
))
338+
)
339+
self.BrowserWindow.setGeometry(rect)
340340
# button group
341341
self.previewBtn.setEnabled(True)
342342
self.previewBtn.setFocus()
@@ -606,3 +606,14 @@ def tpd(self, texts):
606606
view=self.BrowserWindow.domain_v, target=self.BrowserWindow, parent=self.BrowserWindow
607607
)
608608
self.BrowserWindow.domain_v.handle(texts)
609+
610+
def open_url_by_browser(self, url):
611+
screen_height = QGuiApplication.primaryScreen().availableGeometry().height()
612+
rect = QRect(self.x(), int(screen_height*0.05),
613+
self.width(), int(screen_height*0.9))
614+
if not getattr(self, 'BrowserWindow'):
615+
self.set_preview(rect)
616+
else:
617+
self.BrowserWindow.setGeometry(rect)
618+
self.BrowserWindow.view.load(QUrl(url))
619+
self.BrowserWindow.show()

GUI/mainwindow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def _repaint_textBrowser(self):
5050
if getattr(self, 'textBrowser', None):
5151
self.textBrowser.setParent(None)
5252
self.textBrowser.deleteLater()
53-
self.textBrowser = TextBrowserWithBg(self.centralwidget)
53+
self.textBrowser = TextBrowserWithBg(self)
5454
self.textBrowser.setMinimumSize(QtCore.QSize(200, 350))
5555
self.textBrowser.setObjectName("textBrowser")
5656
self.funcLayout.insertWidget(0, self.textBrowser)

GUI/manager/__init__.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ def __init__(self, gui):
2929
self._tasks = {}
3030
self.init_flag = True
3131
self.sql_handler = SqlUtils()
32+
self._init_lock = False
33+
self._pending_tasks = []
3234

3335
def init(self):
3436
# 就是为了设定任务细化面板 包的饺子
@@ -42,15 +44,27 @@ def handle(self, task: t.Union[TasksObj, TaskObj]):
4244
if not getattr(self.gui, "BrowserWindow"):
4345
self.init()
4446
if not getattr(self.gui.tf, "tasks_progress_panel_flag"):
45-
self.gui.BrowserWindow.init_tasks_progress_panel()
47+
if not self._init_lock:
48+
self._init_lock = True
49+
self.gui.BrowserWindow.init_tasks_progress_panel(
50+
callback=self._process_pending_tasks
51+
)
52+
if isinstance(task, TasksObj):
53+
self._pending_tasks.append(task)
54+
return
4655
if isinstance(task, TasksObj):
4756
self.add_task(task)
4857
elif isinstance(task, TaskObj):
4958
if task.taskid not in self._tasks:
50-
print(f"{task.taskid}: {task.page}") # TODO[5](2025-10-29): 未解,但不怎么影响
59+
print(f"{task.taskid}: {task.page}")
5160
else:
5261
self.update_progress(task)
5362

63+
def _process_pending_tasks(self):
64+
for task in self._pending_tasks:
65+
self.add_task(task)
66+
self._pending_tasks.clear()
67+
5468
def add_task(self, tasks_obj):
5569
self._tasks[tasks_obj.taskid] = tasks_obj
5670
self.gui.BrowserWindow.add_task(tasks_obj)

GUI/manager/preprocess.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def on_success(_):
6363

6464
def on_error(_):
6565
self.gui.disable_start()
66-
self.gui.say("<br>❌ 解密获取失败,点击 rV按钮 > statusTool > 更新拷贝")
66+
self.gui.say("<br>❌ 解密获取失败,内置重启再试下")
6767

6868
self.task_manager.execute_simple_task(
6969
task_func=manga_copy_task,

GUI/tools/status.py

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,6 @@ def __init__(self, gui):
6565
self.loop = asyncio.new_event_loop()
6666
asyncio.set_event_loop(self.loop)
6767

68-
async def _fetch_aggr_status(self):
69-
try:
70-
resp_body = await fetch(Api.cloudflare_status(aggr=True),
71-
dict(proxy=f"http://{conf.proxies[0]}") if conf.proxies else {})
72-
resp_json = json.loads(resp_body)
73-
return resp_json
74-
except Exception as e:
75-
return None
76-
77-
def fetch_all_status(self):
78-
try:
79-
resp_json = self.loop.run_until_complete(self._fetch_aggr_status())
80-
if not resp_json:
81-
return []
82-
return [{"web": web, **info} for web, info in resp_json.items()]
83-
except Exception as e:
84-
return []
85-
8668
async def _update_file(self, local_f, url):
8769
def to_md5(body: bytes):
8870
return hashlib.md5(body).hexdigest()
@@ -131,11 +113,6 @@ def init_ui(self):
131113
desc_label = StrongBodyLabel(tools_res.status_desc)
132114
first_row.addWidget(desc_label)
133115

134-
self.second_row = QHBoxLayout()
135-
linkBtn = HyperlinkButton(FIF.LINK, "https://doc.comicguispider.nyc.mn/", "CGS")
136-
self.second_row.insertWidget(1, linkBtn)
137-
self.second_row.addStretch()
138-
139116
third_row = QHBoxLayout()
140117
self.copy2Btn = PrimaryPushButton(FIF.UPDATE, "Update 拷贝", self)
141118
self.copy2Btn.clicked.connect(self.update_copy2_files)
@@ -144,14 +121,9 @@ def init_ui(self):
144121
third_row.addWidget(self.copy2Btn)
145122
third_row.addWidget(self.hitomiBtn)
146123

147-
for row in (first_row, self.second_row, third_row):
124+
for row in (first_row, third_row):
148125
self.main_layout.addLayout(row)
149126

150-
def showEvent(self, event):
151-
super().showEvent(event)
152-
if len(self.gui.webs_status) < len(StatusToolService.webs):
153-
self.fetch_status()
154-
155127
def hideEvent(self, event):
156128
super().hideEvent(event)
157129
self.task_manager.cancel_all_tasks()
@@ -160,22 +132,6 @@ def closeEvent(self, event):
160132
super().closeEvent(event)
161133
self.task_manager.cleanup()
162134

163-
def fetch_status(self):
164-
def on_success(results):
165-
self.handle_status_results(results)
166-
167-
def on_error(error):
168-
self.handle_status_results([])
169-
170-
# 使用异步任务管理器执行状态获取
171-
self.task_manager.execute_simple_task(
172-
task_func=self.service.fetch_all_status,
173-
success_callback=on_success,
174-
error_callback=on_error,
175-
tooltip_title=tools_res.status_fetching, tooltip_parent=self,
176-
task_id="fetch_status"
177-
)
178-
179135
def handle_status_results(self, resps_json):
180136
for resp_json in resps_json:
181137
level = InfoLevel.SUCCESS if resp_json['message']=="pass" else InfoLevel.ERROR

GUI/uic/qfluent/components/cust.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,19 +145,17 @@ class SupportView(FlyoutViewBase):
145145
closed = pyqtSignal() # 添加closed信号
146146
res = res.GUI.Uic
147147

148-
def __init__(self, proj_url, conf_dia=None):
148+
def __init__(self, conf_dia=None):
149149
super(SupportView, self).__init__(conf_dia)
150150
self.conf_dia = conf_dia
151151
self.width = int(conf_dia.width() * 0.8)
152152
self.layout = VBoxLayout(self)
153153
self.titleLayout = QtWidgets.QHBoxLayout()
154-
self.githubBtn = HyperlinkButton(FluentIcon.GITHUB, proj_url, "Github")
155154
self.qqGroupBtn = HyperlinkButton(CustomIcon.QQ, "https://qm.qq.com/q/T2SONVQmiW", "QQ")
156155
self.discordBtn = HyperlinkButton(CustomIcon.DISCORD, "https://discord.gg/znD4p2fpSE", "Discord")
157156
spacerItem = QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
158157
self.closeBtn = TransparentToolButton(FluentIcon.CLOSE, self)
159158
self.closeBtn.clicked.connect(self.closed)
160-
self.titleLayout.addWidget(self.githubBtn)
161159
self.titleLayout.addWidget(self.qqGroupBtn)
162160
self.titleLayout.addWidget(self.discordBtn)
163161
self.titleLayout.addItem(spacerItem)

GUI/uic/qfluent/components/text_componet.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from PyQt5.QtCore import QTimer, QSize
2-
from PyQt5.QtGui import QPixmap
2+
from PyQt5.QtGui import QPixmap, QDesktopServices
33
from qfluentwidgets import ImageLabel, TextBrowser, TextEdit
44

55

66
class TextBrowserWithBg(TextBrowser):
77
def __init__(self, parent=None):
88
super().__init__(parent)
99
self.image_label = None
10+
self.gui = parent
1011
self.setStyleSheet("""
1112
QTextBrowser {
1213
background-color: transparent;
@@ -51,6 +52,14 @@ def resizeEvent(self, event):
5152
if self.image_label:
5253
QTimer.singleShot(0, self.position_image)
5354

55+
def setSource(self, url):
56+
if url.isEmpty():
57+
return
58+
if self.gui.chooseBox.currentIndex() == 2:
59+
QDesktopServices.openUrl(url)
60+
else:
61+
self.gui.open_url_by_browser(url.toString())
62+
5463

5564
class TextEditWithBg(TextEdit):
5665
def __init__(self, parent=None):

README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@
5454

5555
---
5656

57-
**🔉要提问时不管群里问还是 issue,都看一遍 [提问须知](https://github.com/tangx/Stop-Ask-Questions-The-Stupid-Ways?tab=readme-ov-file)** (相关链接 [文档](
58-
https://doc.comicguispider.nyc.mn/faq) / [issue](
59-
https://github.com/jasoneri/ComicGUISpider/issues?q=is%3Aissue%20state%3Aclosed))
60-
61-
---
62-
6357
## 📢更新
6458

6559
✨ 软件内外更新了 CGS 猫娘图( ~~施法: 你是一只贫穷,只能捡路边法棍吃的猫娘~~
@@ -80,6 +74,16 @@ https://github.com/jasoneri/ComicGUISpider/issues?q=is%3Aissue%20state%3Aclosed)
8074
✅ 配置窗口做了调整
8175
✅ 修复代理状态时拷贝流程仍然出错,具体看 [`faq > 拷贝访问相关`](https://doc.comicguispider.nyc.mn/faq/#_2-%E7%88%AC%E8%99%AB)
8276

77+
78+
<details>
79+
<summary> <code>🧪v2.7.1-beta</code> 开发版特性👈看就点</summary>
80+
81+
#### 🐞 Fix
82+
83+
+ 子进度条修复,大部分转用内置浏览器
84+
85+
</details>
86+
8387
> 可参考 [更新方法](https://jasoneri.github.io//ComicGUISpider/deploy/quick-start.html#_4-%E6%9B%B4%E6%96%B0) 进行更新
8488
8589
> [🕑更新历史](docs/changelog/history.md) / [📝开发板](https://github.com/jasoneri/ComicGUISpider/projects?query=is%3Aopen)

0 commit comments

Comments
 (0)