fix speedlimiter

This commit is contained in:
jxxghp 2023-08-07 08:30:06 +08:00
parent cde105854a
commit f46af991cd
6 changed files with 217 additions and 19 deletions

View File

@ -106,6 +106,8 @@ class Qbittorrent(metaclass=Singleton):
:param ids: 种子Hash列表 :param ids: 种子Hash列表
:param tag: 标签内容 :param tag: 标签内容
""" """
if not self.qbc:
return False
try: try:
self.qbc.torrents_delete_tags(torrent_hashes=ids, tags=tag) self.qbc.torrents_delete_tags(torrent_hashes=ids, tags=tag)
return True return True
@ -129,6 +131,8 @@ class Qbittorrent(metaclass=Singleton):
""" """
设置强制作种 设置强制作种
""" """
if not self.qbc:
return
try: try:
self.qbc.torrents_set_force_start(enable=True, torrent_hashes=ids) self.qbc.torrents_set_force_start(enable=True, torrent_hashes=ids)
except Exception as err: except Exception as err:
@ -266,6 +270,8 @@ class Qbittorrent(metaclass=Singleton):
""" """
获取种子文件清单 获取种子文件清单
""" """
if not self.qbc:
return None
try: try:
return self.qbc.torrents_files(torrent_hash=tid) return self.qbc.torrents_files(torrent_hash=tid)
except Exception as err: except Exception as err:
@ -276,6 +282,8 @@ class Qbittorrent(metaclass=Singleton):
""" """
设置下载文件的状态priority为0为不下载priority为1为下载 设置下载文件的状态priority为0为不下载priority为1为下载
""" """
if not self.qbc:
return False
if not kwargs.get("torrent_hash") or not kwargs.get("file_ids"): if not kwargs.get("torrent_hash") or not kwargs.get("file_ids"):
return False return False
try: try:
@ -291,6 +299,8 @@ class Qbittorrent(metaclass=Singleton):
""" """
获取传输信息 获取传输信息
""" """
if not self.qbc:
return None
try: try:
return self.qbc.transfer_info() return self.qbc.transfer_info()
except Exception as err: except Exception as err:

View File

