def HandlerDownloadTask(self, downlodaId, laveFileSize, data, isCallBack=True): info = self.downloadTask.get(downlodaId) if not info: return assert isinstance(info, QtDownloadTask) if laveFileSize == -1 and data == b"": try: if info.downloadCompleteBack: if info.backParam is not None: info.downloadCompleteBack( self.GetDownloadData(downlodaId), Status.Error, info.backParam) else: info.downloadCompleteBack( self.GetDownloadData(downlodaId), Status.Error) except Exception as es: Log.Error(es) self.ClearDownloadTask(downlodaId) return if info.isSaveData: info.saveData += data if info.downloadCallBack: try: if info.backParam is not None: info.downloadCallBack(data, laveFileSize, info.backParam) else: info.downloadCallBack(data, laveFileSize) except Exception as es: Log.Error(es) if laveFileSize == 0 and data == b"": if info.downloadCompleteBack: try: if info.cleanFlag: taskIds = self.flagToIds.get(info.cleanFlag, set()) taskIds.discard(info.downloadId) if info.backParam is not None: info.downloadCompleteBack( self.GetDownloadData(downlodaId), Status.Ok, info.backParam) else: info.downloadCompleteBack( self.GetDownloadData(downlodaId), Status.Ok) except Exception as es: Log.Error(es) self.ClearDownloadTask(downlodaId)
def InitUpdateBack(self, data): try: info = re.findall(r"\d+\d*", os.path.basename(data)) version = int(info[0]) * 100 + int(info[1]) * 10 + int(info[2]) * 1 info2 = re.findall(r"\d+\d*", os.path.basename(config.UpdateVersion)) curversion = int(info2[0]) * 100 + int(info2[1]) * 10 + int( info2[2]) * 1 if version > curversion: r = QMessageBox.information( self, "更新", "当前版本{} ,检查到更新{},是否前往更新".format(config.UpdateVersion, info), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if r == QMessageBox.Yes: QDesktopServices.openUrl( QUrl( "https://github.com/tonquer/picacg-windows/releases" )) except Exception as Es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e)
def DelRecordingAndFile(self): selected = self.tableWidget.selectedIndexes() selectRows = set() for index in selected: selectRows.add(index.row()) if not selectRows: return try: selectRows = list(selectRows) selectRows.sort(reverse=True) for row in selectRows: col = 0 bookId = self.tableWidget.item(row, col).text() bookInfo = self.downloadDict.get(bookId) if not bookInfo: continue self.RemoveRecord(bookId) if os.path.isdir(bookInfo.savePath): shutil.rmtree(bookInfo.savePath) except Exception as es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) self.UpdateTableRow()
def UpdateFavoritesBack(self, backData): try: if backData.status != Status.Ok: return backData.status, self.page if backData.res.code == 200: info = backData.res.data.get("comics", {}) self.total = info["total"] self.page = info["page"] self.pages = info["pages"] self.category[self.page] = [] for bookInfo in info["docs"]: data = CategoryInfo() ToolUtil.ParseFromData(data, bookInfo) self.category[self.page].append(data) Log.Info("收藏夹加载成功, page:{}, pages:{}, num:{}".format( self.page, self.pages, self.total)) return Status.Ok, self.page else: return Status.Error + backData.res.message, self.page except Exception as e: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) return Status.Error + e, self.page
def AddConvertBack(self, data, waifuId, backParam, tick): try: if data: savePath = os.path.dirname(self.curConvertPath) if not os.path.isdir(savePath): os.makedirs(savePath) f = open(self.curConvertPath, "wb+") f.write(data) f.close() self.tick = tick self.resetConvertCnt = 0 self.curPreConvertId += 1 self.StartConvert() else: self.resetConvertCnt += 1 if self.resetConvertCnt >= 3: self.status = DownloadInfo.Error self.parent.SetConvertStatu(DownloadInfo.Error) else: self.StartConvert() except Exception as es: Log.Error(es) self.status = DownloadInfo.Error self.parent.SetConvertStatu(DownloadInfo.Error) return
def ParseFromData(desc, src): try: if isinstance(src, str): src = json.loads(src) for k, v in src.items(): setattr(desc, k, v) except Exception as es: Log.Error(es)
def _Send(self, task): try: if task.req.method.lower() == "post": self.Post(task) elif task.req.method.lower() == "get": self.Get(task) else: return except Exception as es: task.status = Status.NetError Log.Error(es) try: self.handler.get(task.req.__class__)(task) if task.res.raw: task.res.raw.close() except Exception as es: Log.Error(es)
def InitUpdateBack(self, data): try: r = QMessageBox.information(self, "更新", "当前版本{} ,检查到更新,是否前往更新\n{}".format(config.UpdateVersion, data), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if r == QMessageBox.Yes: QDesktopServices.openUrl(QUrl(config.UpdateUrl2)) except Exception as es: Log.Error(es)
def RunDownload(self): while True: task = self._downloadQueue.get(True) self._downloadQueue.task_done() try: self._Download(task) except Exception as es: Log.Error(es) pass
def InitUpdateBack(self, data): try: r = QMessageBox.information( self, "更新", "当前版本{} ,检查到更新,是否前往更新\n{}".format(config.UpdateVersion, data), QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if r == QMessageBox.Yes: QDesktopServices.openUrl( QUrl("https://github.com/tonquer/picacg-windows/releases")) except Exception as es: Log.Error(es)
def LoadCachePicture(filePath): try: c = CTime() if not os.path.isfile(filePath): return None with open(filePath, "rb") as f: data = f.read() c.Refresh("LoadCache", filePath) return data except Exception as es: Log.Error(es) return None
def ParseFromData(desc, src): try: if isinstance(src, str): src = json.loads(src) for k, v in src.items(): setattr(desc, k, v) except Exception as E: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e)
def OpenPicture(self): try: filename = QFileDialog.getOpenFileName(self, "Open Image", ".", "Image Files(*.jpg *.png)") if filename and len(filename) >= 1: name = filename[0] if os.path.isfile(name): f = open(name, "rb") data = f.read() f.close() self.ShowImg(data) except Exception as ex: Log.Error(ex) return
def Run(self): while True: try: task = self._inQueue.get(True) except Exception as es: continue pass self._inQueue.task_done() try: self._Send(task) except Exception as es: Log.Error(es) pass
def RunDownload(self): while True: task = self._downloadQueue.get(True) self._downloadQueue.task_done() try: self._Download(task) except Exception as es: import sys cur_tb = sys.exc_info()[2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) time.sleep(1) pass
def Waifu2xBack(self, data, waifu2xId, index, tick): self.waitWaifuPicData.discard(index) if waifu2xId > 0: self.waifu2xIdToIndex[waifu2xId] = index self.indexToWaifu2xId[index] = waifu2xId if waifu2xId not in self.waifu2xIdToIndex: Log.Error("Not found waifu2xId :{}, index: {}".format( str(waifu2xId), str(index))) return p = self.pictureData.get(index) p.SetWaifuData(data, round(tick, 2)) if index == self.curIndex: self.ShowImg()
def RegisterBack(self, backData): try: if backData.status != Status.Ok: return backData.status if backData.res.code == 200: Log.Info("注册成功: {}".format(backData.res.raw.text)) return Status.Ok else: Log.Info("注册失败!!!, userId:{}, msg:{}".format( self.userId, backData.res.message)) return Status.RegisterError + backData.res.message except Exception as es: Log.Error(es) return Status.NetError
def _Send(self, task): try: if task.req.method.lower() == "post": self.Post(task) elif task.req.method.lower() == "get": self.Get(task) else: return except Exception as es: task.status = Status.NetError import sys cur_tb = sys.exc_info()[2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) try: self.handler.get(task.req.__class__)(task) if task.res.raw: task.res.raw.close() except Exception as es: import sys cur_tb = sys.exc_info()[2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e)
def AddBookByIdBack(self, backData): try: if backData.res.data.get("comic"): info = self.books.get(backData.res.data['comic']['_id']) if not info: info = Book() ToolUtil.ParseFromData(info, backData.res.data['comic']) self.books[info.id] = info return Status.Ok else: Log.Warn("未找到书籍, bookId:{}".format(backData)) return Status.NotFoundBook except Exception as es: Log.Error(es) return Status.NetError
def InitBack(self, backData): try: if backData.status == Status.Ok and backData.res.status == "ok": if len(backData.res.addresses) > 0: self.addresss = backData.res.addresses[:] # self.address = backData.res.addresses[0] Log.Info("初始化成功, Ips:{}".format(self.addresss)) self.initRes = backData.res return Status.Ok else: Log.Info("初始化失败, info:{}".format(backData.res)) return Status.Error except Exception as es: Log.Error(es) return Status.Error
def SavePicture(self): data = QtImgMgr().waifu2xData if QtImgMgr().waifu2xData else QtImgMgr().data if not data: return try: today = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) filepath = QFileDialog.getSaveFileName(self, "保存", "{}.jpg".format(today)) if filepath and len(filepath) >= 1: name = filepath[0] f = open(name, "wb") f.write(data) f.close() except Exception as es: Log.Error(es) return
def SavePicture(self): data = self.waifu2xData if self.waifu2xData else self.data if not data: return try: today = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time())) picFormat = self.format if self.format else "jpg" filepath = QFileDialog.getSaveFileName(self, "Save", "{}.{}".format(today, picFormat)) if filepath and len(filepath) >= 1 and filepath[0]: name = filepath[0] f = open(name, "wb") f.write(data) f.close() except Exception as es: Log.Error(es) return
def InitImageServer(self, backData): try: if backData.res.code == 200: # 选择了分流才设置 if self.server.address: self.server.imageServer = ToolUtil.GetUrlHost( backData.res.data["imageServer"]) Log.Info("初始化图片服务器成功, info:{}".format( self.server.imageServer)) return Status.Ok else: return Status.Error except Exception as es: Log.Error(es) return Status.Error
def UpdateUserInfoBack(self, backData): try: if backData.res.code == 200: self.userInfo = backData.res.data["user"] self.name = backData.res.data["user"]["name"] self.level = backData.res.data["user"]["level"] self.exp = backData.res.data["user"]["exp"] self.created = backData.res.data["user"]["created_at"] self.gender = backData.res.data["user"]["gender"] self.title = backData.res.data["user"]["title"] self.title = backData.res.data["user"]["title"] self.isPunched = backData.res.data["user"]["isPunched"] self.avatar = backData.res.data["user"].get("avatar") except Exception as es: Log.Error(es) return Status.NetError
def AddBookEpsPicInfoBack(self, backData): # 此处在线程中加载后续分页 TODO 分页太多时会导致太慢 try: r = backData.res bookId = backData.req.bookId epsId = backData.req.epsId bookInfo = self.books.get(bookId) epsInfo = bookInfo.eps[epsId - 1] page = r.data['pages']["page"] pages = r.data['pages']["pages"] limit = r.data['pages']["limit"] # 重新初始化 # if page == 1: # del epsInfo.pics[:] for i, data in enumerate(r.data['pages']['docs']): index = (page - 1) * limit + i if len(epsInfo.pics) > index: picInfo = epsInfo.pics[index] else: picInfo = Picture() epsInfo.pics.append(picInfo) ToolUtil.ParseFromData(picInfo, data['media']) loadPage = int((len(epsInfo.pics) - 1) / limit + 1) nextPage = page + 1 # 如果已经有了,则从最后那一页加载起就可以了 if loadPage > nextPage: nextPage = loadPage if nextPage <= pages: self.server.Send(req.GetComicsBookOrderReq( bookId, epsId, nextPage), bakParam=backData.bakParam, isASync=False) return Status.WaitLoad return Status.Ok except Exception as es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) return Status.Error
def GetSettingV(self, key, defV=None): v = self.settings.value(key) try: if v: if isinstance(defV, int): if v == "true" or v == "True": return 1 elif v == "false" or v == "False": return 0 return int(v) elif isinstance(defV, float): return float(v) else: return v return defV except Exception as es: Log.Error(es) return v
def RegisterBack(self, backData): try: if backData.status != Status.Ok: return backData.status if backData.res.code == 200: Log.Info("注册成功: {}".format(backData.res.raw.text)) return Status.Ok else: Log.Info("注册失败!!!, userId:{}, msg:{}".format( self.userId, backData.res.message)) return Status.RegisterError + backData.res.message except Exception as es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) return Status.NetError
def AddBookEpsInfoBack(self, backData): # 此处在线程中加载后续章节 TODO 章节太多时会导致太慢 try: r = backData.res bookId = backData.req.bookId info = self.books.get(bookId) info.epsCount = r.data['eps']["total"] page = r.data['eps']["page"] # 重新初始化 pages = r.data['eps']["pages"] limit = r.data['eps']["limit"] # 优化,如果分页已经加载好了,只需要重新加载更新最后一页即可 for i, data in enumerate(r.data['eps']['docs']): index = (page - 1) * limit + i if len(info.eps) > index: epsInfo = info.eps[index] else: epsInfo = BookEps() info.eps.append(epsInfo) ToolUtil.ParseFromData(epsInfo, data) loadPage = int((len(info.eps) - 1) / limit + 1) nextPage = page + 1 # 如果已经有了,则从最后那一页加载起就可以了 if loadPage > nextPage: nextPage = loadPage info.eps.sort(key=lambda a: a.order) if nextPage <= pages: self.server.Send(req.GetComicsBookEpsReq(bookId, nextPage), bakParam=backData.bakParam, isASync=False) return Status.WaitLoad return Status.Ok except Exception as es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) return Status.Error
def AddBookEpsInfoBack(self, backData): # 此处在线程中加载后续章节 TODO 章节太多时会导致太慢 try: r = backData.res bookId = backData.req.bookId info = self.books.get(bookId) info.epsCount = r.data['eps']["total"] page = r.data['eps']["page"] # 重新初始化 pages = r.data['eps']["pages"] limit = r.data['eps']["limit"] # 优化,如果分页已经加载好了,只需要重新加载更新最后一页即可 for i, data2 in enumerate(r.data['eps']['docs']): # index = (page -1) * limit + i epsId = data2.get('id') if epsId in info.epsDict: epsInfo = info.epsDict[epsId] else: epsInfo = BookEps() info.epsDict[epsId] = epsInfo # info.eps.append(epsInfo) ToolUtil.ParseFromData(epsInfo, data2) loadPage = int((len(info.epsDict) - 1) / limit + 1) nextPage = page + 1 # 如果已经有了,则从最后那一页加载起就可以了 if loadPage > nextPage: nextPage = loadPage info.eps = list(info.epsDict.values()) info.eps.sort(key=lambda a: a.order) if nextPage <= pages: self.server.Send(req.GetComicsBookEpsReq(bookId, nextPage), bakParam=backData.bakParam, isASync=False) return Status.WaitLoad return Status.Ok except Exception as es: Log.Error(es) return Status.Error
def AddBookByIdBack(self, backData): try: if backData.res.data.get("comic"): info = self.books.get(backData.res.data['comic']['_id']) if not info: info = Book() ToolUtil.ParseFromData(info, backData.res.data['comic']) self.books[info.id] = info return Status.Ok else: Log.Warn("未找到书籍, bookId:{}".format(backData)) return Status.NotFoundBook except Exception as es: import sys cur_tb = sys.exc_info()[ 2] # return (exc_type, exc_value, traceback) e = sys.exc_info()[1] Log.Error(cur_tb, e) return Status.NetError