Skip to content

Commit a82ba2f

Browse files
committed
fix 增加播放限速
1 parent 4933298 commit a82ba2f

20 files changed

+456
-28
lines changed

app/conf/systemconfig.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ class SystemConfig:
1616
# 自动获取Cookie的用户信息
1717
"CookieUserInfo": {},
1818
# 用户自定义CSS/JavsScript
19-
"CustomScript": {}
19+
"CustomScript": {},
20+
# 播放限速设置
21+
"SpeedLimit": {}
2022
}
2123

2224
def __init__(self):

app/downloader/client/_base.py

+7
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,10 @@ def get_downloading_progress(self):
143143
获取下载进度
144144
"""
145145
pass
146+
147+
@abstractmethod
148+
def set_speed_limit(self, **kwargs):
149+
"""
150+
设置速度限制
151+
"""
152+
pass

app/downloader/client/aria2.py

+6
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,9 @@ def get_downloading_progress(self, **kwargs):
159159
'progress': progress
160160
})
161161
return DispTorrents
162+
163+
def set_speed_limit(self, **kwargs):
164+
"""
165+
设置速度限制
166+
"""
167+
pass

app/downloader/client/client115.py

+6
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,9 @@ def get_downloading_progress(self, **kwargs):
133133
'progress': progress
134134
})
135135
return DispTorrents
136+
137+
def set_speed_limit(self, **kwargs):
138+
"""
139+
设置速度限制
140+
"""
141+
pass

app/downloader/client/pikpak.py

+6
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,9 @@ def get_downloading_progress(self, **kwargs):
145145
'noprogress': True
146146
})
147147
return DispTorrents
148+
149+
def set_speed_limit(self, **kwargs):
150+
"""
151+
设置速度限制
152+
"""
153+
pass

app/downloader/client/qbittorrent.py

+15
Original file line numberDiff line numberDiff line change
@@ -513,3 +513,18 @@ def get_downloading_progress(self, tag=None):
513513
'progress': progress
514514
})
515515
return DispTorrents
516+
517+
def set_speed_limit(self, download_limit=None, upload_limit=None):
518+
"""
519+
设置速度限制
520+
"""
521+
if not self.qbc:
522+
return
523+
try:
524+
if self.qbc.transfer.upload_limit != upload_limit:
525+
self.qbc.transfer.upload_limit = upload_limit
526+
if self.qbc.transfer.download_limit != download_limit:
527+
self.qbc.transfer.download_limit = download_limit
528+
except Exception as err:
529+
ExceptionUtils.exception_traceback(err)
530+
return False

app/downloader/client/transmission.py

+27
Original file line numberDiff line numberDiff line change
@@ -497,3 +497,30 @@ def get_downloading_progress(self, tag=None):
497497
'progress': progress
498498
})
499499
return DispTorrents
500+
501+
def set_speed_limit(self, download_limit=None, upload_limit=None):
502+
"""
503+
设置速度限制
504+
"""
505+
if not self.trc:
506+
return
507+
try:
508+
session = self.trc.get_session()
509+
download_limit_enabled = True if download_limit else False
510+
upload_limit_enabled = True if upload_limit else False
511+
if download_limit_enabled == session.speed_limit_down_enabled and \
512+
upload_limit_enabled == session.speed_limit_up_enabled and \
513+
download_limit == session.speed_limit_down and \
514+
upload_limit == session.speed_limit_up:
515+
return
516+
self.trc.set_session(
517+
speed_limit_down=download_limit if download_limit != session.speed_limit_down
518+
else session.speed_limit_down,
519+
speed_limit_up=upload_limit if upload_limit != session.speed_limit_up
520+
else session.speed_limit_up,
521+
speed_limit_down_enabled=download_limit_enabled,
522+
speed_limit_up_enabled=upload_limit_enabled
523+
)
524+
except Exception as err:
525+
ExceptionUtils.exception_traceback(err)
526+
return False

app/downloader/downloader.py

+19
Original file line numberDiff line numberDiff line change
@@ -1062,3 +1062,22 @@ def get_default_download_setting(self):
10621062
if not self._download_setting.get(default_download_setting):
10631063
default_download_setting = "-1"
10641064
return default_download_setting
1065+
1066+
def set_speed_limit(self, downloader, download_limit=None, upload_limit=None):
1067+
"""
1068+
设置速度限制
1069+
"""
1070+
if not downloader:
1071+
return []
1072+
_client = self.__get_client(downloader)
1073+
try:
1074+
download_limit = int(download_limit) if download_limit else 0
1075+
except Exception as err:
1076+
ExceptionUtils.exception_traceback(err)
1077+
download_limit = 0
1078+
try:
1079+
upload_limit = int(upload_limit) if upload_limit else 0
1080+
except Exception as err:
1081+
ExceptionUtils.exception_traceback(err)
1082+
upload_limit = 0
1083+
_client.set_speed_limit(download_limit=download_limit, upload_limit=upload_limit)

app/helper/security_helper.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ def __init__(self):
1717
self.synology_webhook_allow_ip = security.get('synology_webhook_allow_ip') or {}
1818

1919
def check_mediaserver_ip(self, ip):
20-
return self.webhook_allow_access(self.media_server_webhook_allow_ip, ip)
20+
return self.allow_access(self.media_server_webhook_allow_ip, ip)
2121

2222
def check_telegram_ip(self, ip):
23-
return self.webhook_allow_access(self.telegram_webhook_allow_ip, ip)
23+
return self.allow_access(self.telegram_webhook_allow_ip, ip)
2424

2525
def check_synology_ip(self, ip):
26-
return self.webhook_allow_access(self.synology_webhook_allow_ip, ip)
26+
return self.allow_access(self.synology_webhook_allow_ip, ip)
2727

2828
def check_slack_ip(self, ip):
29-
return self.webhook_allow_access({"ipve": "127.0.0.1"}, ip)
29+
return self.allow_access({"ipve": "127.0.0.1"}, ip)
3030

3131
@staticmethod
32-
def webhook_allow_access(allow_ips, ip):
32+
def allow_access(allow_ips, ip):
3333
"""
3434
判断IP是否合法
3535
:param allow_ips: 充许的IP范围 {"ipv4":, "ipv6":}
@@ -39,14 +39,19 @@ def webhook_allow_access(allow_ips, ip):
3939
return True
4040
try:
4141
ipaddr = ipaddress.ip_address(ip)
42-
if ipaddr.version == 4 or ipaddr.ipv4_mapped:
42+
if ipaddr.version == 4:
4343
if not allow_ips.get('ipv4'):
4444
return True
4545
allow_ipv4s = allow_ips.get('ipv4').split(",")
4646
for allow_ipv4 in allow_ipv4s:
47-
if ipaddr.version == 4 and ipaddr in ipaddress.ip_network(allow_ipv4):
47+
if ipaddr in ipaddress.ip_network(allow_ipv4):
4848
return True
49-
if ipaddr.ipv4_mapped and ipaddr.ipv4_mapped in ipaddress.ip_network(allow_ipv4):
49+
elif ipaddr.ipv4_mapped:
50+
if not allow_ips.get('ipv4'):
51+
return True
52+
allow_ipv4s = allow_ips.get('ipv4').split(",")
53+
for allow_ipv4 in allow_ipv4s:
54+
if ipaddr.ipv4_mapped in ipaddress.ip_network(allow_ipv4):
5055
return True
5156
else:
5257
if not allow_ips.get('ipv6'):

