diff --git a/README.md b/README.md index 193b44bd..d22f7d8a 100644 --- a/README.md +++ b/README.md @@ -255,10 +255,11 @@ location /cgi-bin/menu/create { } ``` -![image](https://github.com/jxxghp/MoviePilot/assets/51039935/b8f0238d-847f-4f9d-b210-e905837362b9) +![image](https://github.com/jxxghp/MoviePilot/assets/51039935/f2654b09-26f3-464f-a0af-1de3f97832ee) -![image](https://github.com/jxxghp/MoviePilot/assets/51039935/28219233-ec7d-479b-b184-9a901c947dd1) +![image](https://github.com/jxxghp/MoviePilot/assets/51039935/fcb87529-56dd-43df-8337-6e34b8582819) -![image](https://github.com/jxxghp/MoviePilot/assets/51039935/f7df0806-668d-4c8b-ad41-133bf8f0bf73) +![image](https://github.com/jxxghp/MoviePilot/assets/51039935/bfa77c71-510a-46a6-9c1e-cf98cb101e3a) + +![image](https://github.com/jxxghp/MoviePilot/assets/51039935/51cafd09-e38c-47f9-ae62-1e83ab8bf89b) -![image](https://github.com/jxxghp/MoviePilot/assets/51039935/f7ea77cd-0362-4c35-967c-7f1b22dbef05) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 69c6eeaa..fa3336f0 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -185,6 +185,7 @@ class TransferChain(ChainBase): # 转移成功的不再处理 transferd = self.transferhis.get_by_src(file_path_str) if transferd and transferd.status: + logger.info(f"{file_path} 已成功转移过,如需重新处理,请删除历史记录。") continue # 更新进度 diff --git a/app/plugins/brushflow/__init__.py b/app/plugins/brushflow/__init__.py index 79920d40..34d30a28 100644 --- a/app/plugins/brushflow/__init__.py +++ b/app/plugins/brushflow/__init__.py @@ -132,75 +132,89 @@ class BrushFlow(_PluginBase): self.qb = Qbittorrent() self.tr = Transmission() # 检查配置 + if self._downloader == "qbittorrent": + if self.qb.is_inactive(): + logger.error("站点刷流任务出错:Qbittorrent未连接") + self.systemmessage.put("站点刷流任务出错:Qbittorrent未连接") + return + elif self._downloader == "transmission": + if self.tr.is_inactive(): + logger.error("站点刷流任务出错:Transmission未连接") + self.systemmessage.put("站点刷流任务出错:Transmission未连接") + return if self._disksize and not StringUtils.is_number(self._disksize): + logger.error(f"站点刷流任务出错,保种体积设置错误:{self._disksize}") + self.systemmessage.put(f"站点刷流任务出错,保种体积设置错误:{self._disksize}") self._disksize = 0 - logger.error(f"保种体积设置错误:{self._disksize}") - self.systemmessage.put(f"保种体积设置错误:{self._disksize}") return if self._maxupspeed and not StringUtils.is_number(self._maxupspeed): + logger.error(f"站点刷流任务出错,总上传带宽设置错误:{self._maxupspeed}") + self.systemmessage.put(f"站点刷流任务出错,总上传带宽设置错误:{self._maxupspeed}") self._maxupspeed = 0 - logger.error(f"总上传带宽设置错误:{self._maxupspeed}") - self.systemmessage.put(f"总上传带宽设置错误:{self._maxupspeed}") return if self._maxdlspeed and not StringUtils.is_number(self._maxdlspeed): + logger.error(f"站点刷流任务出错,总下载带宽设置错误:{self._maxdlspeed}") + self.systemmessage.put(f"站点刷流任务出错,总下载带宽设置错误:{self._maxdlspeed}") self._maxdlspeed = 0 - logger.error(f"总下载带宽设置错误:{self._maxdlspeed}") - self.systemmessage.put(f"总下载带宽设置错误:{self._maxdlspeed}") return if self._maxdlcount and not StringUtils.is_number(self._maxdlcount): + logger.error(f"站点刷流任务出错,同时下载任务数设置错误:{self._maxdlcount}") + self.systemmessage.put(f"站点刷流任务出错,同时下载任务数设置错误:{self._maxdlcount}") self._maxdlcount = 0 - logger.error(f"同时下载任务数设置错误:{self._maxdlcount}") - self.systemmessage.put(f"同时下载任务数设置错误:{self._maxdlcount}") - return - if self._size and not StringUtils.is_number(self._size): - self._size = 0 - logger.error(f"种子大小设置错误:{self._size}") - self.systemmessage.put(f"种子大小设置错误:{self._size}") - return - if self._seeder and not StringUtils.is_number(self._seeder): - self._seeder = 0 - logger.error(f"做种人数设置错误:{self._seeder}") - self.systemmessage.put(f"做种人数设置错误:{self._seeder}") return + if self._size: + size = str(self._size).split("-")[0] + if not StringUtils.is_number(size): + logger.error(f"站点刷流任务出错,种子大小设置错误:{self._size}") + self.systemmessage.put(f"站点刷流任务出错,种子大小设置错误:{self._size}") + self._size = 0 + return + if self._seeder: + seeder = str(self._seeder).split("-")[0] + if not StringUtils.is_number(seeder): + logger.error(f"站点刷流任务出错,做种人数设置错误:{self._seeder}") + self.systemmessage.put(f"站点刷流任务出错,做种人数设置错误:{self._seeder}") + self._seeder = 0 + return if self._seed_time and not StringUtils.is_number(self._seed_time): + logger.error(f"站点刷流任务出错,做种时间设置错误:{self._seed_time}") + self.systemmessage.put(f"站点刷流任务出错,做种时间设置错误:{self._seed_time}") self._seed_time = 0 - logger.error(f"做种时间设置错误:{self._seed_time}") - self.systemmessage.put(f"做种时间设置错误:{self._seed_time}") return if self._seed_ratio and not StringUtils.is_number(self._seed_ratio): + logger.error(f"站点刷流任务出错,分享率设置错误:{self._seed_ratio}") + self.systemmessage.put(f"站点刷流任务出错,分享率设置错误:{self._seed_ratio}") self._seed_ratio = 0 - logger.error(f"分享率设置错误:{self._seed_ratio}") - self.systemmessage.put(f"分享率设置错误:{self._seed_ratio}") return if self._seed_size and not StringUtils.is_number(self._seed_size): + logger.error(f"站点刷流任务出错,上传量设置错误:{self._seed_size}") + self.systemmessage.put(f"站点刷流任务出错,上传量设置错误:{self._seed_size}") self._seed_size = 0 - logger.error(f"上传量设置错误:{self._seed_size}") - self.systemmessage.put(f"上传量设置错误:{self._seed_size}") return if self._download_time and not StringUtils.is_number(self._download_time): + logger.error(f"站点刷流任务出错,下载超时时间设置错误:{self._download_time}") + self.systemmessage.put(f"站点刷流任务出错,下载超时时间设置错误:{self._download_time}") self._download_time = 0 - logger.error(f"下载超时时间设置错误:{self._download_time}") - self.systemmessage.put(f"下载超时时间设置错误:{self._download_time}") return if self._seed_avgspeed and not StringUtils.is_number(self._seed_avgspeed): + logger.error(f"站点刷流任务出错,平均上传速度设置错误:{self._seed_avgspeed}") + self.systemmessage.put(f"站点刷流任务出错,平均上传速度设置错误:{self._seed_avgspeed}") self._seed_avgspeed = 0 - logger.error(f"平均上传速度设置错误:{self._seed_avgspeed}") - self.systemmessage.put(f"平均上传速度设置错误:{self._seed_avgspeed}") return if self._seed_inactivetime and not StringUtils.is_number(self._seed_inactivetime): + logger.error(f"站点刷流任务出错,未活动时间设置错误:{self._seed_inactivetime}") + self.systemmessage.put(f"站点刷流任务出错,未活动时间设置错误:{self._seed_inactivetime}") self._seed_inactivetime = 0 - logger.error(f"未活动时间设置错误:{self._seed_inactivetime}") - self.systemmessage.put(f"未活动时间设置错误:{self._seed_inactivetime}") return if self._up_speed and not StringUtils.is_number(self._up_speed): + logger.error(f"站点刷流任务出错,单任务上传限速设置错误:{self._up_speed}") + self.systemmessage.put(f"站点刷流任务出错,单任务上传限速设置错误:{self._up_speed}") self._up_speed = 0 - logger.error(f"单任务上传限速设置错误:{self._up_speed}") - self.systemmessage.put(f"单任务上传限速设置错误:{self._up_speed}") return if self._dl_speed and not StringUtils.is_number(self._dl_speed): + logger.error(f"站点刷流任务出错,单任务下载限速设置错误:{self._dl_speed}") + self.systemmessage.put(f"站点刷流任务出错,单任务下载限速设置错误:{self._dl_speed}") self._dl_speed = 0 - logger.error(f"单任务下载限速设置错误:{self._dl_speed}") - self.systemmessage.put(f"单任务下载限速设置错误:{self._dl_speed}") return # 检查必要条件 @@ -221,13 +235,16 @@ class BrushFlow(_PluginBase): self._scheduler.add_job(self.brush, 'date', run_date=datetime.now( tz=pytz.timezone(settings.TZ) - ) + timedelta(seconds=3)) + ) + timedelta(seconds=3), + name="站点刷流服务") # 关闭一次性开关 self._onlyonce = False self.__update_config() if self._scheduler.get_jobs(): # 增加检查任务 - self._scheduler.add_job(self.check, 'interval', minutes=self._check_interval) + self._scheduler.add_job(self.check, 'interval', + minutes=self._check_interval, + name="站点刷流检查服务") # 启动服务 self._scheduler.print_jobs() self._scheduler.start() @@ -741,13 +758,13 @@ class BrushFlow(_PluginBase): else: data_list = data_list.values() # 总上传量格式化 - total_upload = StringUtils.str_filesize(stattistic_data.get("uploaded")) + total_upload = StringUtils.str_filesize(stattistic_data.get("uploaded") or 0) # 总下载量格式化 - total_download = StringUtils.str_filesize(stattistic_data.get("downloaded")) + total_download = StringUtils.str_filesize(stattistic_data.get("downloaded") or 0) # 下载种子数 - total_count = stattistic_data.get("count") + total_count = stattistic_data.get("count") or 0 # 删除种子数 - total_deleted = stattistic_data.get("deleted") + total_deleted = stattistic_data.get("deleted") or 0 # 种子数据明细 torrent_trs = [ { @@ -785,6 +802,9 @@ class BrushFlow(_PluginBase): }, { 'component': 'td', + 'props': { + 'class': 'text-no-wrap' + }, 'text': "已删除" if data.get("deleted") else "正常" } ] @@ -1038,7 +1058,7 @@ class BrushFlow(_PluginBase): { 'component': 'VImg', 'props': { - 'src': '/plugin/torrentremover.png' + 'src': '/plugin/delete.png' } } ] @@ -1091,6 +1111,9 @@ class BrushFlow(_PluginBase): 'content': [ { 'component': 'thead', + 'props': { + 'class': 'text-no-wrap' + }, 'content': [ { 'component': 'th', @@ -1214,7 +1237,10 @@ class BrushFlow(_PluginBase): task_info: Dict[str, dict] = self.get_data("torrents") or {} if task_info: # 当前保种大小 - torrents_size = sum([task.get("size") or 0 for task in task_info.values()]) + torrents_size = sum([ + task.get("size") or 0 + for task in task_info.values() if not task.get("deleted") + ]) else: torrents_size = 0 # 读取统计数据 @@ -1306,7 +1332,8 @@ class BrushFlow(_PluginBase): # 同时下载任务数 downloads = self.__get_downloading_count(self._downloader) if self._maxdlcount and downloads >= int(self._maxdlcount): - continue + logger.warn(f"当前同时下载任务数 {downloads} 已达到最大值 {self._maxdlcount},停止新增任务") + break # 获取下载器的下载信息 downloader_info = self.__get_downloader_info() if downloader_info: @@ -1315,11 +1342,15 @@ class BrushFlow(_PluginBase): # 总上传带宽(KB/s) if self._maxupspeed \ and current_upload_speed >= float(self._maxupspeed) * 1024: - continue + logger.warn(f"当前总上传带宽 {StringUtils.str_filesize(current_upload_speed)} " + f"已达到最大值 {self._maxupspeed} KB/s,暂时停止新增任务") + break # 总下载带宽(KB/s) if self._maxdlspeed \ and current_download_speed >= float(self._maxdlspeed) * 1024: - continue + logger.warn(f"当前总下载带宽 {StringUtils.str_filesize(current_download_speed)} " + f"已达到最大值 {self._maxdlspeed} KB/s,暂时停止新增任务") + break # 添加下载任务 hash_string = self.__download(torrent=torrent) if not hash_string: @@ -1383,8 +1414,8 @@ class BrushFlow(_PluginBase): "downloaded": 0 } # 获取下载器中的种子 - torrents, state = downloader.get_torrents(ids=check_hashs) - if not state: + torrents, error = downloader.get_torrents(ids=check_hashs) + if error: logger.warn("连接下载器出错,将在下个时间周期重试") return if not torrents: @@ -1485,6 +1516,12 @@ class BrushFlow(_PluginBase): # 更新统计数据 statistic_info["uploaded"] = total_uploaded statistic_info["downloaded"] = total_downloaded + # 打印统计数据 + logger.info(f"刷流任务统计数据:" + f"总任务数:{len(task_info)}," + f"已删除:{statistic_info.get('deleted')}," + f"总上传量:{StringUtils.str_filesize(statistic_info.get('uploaded'))}," + f"总下载量:{StringUtils.str_filesize(statistic_info.get('downloaded'))}") # 保存统计数据 self.save_data("statistic", statistic_info) # 保存任务记录 @@ -1513,6 +1550,9 @@ class BrushFlow(_PluginBase): if self._downloader == "qbittorrent": if not self.qb: return None + # 限速值转为bytes + up_speed = up_speed * 1024 if up_speed else None + down_speed = down_speed * 1024 if down_speed else None # 生成随机Tag tag = StringUtils.generate_random_str(10) state = self.qb.add_torrent(content=torrent.enclosure, @@ -1740,7 +1780,7 @@ class BrushFlow(_PluginBase): return len(torrents) or 0 @staticmethod - def __get_pubminutes(pubdate: str) -> datetime: + def __get_pubminutes(pubdate: str) -> int: """ 将字符串转换为时间,并计算与当前时间差)(分钟) """ diff --git a/version.py b/version.py index 3c126e0b..090b41ba 100644 --- a/version.py +++ b/version.py @@ -1 +1 @@ -APP_VERSION = 'v1.1.5' +APP_VERSION = 'v1.1.6'