commit a3583d9e4ea2310bd3210c1720250dd2cbcef6d2 Author: 王老板 Date: Fri Sep 27 16:59:07 2024 +0800 update diff --git a/Downloader.py b/Downloader.py new file mode 100644 index 0000000..4f73055 --- /dev/null +++ b/Downloader.py @@ -0,0 +1,176 @@ +import requests +from bs4 import BeautifulSoup # 用于代替正则式 取源码中相应标签中的内容 +import os +from rich.progress import track as tqdm +from concurrent.futures import ThreadPoolExecutor, wait +import time +from PIL import Image +from utils import * + +class Downloader(object): + def __init__(self, comic_name, root_path = './', url_prev='.site', high_quality=False): + self.comic_name = comic_name + self.root_path = root_path + self.url_prev = url_prev + self.high_quality = high_quality + self.comic_msg_url = f"https://api.copymanga{url_prev}/api/v3/comic2/{comic_name}" + self.comic_url_api = 'https://api.copymanga{}/api/v3/comic/{}/group/{}/chapters?limit=500&offset=0&platform=3' + self.chap_url_api = 'https://api.copymanga{}/api/v3/comic/{}/chapter2/{}?platform=3' + + + self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47', 'platform': '1'} + + self.max_thread_num = 16 + self.pool = ThreadPoolExecutor(self.max_thread_num) + self.buffer_map = {} + + def get_comic_msg(self, is_gui=False, signal=None, editline=None): + req = requests.get(self.comic_msg_url, headers=self.header).json() + req = req['results'] + self.comic_title = req['comic']['name'] + self.comic_author = req['comic']['author'][0]['name'] + self.cover_url = req['comic']['cover'] + cls_dict = req['groups'] + self.cls_dict = {} + for key in cls_dict.keys(): + self.cls_dict[cls_dict[key]['name']] = cls_dict[key]['path_word'] + if len(cls_dict.keys())==1: + self.url_cls = list(self.cls_dict.values())[0] + elif len(cls_dict.keys())>1: + choise_name = self.get_choise(list(self.cls_dict.keys()), is_gui, signal, editline) + self.url_cls = self.cls_dict[choise_name] + self.comic_url = self.comic_url_api.format(self.url_prev, self.comic_name, self.url_cls) + + def get_comic_chaps(self): + req = requests.get(self.comic_url, headers=self.header) + comic_urls = req.json()['results']['list'] + num_chaps = comic_urls[0]['count'] + offset = 0 + while offset + + + +

+     拷贝漫画EPUB下载器 +