app/mediaserver/client/_base.py

+7
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,10 @@ def get_items(self, parent):
9999
:param parent: 上一级的ID
100100
"""
101101
pass
102+
103+
@abstractmethod
104+
def get_playing_sessions(self):
105+
"""
106+
获取正在播放的会话
107+
"""
108+
pass

app/mediaserver/client/emby.py

+20
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,23 @@ def get_items(self, parent):
470470
ExceptionUtils.exception_traceback(e)
471471
log.error(f"【{self.server_type}】连接Users/Items出错:" + str(e))
472472
yield {}
473+
474+
def get_playing_sessions(self):
475+
"""
476+
获取正在播放的会话
477+
"""
478+
if not self._host or not self._apikey:
479+
return []
480+
playing_sessions = []
481+
req_url = "%semby/Sessions?api_key=%s" % (self._host, self._apikey)
482+
try:
483+
res = RequestUtils().get_res(req_url)
484+
if res and res.status_code == 200:
485+
sessions = res.json()
486+
for session in sessions:
487+
if session.get("NowPlayingItem"):
488+
playing_sessions.append(session)
489+
return playing_sessions
490+
except Exception as e:
491+
ExceptionUtils.exception_traceback(e)
492+
return []

app/mediaserver/client/jellyfin.py

+6
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,9 @@ def get_items(self, parent):
416416
ExceptionUtils.exception_traceback(e)
417417
log.error(f"【{self.server_type}】连接Users/Items出错:" + str(e))
418418
yield {}
419+
420+
def get_playing_sessions(self):
421+
"""
422+
获取正在播放的会话
423+
"""
424+
pass

app/mediaserver/client/plex.py

+6
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,9 @@ def get_items(self, parent):
208208
except Exception as err:
209209
ExceptionUtils.exception_traceback(err)
210210
yield {}
211+
212+
def get_playing_sessions(self):
213+
"""
214+
获取正在播放的会话
215+
"""
216+
pass

app/mediaserver/media_server.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,18 @@ def get_mediasync_status(self):
229229

230230
def get_iteminfo(self, itemid):
231231
"""
232-
根据ItemId从媒体服务器查询项目详情
233-
:param itemid: 在Emby中的ID
234-
:return: 图片对应在TMDB中的URL
235-
"""
232+
根据ItemId从媒体服务器查询项目详情
233+
:param itemid: 在Emby中的ID
234+
:return: 图片对应在TMDB中的URL
235+
"""
236236
if not self.server:
237237
return None
238238
return self.server.get_iteminfo(itemid)
239+
240+
def get_playing_sessions(self):
241+
"""
242+
获取正在播放的会话
243+
"""
244+
if not self.server:
245+
return None
246+
return self.server.get_playing_sessions()

0 commit comments

Comments
 (0)