@ -115,6 +115,8 @@ class Transmission(metaclass=Singleton):
""" """
设置种子标签 设置种子标签
""" """
if not self.trc:
return False
if not ids or not tags: if not ids or not tags:
return False return False
try: try:
@ -138,6 +140,8 @@ class Transmission(metaclass=Singleton):
:param cookie: 站点Cookie用于辅助下载种子 :param cookie: 站点Cookie用于辅助下载种子
:return: Torrent :return: Torrent
""" """
if not self.trc:
return None
try: try:
return self.trc.add_torrent(torrent=content, return self.trc.add_torrent(torrent=content,
download_dir=download_dir, download_dir=download_dir,
@ -193,6 +197,8 @@ class Transmission(metaclass=Singleton):
""" """
获取种子文件列表 获取种子文件列表
""" """
if not self.trc:
return None
if not tid: if not tid:
return None return None
try: try:
@ -209,6 +215,8 @@ class Transmission(metaclass=Singleton):
""" """
设置下载文件的状态 设置下载文件的状态
""" """
if not self.trc:
return False
try: try:
self.trc.change_torrent(ids=tid, files_wanted=file_ids) self.trc.change_torrent(ids=tid, files_wanted=file_ids)
return True return True
@ -220,6 +228,8 @@ class Transmission(metaclass=Singleton):
""" """
获取传输信息 获取传输信息
""" """
if not self.trc:
return None
try: try:
return self.trc.session_stats() return self.trc.session_stats()
except Exception as err: except Exception as err:

View File

@ -87,8 +87,9 @@ class CloudflareSpeedTest(_PluginBase):
if self._onlyonce: if self._onlyonce:
logger.info(f"Cloudflare CDN优选服务启动立即运行一次") logger.info(f"Cloudflare CDN优选服务启动立即运行一次")
self._scheduler.add_job(self.__cloudflareSpeedTest, 'date', self._scheduler.add_job(func=self.__cloudflareSpeedTest, trigger='date',
run_date=datetime.now(tz=pytz.timezone(settings.TZ)) + timedelta(seconds=3)) run_date=datetime.now(tz=pytz.timezone(settings.TZ)) + timedelta(seconds=3),
name="Cloudflare优选")
# 关闭一次性开关 # 关闭一次性开关
self._onlyonce = False self._onlyonce = False
self.__update_config() self.__update_config()

View File

@ -88,13 +88,16 @@ class DoubanRank(_PluginBase):
if self._cron: if self._cron:
logger.info(f"豆瓣榜单订阅服务启动,周期:{self._cron}") logger.info(f"豆瓣榜单订阅服务启动,周期:{self._cron}")
try: try:
self._scheduler.add_job(self.__refresh_rss, self._scheduler.add_job(func=self.__refresh_rss,
CronTrigger.from_crontab(self._cron)) trigger=CronTrigger.from_crontab(self._cron),
name="豆瓣榜单订阅")
except Exception as e: except Exception as e:
logger.error(f"豆瓣榜单订阅服务启动失败,错误信息:{str(e)}") logger.error(f"豆瓣榜单订阅服务启动失败,错误信息:{str(e)}")
self.systemmessage.put(f"豆瓣榜单订阅服务启动失败,错误信息:{str(e)}") self.systemmessage.put(f"豆瓣榜单订阅服务启动失败,错误信息:{str(e)}")
else: else:
self._scheduler.add_job(self.__refresh_rss, CronTrigger.from_crontab("0 8 * * *")) self._scheduler.add_job(func=self.__refresh_rss,
trigger=CronTrigger.from_crontab("0 8 * * *"),
name="豆瓣榜单订阅")
logger.info("豆瓣榜单订阅服务启动,周期:每天 08:00") logger.info("豆瓣榜单订阅服务启动,周期:每天 08:00")
if self._scheduler.get_jobs(): if self._scheduler.get_jobs():

View File

@ -66,15 +66,17 @@ class LibraryScraper(_PluginBase):
if self._cron: if self._cron:
logger.info(f"媒体库刮削服务启动,周期:{self._cron}") logger.info(f"媒体库刮削服务启动,周期:{self._cron}")
try: try:
self._scheduler.add_job(self.__libraryscraper, self._scheduler.add_job(func=self.__libraryscraper,
CronTrigger.from_crontab(self._cron)) trigger=CronTrigger.from_crontab(self._cron),
name="媒体库刮削")
except Exception as e: except Exception as e:
logger.error(f"媒体库刮削服务启动失败,原因:{e}") logger.error(f"媒体库刮削服务启动失败,原因:{e}")
self.systemmessage.put(f"媒体库刮削服务启动失败,原因:{e}") self.systemmessage.put(f"媒体库刮削服务启动失败,原因:{e}")
else: else:
logger.info(f"媒体库刮削服务启动周期每7天") logger.info(f"媒体库刮削服务启动周期每7天")
self._scheduler.add_job(self.__libraryscraper, self._scheduler.add_job(func=self.__libraryscraper,
CronTrigger.from_crontab("0 0 */7 * *")) trigger=CronTrigger.from_crontab("0 0 */7 * *"),
name="媒体库刮削")
if self._scheduler.get_jobs(): if self._scheduler.get_jobs():
# 启动服务 # 启动服务
self._scheduler.print_jobs() self._scheduler.print_jobs()

View File

@ -4,6 +4,8 @@ from apscheduler.schedulers.background import BackgroundScheduler
from app.core.config import settings from app.core.config import settings
from app.log import logger from app.log import logger
from app.modules.qbittorrent import Qbittorrent
from app.modules.transmission import Transmission
from app.plugins import _PluginBase from app.plugins import _PluginBase
@ -31,22 +33,32 @@ class SpeedLimiter(_PluginBase):
# 私有属性 # 私有属性
_scheduler = None _scheduler = None
_qb = None
_tr = None
_enabled: bool = False _enabled: bool = False
_notify: bool = False _notify: bool = False
_bandwidth: int = 0
_interval: int = 60 _interval: int = 60
_downloader: list = []
_play_up_speed: float = 0
_play_down_speed: float = 0
_noplay_up_speed: float = 0
_noplay_down_speed: float = 0
def init_plugin(self, config: dict = None): def init_plugin(self, config: dict = None):
# 读取配置 # 读取配置
if config: if config:
self._enabled = config.get("enabled") self._enabled = config.get("enabled")
self._notify = config.get("notify") self._notify = config.get("notify")
try: self._play_up_speed = float(config.get("play_up_speed")) if config.get("play_up_speed") else 0
# 总带宽 self._play_down_speed = float(config.get("play_down_speed")) if config.get("play_down_speed") else 0
self._bandwidth = int(float(config.get("bandwidth") or 0)) * 1000000 self._noplay_up_speed = float(config.get("noplay_up_speed")) if config.get("noplay_up_speed") else 0
except Exception as e: self._noplay_down_speed = float(config.get("noplay_down_speed")) if config.get("noplay_down_speed") else 0
logger.error(f"总带宽配置错误:{e}") self._downloader = config.get("downloader") or []
self._bandwidth = 0 if self._downloader:
if 'qbittorrent' in self._downloader:
self._qb = Qbittorrent()
if 'transmission' in self._downloader:
self._tr = Transmission()
# 移出现有任务 # 移出现有任务
self.stop_service() self.stop_service()
@ -56,10 +68,11 @@ class SpeedLimiter(_PluginBase):
self._scheduler = BackgroundScheduler(timezone=settings.TZ) self._scheduler = BackgroundScheduler(timezone=settings.TZ)
self._scheduler.add_job(func=self.__check_playing_sessions, self._scheduler.add_job(func=self.__check_playing_sessions,
trigger='interval', trigger='interval',
seconds=self._interval) seconds=self._interval,
name="播放限速检查")
self._scheduler.print_jobs() self._scheduler.print_jobs()
self._scheduler.start() self._scheduler.start()
logger.info("播放限速服务启动") logger.info("播放限速检查服务启动")
def get_state(self) -> bool: def get_state(self) -> bool:
return self._enabled return self._enabled
@ -72,7 +85,159 @@ class SpeedLimiter(_PluginBase):
pass pass
def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: def get_form(self) -> Tuple[List[dict], Dict[str, Any]]:
pass return [
{
'component': 'VForm',
'content': [
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VSwitch',
'props': {
'model': 'enabled',
'label': '启用插件',
}
}
]
},
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VSwitch',
'props': {
'model': 'notify',
'label': '发送通知',
}
}
]
}
]
},
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'content': [
{
'component': 'VSelect',
'props': {
'chips': True,
'multiple': True,
'model': 'sign_sites',
'label': '下载器',
'items': [
{'title': 'Qbittorrent', 'value': 'qbittorrent'},
{'title': 'Transmission', 'value': 'transmission'},
]
}
}
]
}
]
},
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VTextField',
'props': {
'model': 'play_up_speed',
'label': '播放限速(上传)',
'placeholder': 'KB/s'
}
}
]
},
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VTextField',
'props': {
'model': 'play_down_speed',
'label': '播放限速(下载)',
'placeholder': 'KB/s'
}
}
]
}
]
},
{
'component': 'VRow',
'content': [
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VTextField',
'props': {
'model': 'noplay_up_speed',
'label': '未播放限速(上传)',
'placeholder': 'KB/s'
}
}
]
},
{
'component': 'VCol',
'props': {
'cols': 12,
'md': 6
},
'content': [
{
'component': 'VTextField',
'props': {
'model': 'noplay_down_speed',
'label': '未播放限速(下载)',
'placeholder': 'KB/s'
}
}
]
}
]
}
]
}
], {
"enabled": False,
"notify": True,
"downloader": [],
"play_up_speed": 0,
"play_down_speed": 0,
"noplay_up_speed": 0,
"noplay_down_speed": 0,
}
def get_page(self) -> List[dict]: def get_page(self) -> List[dict]:
pass pass
@ -81,6 +246,13 @@ class SpeedLimiter(_PluginBase):
""" """
检查播放会话 检查播放会话
""" """
if not self._qb and not self._tr:
return
def __set_limiter(self):
"""
设置限速
"""
pass pass
def stop_service(self): def stop_service(self):