Skip to content

Commit

Permalink
Merge pull request #53 from shadlc/experiment/biliplus
Browse files Browse the repository at this point in the history
💥多项程序修复与改进
  • Loading branch information
Zeal-L committed Jul 24, 2023
2 parents b2c050d + 17467dc commit f34c478
Show file tree
Hide file tree
Showing 8 changed files with 353 additions and 122 deletions.
20 changes: 18 additions & 2 deletions src/BiliPlus.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ def retrieveAvailableEpisode(self, episodes: list[BiliPlusEpisode], comic_id: st
@retry(
stop_max_delay=MAX_RETRY_SMALL, wait_exponential_multiplier=RETRY_WAIT_EX
)
def _() -> dict:
def _(url: str=biliplus_detail_url) -> dict:
try:
res = requests.post(
biliplus_detail_url,
url,
headers=self.headers,
timeout=TIMEOUT_SMALL,
)
Expand Down Expand Up @@ -102,6 +102,18 @@ def _() -> dict:
for ep in ep_items:
if ep.img['src'] != "about:blank":
ep_available.append(ep.a["href"].split("epid=")[1])
total_ep_element = document.select_one("center p")
if total_ep_element:
total_ep = total_ep_element.contents[0].split("/")[1]
total_pages = int(int(total_ep) / 200) + 1
for pages in range(2, total_pages + 1):
mainGUI.resolve_status.emit(f"正在解析漫画章节({pages}/{total_pages})...")
page_html = _(f"{biliplus_detail_url}&page={pages}")
document = BeautifulSoup(page_html, "html.parser")
ep_items = document.find_all("div", {"class":"episode-item"})
for ep in ep_items:
if ep.img['src'] != "about:blank":
ep_available.append(ep.a["href"].split("epid=")[1])
for ep in episodes:
if str(ep.id) in ep_available:
ep.available = True
Expand Down Expand Up @@ -185,6 +197,10 @@ def _() -> list[dict]:
biliplus_imgs_token.append({"url": url, "token": token})
self.imgs_token = biliplus_imgs_token
if biliplus_imgs_token == []:
logger.error(f"《{self.comic_name}》章节:{self.title} 在处理BiliPlus地址时因Cookie有误导致失败!")
mainGUI.message_box.emit(
f"《{self.comic_name}》章节:{self.title} 在处理BiliPlus解锁章节图片地址时因Cookie有误导致失败!"
)
return False
except Exception as e:
logger.error(f"《{self.comic_name}》章节:{self.title} 在处理BiliPlus解锁章节图片地址时失败!\n{e}")
Expand Down
42 changes: 41 additions & 1 deletion src/Comic.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import typing

import requests
from retrying import retry
from hashlib import md5
from retrying import RetryError, retry
import re

from src.Episode import Episode
Expand Down Expand Up @@ -86,6 +87,45 @@ def _() -> dict:

return self.data

############################################################
def getComicCover(self, data: dict) -> int:
"""获取漫画封面图片
Returns:
QPixmap: 漫画封面图片
"""
@retry(
stop_max_delay=MAX_RETRY_SMALL, wait_exponential_multiplier=RETRY_WAIT_EX
)
def _() -> bytes:
try:
res = requests.get(data["vertical_cover"], timeout=TIMEOUT_SMALL)
except requests.RequestException() as e:
logger.warning(f"获取封面图片失败! 重试中...\n{e}")
raise e
if res.status_code != 200:
logger.warning(
f"获取封面图片失败! 状态码:{res.status_code}, 理由: {res.reason} 重试中..."
)
raise requests.HTTPError()
if res.headers["Etag"] != md5(res.content).hexdigest():
logger.warning(
f"图片内容 Checksum 不正确! 重试中...\n\t{res.headers['Etag']}{md5(res.content).hexdigest()}"
)
raise requests.HTTPError()
return res.content

logger.info(f"获取《{data['title']}》的封面图片中...")
try:
img = _()
return img
except RetryError as e:
logger.error(f"获取封面图片多次后失败,跳过!\n{e}")
self.mainGUI.message_box.emit(
f"获取封面图片多次后失败!\n请检查网络连接或者重启软件!\n\n更多详细信息请查看日志文件, 或联系开发者!"
)
return open(":/imgs/fail_img.jpg")

############################################################
def getEpisodesInfo(self) -> list[Episode]:
"""获取章节信息
Expand Down
22 changes: 11 additions & 11 deletions src/ui/DownloadUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,18 +110,18 @@ def addFinished(self, mainGUI: MainGUI, label_title: QWidget, path: str) -> None
"""
# ?###########################################################
# ? 添加到已完成列表
h_layout_donwlowd_list = QHBoxLayout()
h_layout_donwlowd_list.addWidget(label_title)
h_layout_donwlowd_list.addStretch(1)
h_layout_download_list = QHBoxLayout()
h_layout_download_list.addWidget(label_title)
h_layout_download_list.addStretch(1)

# ?###########################################################
# ? 超链接打开保存路径
label_file_path = QLabel("<a href='file:///'>打开文件夹</a>")
label_file_path.linkActivated.connect(lambda: openFolderAndSelectItems(path))
h_layout_donwlowd_list.addWidget(label_file_path)
h_layout_download_list.addWidget(label_file_path)

widget = QWidget()
widget.setLayout(h_layout_donwlowd_list)
widget.setLayout(h_layout_download_list)
mainGUI.verticalLayout_finished.addWidget(widget)

############################################################
Expand Down Expand Up @@ -149,8 +149,8 @@ def addTask(self, mainGUI: MainGUI, epi: Episode) -> None:

# ?###########################################################
# ? 添加任务组件到正在下载列表
h_layout_donwlowd_list = QHBoxLayout()
h_layout_donwlowd_list.addWidget(
h_layout_download_list = QHBoxLayout()
h_layout_download_list.addWidget(
QLabel(
f"<span style='color:blue;font-weight:bold'>{epi.comic_name}</span> > {epi.title}"
)
Expand All @@ -159,11 +159,11 @@ def addTask(self, mainGUI: MainGUI, epi: Episode) -> None:
bar.setTextVisible(True)

self.all_tasks[task_id]["bar"] = bar
h_layout_donwlowd_list.addWidget(bar)
h_layout_donwlowd_list.setStretch(0, 1)
h_layout_donwlowd_list.setStretch(1, 1)
h_layout_download_list.addWidget(bar)
h_layout_download_list.setStretch(0, 1)
h_layout_download_list.setStretch(1, 1)
widget = QWidget()
widget.setObjectName(task_id)
widget.setLayout(h_layout_donwlowd_list)
widget.setLayout(h_layout_download_list)
mainGUI.verticalLayout_processing.addWidget(widget)
self.id_count += 1
6 changes: 4 additions & 2 deletions src/ui/MainGUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ class MainGUI(QMainWindow, Ui_MainWindow, QtStyleTools):
# ? 主要是为了 Episode 类里面的提示框准备的,
# ? 因为 Episode 类是在另一个线程里面运行的,而只有主线程才能修改 GUI
message_box = Signal(str)
# ? 用于多线程更新我的库存
my_library_add_widget = Signal(dict)

# ? 用于多线程报告程序详情
resolve_status = Signal(str)

def __init__(self, app):
super().__init__()
Expand All @@ -30,6 +31,7 @@ def __init__(self, app):
self.setWindowTitle(f"哔哩哔哩漫画下载器 v{__version__}")
self.setFont(QFont("Microsoft YaHei", 10))
self.message_box.connect(lambda msg: QMessageBox.warning(None, "警告", msg))
self.resolve_status.connect(lambda status: self.label_resolve_status.setText(status))

logger.info("\n\n\t\t\t------------------- 程序启动,初始化主窗口 -------------------\n")

Expand Down

0 comments on commit f34c478

Please sign in to comment.