+ + + + + +[拷贝漫画](https://www.copymanga.site)(copymanga)下载, 并打包为EPUB格式。 + +特性: + +* Fluent Design风格界面,下载进度与书籍封面显示,主题切换,下载目录自定义。 +* 前后端分离,同时支持命令行版本。 +* 章节批量下载。 +* EPUB格式自动打包。 +* 图片质量自定义选择。 +* 断点续传,避免重复下载。 +* 多线程预缓存策略,下载速度快。 +* 网站域名自定义更换,防止被墙。 +* ................... + + +有建议或bug可以提issue,也可以加QQ群获得更多信息:563072544 + +图形界面使用[PyQt-Fluent-Widgets](https://pyqt-fluent-widgets.readthedocs.io/en/latest/index.html)界面编写。 + +[release](https://github.com/ShqWW/copymanga-download/releases)页面发布了已经打包好的exe可执行程序,包括图形化版本和命令行版本(系统最低要求Windows 10)。 + +界面样例: +
+ + +
+ +## 使用前安装需要的包 +``` +pip install -r requirements.txt -i https://pypi.org/simple/ +``` +## 使用命令行模式运行(无需安装图形界面库,支持Linux): +``` +python copymanga.py +``` + +## 使用图形界面运行: +``` +python copymanga_gui.py +``` + +## 使用pyinstaller打包: +``` +pip install pyinstaller +``` +``` +pyinstaller -F -w -i .\resource\logo.png .\copymanga_gui.py +``` + +## 相关项目: + +* [轻小说文库EPUB下载器](https://github.com/ShqWW/lightnovel-download) + +* [哔哩轻小说EPUB下载器](https://github.com/ShqWW/bilinovel-download) + +* [拷贝漫画EPUB下载器](https://github.com/ShqWW/copymanga-download) + +## EPUB书籍漫画编辑和管理工具推荐: +1. [Sigil](https://sigil-ebook.com/) +2. [Calibre](https://www.calibre-ebook.com/) + diff --git a/__pycache__/Downloader.cpython-311.pyc b/__pycache__/Downloader.cpython-311.pyc new file mode 100644 index 0000000..bfda3e9 Binary files /dev/null and b/__pycache__/Downloader.cpython-311.pyc differ diff --git a/__pycache__/Editer.cpython-311.pyc b/__pycache__/Editer.cpython-311.pyc new file mode 100644 index 0000000..6c6cb4a Binary files /dev/null and b/__pycache__/Editer.cpython-311.pyc differ diff --git a/__pycache__/copymanga.cpython-311.pyc b/__pycache__/copymanga.cpython-311.pyc new file mode 100644 index 0000000..31e998e Binary files /dev/null and b/__pycache__/copymanga.cpython-311.pyc differ diff --git a/__pycache__/utils.cpython-311.pyc b/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000..1e59987 Binary files /dev/null and b/__pycache__/utils.cpython-311.pyc differ diff --git a/comic.py b/comic.py new file mode 100644 index 0000000..5665b5f --- /dev/null +++ b/comic.py @@ -0,0 +1,146 @@ +#!/usr/bin/python +# -*- coding:utf-8 -*- + +import requests # 用来抓取网页的html源码 +import random # 取随机数 +from bs4 import BeautifulSoup # 用于代替正则式 取源码中相应标签中的内容 +import sys +import time # 时间相关操作 +import js2py +import os +from tqdm import tqdm + + +class downloader(object): + def __init__(self): + self.server = 'https://www.iimanhua.cc/' + self.target = 'https://www.iimanhua.cc/comic/2189/' + self.names = [] # 章节名 + self.urls = [] # 章节链接 + self.nums = 0 # 章节数 + + """ + 获取html文档内容 + """ + + def get_content(self, url): + # 设置headers是为了模拟浏览器访问 否则的话可能会被拒绝 可通过浏览器获取,这里不用修改 + header = { + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Connection': 'keep-alive', + 'Accept-Encoding': 'gzip, deflate, br', + 'Accept-Language': 'zh-CN, zh', + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' + } + + # 设置一个超时时间 取随机数 是为了防止网站被认定为爬虫,不用修改 + timeout = random.choice(range(80, 180)) + + while True: + try: + req = requests.get(url=url, headers=header) + req.encoding = 'GBK' #这里是网页的编码转换,根据网页的实际需要进行修改,经测试这个编码没有问题 + break + except Exception as e: + print('3', e) + time.sleep(random.choice(range(5, 10))) + return req.text + + """ + 获取下载的章节目录 + """ + + def get_download_catalogue(self, url): + # html = self.get_content(url) + # bf = BeautifulSoup(html, 'html.parser') + # print(bf) + # texts = bf.find_all('div', {'class': 'listmain'}) + + finename = "./kkk.txt" + + f = open(finename,'r', encoding='utf-8') # 返回一个文件对象 + line = f.readline() + while line: + # print(line.strip('\n')) + name, url = self.get_url(line) + self.names.append(name) + self.urls.append(self.server + url) + line = f.readline() + # print(self.urls) + self.nums = len(self.urls) + + + + """ + 获取下载的具体章节 + """ + + def get_url(self, url_str): + st = url_str.find("/comic") + ed = url_str.find("\" title") + st2 = url_str.find(")") + ed2 = url_str.find("\">") + url = url_str[st:ed] + name = url_str[st2+1:ed2] + return name, url + + + + def get_download_content(self, chap, path, name, url): + #html = self.get_content(url) + chappath = os.path.join(path, str(chap).zfill(3)+ '话 ' +name) + os.makedirs(chappath, exist_ok=True) + html = self.get_content(url) + bf = BeautifulSoup(html, 'html.parser') + jscmd = bf.find('script', {'language': 'javascript', 'type': 'text/javascript'}).text + # print(jscmd) + jscmd += ''' + \nvar b=base64decode(packed).slice(4); + var a = eval(b); + ''' + # print(jscmd) + jsres = js2py.eval_js(jscmd) #执行js代码 + imgurls = self.get_img_url(jsres) + page_no = 1 + for imgurl in tqdm(imgurls): + r=requests.get(imgurl) + with open(chappath+'/'+str(page_no)+'.jpg','wb') as f: + f.write(r.content) #写入二进制内容 + page_no += 1 + + + + + """ + 解析url + """ + def get_img_url(self, jsres): + imgserver = 'https://res.img.96youhuiquan.com/' + imgstrs = jsres.split(";") + imgurls = [] + for imgstr in imgstrs: + if len(imgstr)>1: + st = imgstr.find("]=") + imgurl = imgstr[st+3:-1] + imgurls.append(imgserver+imgurl) + return imgurls + + + + + def writer(self, path, name, text): + write_flag = True + with open(path, 'a', encoding='utf-8') as f: + f.writelines(name) + f.write('\n') + f.writelines(text) + f.write('\n\n') + + +if __name__ == '__main__': + path = './duannao/' + dl = downloader() + dl.get_download_catalogue(dl.target) + for chap_no in range(77-1, dl.nums): + print("第" + str(chap_no+1) + "话") + dl.get_download_content(chap_no+1, path, dl.names[chap_no], dl.urls[chap_no]) diff --git a/copymanga.py b/copymanga.py new file mode 100644 index 0000000..b5672f8 --- /dev/null +++ b/copymanga.py @@ -0,0 +1,131 @@ +import argparse +from Downloader import Downloader +from Editer import Editer +import os +import shutil + +def parse_args(): + """Parse input arguments.""" + parser = argparse.ArgumentParser(description='config') + parser.add_argument('--comic_no', default='0000', type=str) + parser.add_argument('--volume_no', default='1', type=int) + parser.add_argument('--no_input', default=False, type=bool) + args = parser.parse_args() + return args + + +def query_chaps(comic_name, url_prev, is_gui=False, hang_signal=None, edit_line_hang=None): + print('未输入卷号,将返回书籍目录信息......') + editer = Downloader(comic_name=comic_name, root_path='./out', url_prev=url_prev) + print('*******************************') + editer.get_comic_msg(is_gui, hang_signal, edit_line_hang) + editer.get_comic_chaps() + print(editer.comic_title, editer.comic_author) + print('*******************************') + + for i, chap_name in enumerate(editer.chap_name_list): + print(f'[{str(i+1)}]', chap_name) + + print('*******************************') + print('请输入所需要的卷号进行下载(多卷可以用英文逗号分隔或直接使用连字符,详情见说明)') + +def download_task(root_path, + comic_name, + chap_no_list, + url_prev, + high_quality, + is_gui=False, + multi_thread=False, + hang_signal=None, + progressring_signal=None, + cover_signal=None, + edit_line_hang=None): + + downloader = Downloader(comic_name=comic_name, root_path=root_path, url_prev=url_prev, high_quality=high_quality) + print('正在积极地获取书籍信息....') + downloader.get_comic_msg(is_gui, hang_signal, edit_line_hang) + downloader.get_comic_chaps() + print(downloader.comic_title, downloader.comic_author) + + print('****************************') + print('正在下载漫画....') + for chap_no in chap_no_list: + chap_name = downloader.chap_name_list[chap_no-1] + chap_uuid = downloader.chap_uuid_list[chap_no-1] + page_num = downloader.chap_pagenum_list[chap_no-1] + downloader.download_single_chap(chap_name, chap_uuid, page_num, multithread=multi_thread, is_gui=is_gui, signal=progressring_signal) + downloader.get_cover(chap_name=chap_name, is_gui=is_gui, signal=cover_signal) + downloader.download_cover() + print('漫画下载成功!', f'漫画路径【{downloader.comic_path}】') + chap_list = [downloader.chap_name_list[chap_no-1] for chap_no in chap_no_list] + editer = Editer(downloader.comic_title, downloader.comic_author, chap_list, downloader.comic_path, root_path, delete_comic=0) + editer.pack_img() + editer.typesetting() + editer.get_epub() + + + +def downloader_router(root_path, + comic_name, + chap_no, + url_prev, + high_quality, + is_gui=False, + multi_thread=False, + hang_signal=None, + progressring_signal=None, + cover_signal=None, + edit_line_hang=None): + if len(comic_name)==0: + print('请检查输入是否完整正确!') + return + elif chap_no == '': + query_chaps(comic_name, url_prev, is_gui, hang_signal, edit_line_hang) + return + elif chap_no.isdigit(): + chap_no = int(chap_no) + chap_no_list = [chap_no] + if chap_no<=0: + print('请检查输入是否完整正确!') + return + elif "-" in chap_no: + start, end = map(str, chap_no.split("-")) + if start.isdigit() and end.isdigit() and int(start)>0 and int(start) None: + result = super().terminate() + return result + +class EmittingStr(QObject): + textWritten = pyqtSignal(str) # 定义一个发送str的信号 + def write(self, text): + self.textWritten.emit(str(text)) + def flush(self): + pass + def isatty(self): + pass + + +class UrlPrev(Enum): + """ Theme enumeration """ + + SITE = ".site" + COM= ".com" + ORG = ".org" + NET = ".net" + TV = ".tv" + INFO = ".info" + +class SettingWidget(QFrame): + def __init__(self, text: str, parent=None): + super().__init__(parent=parent) + + self.parent = parent + self.expandLayout = ExpandLayout(self) + self.setObjectName(text.replace(' ', '-')) + self.setting_group = SettingCardGroup(self.tr("下载设置"), self) + + self.download_path_card = PushSettingCard( + self.tr('选择文件夹'), + FIF.DOWNLOAD, + self.tr("下载目录"), + self.parent.out_path, + self.setting_group + ) + self.themeMode = OptionsConfigItem(None, "ThemeMode", Theme.DARK, OptionsValidator(Theme), None) + self.urlMode = OptionsConfigItem(None, "urlMode", UrlPrev.SITE, OptionsValidator(UrlPrev), None) + + self.threadMode = OptionsConfigItem(None, "ThreadMode", True, BoolValidator()) + self.qualityMode = OptionsConfigItem(None, "QualityMode", True, BoolValidator()) + + self.theme_card = OptionsSettingCard( + self.themeMode, + FIF.BRUSH, + self.tr('应用主题'), + self.tr("更改外观"), + texts=[ + self.tr('亮'), self.tr('暗'), + self.tr('跟随系统设置') + ], + parent=self.parent + ) + + self.url_card = OptionsSettingCard( + self.urlMode, + FIF.VPN, + self.tr('漫画域名后缀'), + self.tr("漫画域名切换"), + texts=[ + self.tr('.tv'), self.tr('.org'), + self.tr('.com'), self.tr('.info'), + self.tr('.site'), self.tr('.net') + ], + parent=self.parent + ) + + self.thread_card = SwitchSettingCard( + FIF.SPEED_HIGH, + self.tr('多线程缓存'), + self.tr('开启后理论上会加快下载速度,但可能会增加服务端压力'), + parent=self.parent, + configItem=self.threadMode + ) + + self.quality_card = SwitchSettingCard( + FIF.LEAF, + self.tr('下载高质量图片'), + self.tr('开启后会提高漫画清晰度,但会增加下载漫画的体积'), + parent=self.parent, + configItem=self.qualityMode + ) + self.thread_card.setValue(True) + self.quality_card.setValue(True) + self.thread_changed() + self.quality_changed() + + self.setting_group.addSettingCard(self.download_path_card) + self.setting_group.addSettingCard(self.thread_card) + self.setting_group.addSettingCard(self.quality_card) + self.setting_group.addSettingCard(self.url_card) + self.setting_group.addSettingCard(self.theme_card) + + self.expandLayout.setSpacing(28) + self.expandLayout.setContentsMargins(20, 10, 20, 0) + self.expandLayout.addWidget(self.setting_group) + + self.download_path_card.clicked.connect(self.download_path_changed) + self.theme_card.optionChanged.connect(self.theme_changed) + self.url_card.optionChanged.connect(self.url_changed) + self.thread_card.checkedChanged.connect(self.thread_changed) + self.quality_card.checkedChanged.connect(self.quality_changed) + + def download_path_changed(self): + """ download folder card clicked slot """ + self.parent.out_path = QFileDialog.getExistingDirectory( + self, self.tr("Choose folder"), self.parent.out_path) + self.download_path_card.contentLabel.setText(self.parent.out_path) + + def theme_changed(self): + theme_name = self.theme_card.choiceLabel.text() + self.parent.set_theme(theme_name) + if os.path.exists('./config'): + shutil.rmtree('./config') + + def url_changed(self): + self.parent.url_prev = self.url_card.choiceLabel.text() + if os.path.exists('./config'): + shutil.rmtree('./config') + + def thread_changed(self): + is_checked = self.thread_card.isChecked() + self.thread_card.switchButton.setText( + self.tr('开') if is_checked else self.tr('关')) + self.parent.multi_thread = is_checked + if os.path.exists('./config'): + shutil.rmtree('./config') + def quality_changed(self): + is_checked = self.quality_card.isChecked() + self.quality_card.switchButton.setText( + self.tr('高') if is_checked else self.tr('低')) + self.parent.high_quality = is_checked + if os.path.exists('./config'): + shutil.rmtree('./config') + + + + + + + +class HomeWidget(QFrame): + + progressring_signal = pyqtSignal(object) + end_signal = pyqtSignal(object) + hang_signal = pyqtSignal(object) + clear_signal = pyqtSignal(object) + cover_signal = pyqtSignal(object) + + def __init__(self, text: str, parent=None): + super().__init__(parent=parent) + self.setObjectName(text) + self.parent = parent + self.label_book = SubtitleLabel('名称:', self) + self.label_volumn = SubtitleLabel('卷号:', self) + self.editline_book = LineEdit(self) + self.editline_volumn = LineEdit(self) + + + # self.editline_book.setText('yaoyeluying') + # self.editline_volumn.setText('3') + + self.book_icon = QPixmap() + self.book_icon.loadFromData(base64.b64decode(book_base64)) + self.cover_w, self.cover_h = 152, 230 + + self.label_cover = ImageLabel(self.book_icon, self) + self.label_cover.setBorderRadius(8, 8, 8, 8) + self.label_cover.setFixedSize(self.cover_w, self.cover_h) + + self.text_screen = TextEdit() + self.text_screen.setReadOnly(True) + self.text_screen.setFixedHeight(self.cover_h) + + self.progressRing = ProgressRing(self) + self.progressRing.setValue(0) + self.progressRing.setTextVisible(True) + self.progressRing.setFixedSize(50, 50) + + self.btn_run = PushButton('确定', self) + self.btn_run.setShortcut(Qt.Key_Return) + self.btn_stop = PushButton('取消', self) + self.btn_hang = PushButton('确定', self) + + self.editline_hang = ComboBox(self) + self.gridLayout = QGridLayout(self) + self.screen_layout = QGridLayout() + self.btn_layout = QGridLayout() + self.hang_layout = QGridLayout() + + self.label_book.setFont(font_label) + self.label_volumn.setFont(font_label) + self.editline_book.setFont(font_label) + self.editline_volumn.setFont(font_label) + self.text_screen.setFont(font_msg) + self.editline_hang.setFont(font_msg) + + self.gridLayout.addWidget(self.editline_book, 0, 1) + self.gridLayout.addWidget(self.editline_volumn, 1, 1) + self.gridLayout.addWidget(self.label_book, 0, 0) + self.gridLayout.addWidget(self.label_volumn, 1, 0) + + self.gridLayout.addLayout(self.btn_layout, 2, 1, 1, 1) + self.btn_layout.addWidget(self.btn_run, 2, 1) + self.btn_layout.addWidget(self.btn_stop, 2, 2) + + self.gridLayout.addLayout(self.screen_layout, 3, 0, 2, 2) + + self.screen_layout.addWidget(self.progressRing, 0, 0, Qt.AlignRight|Qt.AlignBottom) + self.screen_layout.addWidget(self.text_screen, 0, 0) + self.screen_layout.addWidget(self.label_cover, 0, 1) + + + + self.gridLayout.addLayout(self.hang_layout, 5, 0, 1, 2) + self.hang_layout.addWidget(self.editline_hang, 0, 0) + self.hang_layout.addWidget(self.btn_hang, 0, 1) + + self.screen_layout.setContentsMargins(0,0,0,0) + self.btn_layout.setContentsMargins(0,0,0,0) + self.gridLayout.setContentsMargins(20, 10, 20, 10) + + self.btn_run.clicked.connect(self.process_start) + self.btn_stop.clicked.connect(self.process_stop) + self.btn_hang.clicked.connect(self.process_continue) + + self.progressring_signal.connect(self.progressring_msg) + self.end_signal.connect(self.process_end) + self.hang_signal.connect(self.process_hang) + self.clear_signal.connect(self.clear_screen) + self.cover_signal.connect(self.display_cover) + + self.progressRing.hide() + self.btn_hang.hide() + self.editline_hang.hide() + self.btn_stop.setEnabled(False) + + sys.stdout = EmittingStr(textWritten=self.outputWritten) + sys.stderr = EmittingStr(textWritten=self.outputWritten) + self.text_screen.setText(self.parent.welcome_text) + + def process_start(self): + self.label_cover.setImage(self.book_icon) + self.label_cover.setFixedSize(self.cover_w, self.cover_h) + self.btn_run.setEnabled(False) + self.btn_run.setText('正在下载') + self.btn_stop.setEnabled(True) + self.main_thread = MainThread(self) + self.main_thread.start() + + def process_end(self, input=None): + self.btn_run.setEnabled(True) + self.btn_run.setText('开始下载') + self.btn_run.setShortcut(Qt.Key_Return) + self.btn_stop.setEnabled(False) + self.progressRing.hide() + self.btn_hang.hide() + self.editline_hang.clear() + self.editline_hang.hide() + if input=='refresh': + self.label_cover.setImage(self.book_icon) + self.label_cover.setFixedSize(self.cover_w, self.cover_h) + self.clear_signal.emit('') + self.text_screen.setText(self.parent.welcome_text) + + def outputWritten(self, text): + cursor = self.text_screen.textCursor() + scrollbar=self.text_screen.verticalScrollBar() + is_bottom = (scrollbar.value()>=scrollbar.maximum() - 15) + cursor.movePosition(QTextCursor.End) + cursor.insertText(text) + if is_bottom: + self.text_screen.setTextCursor(cursor) + # self.text_screen.ensureCursorVisible() + + def clear_screen(self): + self.text_screen.clear() + + def display_cover(self, signal_msg): + filepath, img_h, img_w = signal_msg + self.label_cover.setImage(filepath) + self.label_cover.setFixedSize(int(img_w*self.cover_h/img_h), self.cover_h) + + def progressring_msg(self, input): + if input == 'start': + self.progressRing.setValue(0) + self.progressRing.show() + elif input == 'end': + self.progressRing.hide() + self.progressRing.setValue(0) + else: + self.progressRing.setValue(input) + + def process_hang(self, input=None): + self.btn_hang.setEnabled(True) + self.btn_hang.setShortcut(Qt.Key_Return) + self.btn_hang.show() + self.editline_hang.show() + + def process_continue(self, input=None): + self.btn_hang.hide() + self.btn_hang.setEnabled(False) + self.editline_hang.hide() + + + def process_stop(self): + self.main_thread.terminate() + self.end_signal.emit('refresh') + + + + +class Window(FluentWindow): + update_signal = pyqtSignal(object) + def __init__(self): + super().__init__() + + self.out_path = os.path.join(os.path.expanduser('~'), 'Downloads') + self.url_prev = '.tv' + self.head = 'https://www.copymanga.tv' + split_str = '**************************************\n ' + self.welcome_text = f'使用说明(共4条,记得下拉):\n{split_str}1.拷贝漫画{self.head},根据书籍网址输入漫画名以及下载的卷号。\n{split_str}2.例如漫画网址是{self.head}/comic/yaoyeluying,则漫画名输入yaoyeluying。\n{split_str}3.要查询漫画卷号卷名等信息,则可以只输入漫画名不输入卷号,点击确定会返回漫画卷名称和对应的卷号。\n{split_str}4.根据上一步返回的信息确定自己想下载的卷号,要下载编号[2]对应卷,则卷号输入2。想下载多卷比如[1]至[3]对应卷,则卷号输入1-3或1,2,3(英文逗号分隔,编号也可以不连续)并点击确定。' + self.homeInterface = HomeWidget('Home Interface', self) + self.settingInterface = SettingWidget('Setting Interface', self) + self.initNavigation() + self.initWindow() + self.multi_thread = True + self.high_quality = True + + def initNavigation(self): + self.addSubInterface(self.homeInterface, FIF.HOME, '主界面') + self.addSubInterface(self.settingInterface, FIF.SETTING, '设置', NavigationItemPosition.BOTTOM) + + def initWindow(self): + self.resize(700, 460) + pixmap = QPixmap() + pixmap.loadFromData(base64.b64decode(logo_base64)) + self.setWindowIcon(QIcon(pixmap)) + self.setWindowTitle('拷贝漫画下载器') + self.setFont(font_label) + + desktop = QApplication.desktop().availableGeometry() + w, h = desktop.width(), desktop.height() + self.move(w//2 - self.width()//2, h//2 - self.height()//2) + + def set_theme(self, mode=None): + if mode=='亮': + setTheme(Theme.LIGHT) + elif mode=='暗': + setTheme(Theme.DARK) + elif mode=='跟随系统设置': + setTheme(Theme.AUTO) + theme = qconfig.theme + if theme == Theme.DARK: + self.homeInterface.label_book.setTextColor(QColor(255,255,255)) + self.homeInterface.label_volumn.setTextColor(QColor(255,255,255)) + elif theme == Theme.LIGHT: + self.homeInterface.label_book.setTextColor(QColor(0,0,0)) + self.homeInterface.label_volumn.setTextColor(QColor(0,0,0)) + + + +if __name__ == '__main__': + QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) + QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) + QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) + + setTheme(Theme.DARK) + setThemeColor('#1E90FF') + app = QApplication(sys.argv) + w = Window() + w.show() + app.exec_() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c2ac985 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +# pip install -r requirements.txt -i https://pypi.org/simple/ +requests +bs4 +rich +pyqt5 +PyQt-Fluent-Widgets[full] \ No newline at end of file diff --git a/resource/__pycache__/book.cpython-311.pyc b/resource/__pycache__/book.cpython-311.pyc new file mode 100644 index 0000000..5687e89 Binary files /dev/null and b/resource/__pycache__/book.cpython-311.pyc differ diff --git a/resource/__pycache__/logo.cpython-311.pyc b/resource/__pycache__/logo.cpython-311.pyc new file mode 100644 index 0000000..b440821 Binary files /dev/null and b/resource/__pycache__/logo.cpython-311.pyc differ diff --git a/resource/book.png b/resource/book.png new file mode 100644 index 0000000..ef059c6 Binary files /dev/null and b/resource/book.png differ diff --git a/resource/book.py b/resource/book.py new file mode 100644 index 0000000..2379fb1 --- /dev/null +++ b/resource/book.py @@ -0,0 +1 @@ +book_base64 = 'iVBORw0KGgoAAAANSUhEUgAAAQ8AAAGKCAMAAAAljDRnAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACHUExURQAAAL+/v7Ompq+vr66oqK+qqq+rq66qqq6rq6+pqa2rq6+tra6srK6pqa+rq62pqbCsrK+srK+srK6pqa+srK+srK+rq66qqq+rq6+rq7CsrK+rq6+rq7Crq66rq66qqrCrq6+rq6+rq6+rq6+rq6+rq66qqq6rq6+qqq+rq6+srLCrq7CsrNpNNrIAAAAmdFJOUwAEFCMsMEBITFNkZnJ0fICHnJ+go6+/wcLDx8/S19rf5+/w9fn7jVpzpgAAAAlwSFlzAAAywAAAMsABKGRa2wAABoxJREFUeF7t3Wl3ozYARuF0Y7q7q7t3mi5pM+3//32VxOuEFwOSHMAeuM+H2rFlQHdkO9A5Z+4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwck1zDB5b4d7h0OiZPWpOJVyoogH7ctD8B+2viSY+7rirJJOr42RHq2T4s+PcXpJouiV2UURzLbODIpppqc2/bTTPCtsuoklW2XIRTbHSdotogtW2WkTTq7fRUz7NrpX+0JvmcCj6Le3lS6SJdP9GaG6t7gybgijVRVLr50sLXekyw5UvNITD09G0+vPLNikPEjZVemoQrzSsnaV7AejZ0PQySQqKlKy0Aetdfxm5ADQ6ucPUSfD0QV/Y4snSTeKVQe1qwPjOp6Y19qqwL414kbmuv2jm7edU/Bxv0uanTO2591HTNfSymWK00g7id1H6NI6P1Ec6O/wH3U7I7GS0SP91s8YYU1fkbDEU5MjvYqzIUc8na8SIaoJMfQKOK9jD2IZPX5BrxYjKv5TzHxWDioqPFEkHt2aN3qqcdHbMJe+W4hU4XCR8YK9ao6bHhQdW+o4cDvKTbtejw8nT+Frln1BjHyPr0sHkaXyt8h4vem/Ec4V47hZ/K0q3QfnZTYeOJU/ja1X0uGSJhArT5/cpT0UYvSxP4yfFP6TGv4iqelQFibvSywqUXoHR8DyNH3c8HZ1+btX1KP1WP152zafgVFAj8zR+RPfqgh5qVfYo+B67sEUruwA1Lk/jR3SnrYda1T2mgzwtwgu9hT3Gg7xoZbQW6hFnqbutOXuMBHnp0ki8x9hDJTS+tWyPoSAXbefc29mjv6pnWRrJFnrMV2MbPfTgLOjh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OHo4ejh6OGu3uOif/xpwz2i+E+xVmXZeI9WRZRd9EhCFI2asp8eSbbJznoEx8n3zv56RONJ9tkjGEmy2x7xjaNXdW2rR/ZffO45L7KtHoX/JnhH/1t4Wz38mVLdj5KN9ah9w8jzItlYj94uyp2KbK1H1LQOh8OxYr2029liDxe6FFaJW9p+j1ZRlLCpvfSIDr7/Ib0heuEsbq9H0OSWiT+tV83iJntEpR8ngV4xi5vtEVeJXpuj8bO4To/TN21HfETPPiv4LAk0OGdgp0Fvt6v2iMdznP5tI15ajgcZh0cli0RDB6UEmX0GT1e01+pxrPqtK4ll4jFmi6Td9+XTDwhHqXuttKVFelwuZPlad0e0+3/WNNUhRqTN3ViP5LVuB7X7T+ZLkaRt3mKPx8cH3Q5o9x9izNoiSpu9zR4TReLew8LQT3OKW77ZHqNF4srQ3Zmlid1uj5EgC8UI0sRuuMfkx8gC0sRuuse6QdLEbrvHqtLE5uqx3Nt6Lcc0sbl61P9vllJrvWfiLObrMbJAwllFezb7fF6ZfkqnnoW/UVUHCTtNp0ORdto67VfjTLs85uvRDxIOaeCc/lw6xHnebWmXJfsMew071atayjFjj06Q6b/PMSyeqevlffkFcjwWdnDPTU455uxxF8+545+RfrzARBQ5a3NhipN0yaXz1x7n6BEP6kx8o/akN7TT5ky/ycTyGGuhrRsdRIeOtEvbPdHm8jR+Cem4XnfO+bs9Ovfv739KQ2c/z+3QbPM0fkkPti4mFsmCNNs8jV+YJ7kCzTZP45d33SKabZ7GL+yf+J/eIok/pcfXoNnmafw6Hq72vtFs8zR+LQ+9982/ul2aZpu34Hfck7UmPe7pt9as5U5nb8npF+8CKyyQ/3R7NeXL49oL5I1ul1V1XrR8kIlJr/KFW3maGM+6dAJhtLUlvflbd+agw3bh4cocVXSK2aVzTKODOfn5Dx1yz5+/aECHttClHRkdz1vqw79UwH2sp/fno++VoOPXT/TkHr37xb0ynHz7vp7aqfc+/U4lgt+/fKWHd+ydV59/88Nvj/c/fvXZB3oIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUuLv7Hzo1zyb0ghw2AAAAAElFTkSuQmCC' \ No newline at end of file diff --git a/resource/example1.png b/resource/example1.png new file mode 100644 index 0000000..172425c Binary files /dev/null and b/resource/example1.png differ diff --git a/resource/example2.png b/resource/example2.png new file mode 100644 index 0000000..fea2b0d Binary files /dev/null and b/resource/example2.png differ diff --git a/resource/logo.png b/resource/logo.png new file mode 100644 index 0000000..0ed445d Binary files /dev/null and b/resource/logo.png differ diff --git a/resource/logo.py b/resource/logo.py new file mode 100644 index 0000000..555401e --- /dev/null +++ b/resource/logo.py @@ -0,0 +1 @@ +logo_base64 = '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' \ No newline at end of file diff --git a/resource/trans_base64.py b/resource/trans_base64.py new file mode 100644 index 0000000..17c2db6 --- /dev/null +++ b/resource/trans_base64.py @@ -0,0 +1,23 @@ +from PIL import Image +import base64 +# from resource.logo import logo_base64 +import io + +# # 从Base64编码数据中获取图像数据 +# image_bytes = base64.b64decode(logo_base64) + +# # 将图像数据解码为Image对象 +# image = Image.open(io.BytesIO(image_bytes)) + +# # 显示图像 +# image.show() + + +def image_to_base64(image_path): + with open(image_path, "rb") as image_file: + encoded_string = base64.b64encode(image_file.read()) + return encoded_string.decode("utf-8") + +image_path = "resource/logo.png " +base64_string = image_to_base64(image_path) +print(base64_string) \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..5a6d332 --- /dev/null +++ b/utils.py @@ -0,0 +1,197 @@ +def get_cover_html(img_w, img_h): + img_htmls = [] + img_msg = ' \n' + img_htmls.append('\n') + img_htmls.append('\n') + img_htmls.append('\n') + img_htmls.append('\n') + img_htmls.append(' Cover\n') + img_htmls.append('\n') + img_htmls.append('\n') + img_htmls.append('
\n') + img_htmls.append(' \n') + img_htmls.append(img_msg) + img_htmls.append(' \n') + img_htmls.append('
\n') + img_htmls.append('\n') + img_htmls.append('') + return img_htmls + + +def get_xhtml(img): + text_body = [] + text_body.append('\n') + text_body.append(' \"'+\n') + text_body.append('\n') + text_head = [] + text_head.append('\n') + text_head.append(' \n') + text_head.append('\n') + text_htmls = ['\n', '\n'] + text_head + text_body + [''] + return text_htmls + +def get_toc_html(title, chap_names, chap_imgs): + toc_htmls = [] + toc_htmls.append('\n') + toc_htmls.append('\n\n') + toc_htmls.append('\n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append('\n') + toc_htmls.append(' '+ title +'\n') + toc_htmls.append('\n') + toc_htmls.append('\n') + for chap_no, (chap_name, chap_img) in enumerate(zip(chap_names, chap_imgs)): + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' '+ chap_name +'\n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append(' \n') + toc_htmls.append('\n') + toc_htmls.append('') + return toc_htmls + + +def get_content_html(title, author, img_list): + content_htmls = [] + content_htmls.append('\n') + content_htmls.append('\n') + content_htmls.append(' \n') + content_htmls.append(' urn:uuid:942b8224-476b-463b-9078-cdfab0ee2686\n') + content_htmls.append(' zh\n') + content_htmls.append(' '+ title +'\n') + content_htmls.append(' '+ author +'\n') + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + for img in img_list: + text = img.replace('.jpg', '.xhtml') + content_htmls.append(' \n') + + content_htmls.append(' \n') + + for img in img_list: + content_htmls.append(' \n') + + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + + content_htmls.append(' \n') + for img in img_list: + text = img.replace('.jpg', '.xhtml') + content_htmls.append(' \n') + + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append(' \n') + content_htmls.append('\n') + return content_htmls + + +def get_container_html(): + container_htmls = [] + container_htmls.append('\n') + container_htmls.append('\n') + container_htmls.append(' \n') + container_htmls.append(' \n') + container_htmls.append(' \n') + container_htmls.append('\n') + return container_htmls + + +def get_color_html(colorimg_num): + color_htmls = [] + color_htmls.append('\n') + color_htmls.append('\n') + color_htmls.append('\n') + + color_htmls.append(' 彩插\n') + color_htmls.append('\n') + color_htmls.append('\n') + for i in range(1, colorimg_num): + color_htmls.append(' \"'+str(i).zfill(2)+'\"\n') + color_htmls.append('\n') + color_htmls.append('') + return color_htmls + + + +def get_vol(vol_no): + vol_no = str(vol_no) + s="零一二三四五六七八九" + for c in "0123456789": + vol_no=vol_no.replace(c,s[eval(c)]) + vol_no = '第' + vol_no + '卷' + return vol_no + + +def check_chars(win_chars): + win_illegal_chars = '?*"<>|:/\\' + new_chars = '' + for char in win_chars: + if char in win_illegal_chars: + new_chars += '\u25A0' + else: + new_chars += char + return new_chars + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +