steve0x2a / dlimiter Goto Github PK
View Code? Open in Web Editor NEW利用Webhooks,平衡下载器PT上传和外网视频播放的限速器
利用Webhooks,平衡下载器PT上传和外网视频播放的限速器
错误位置:
https://github.com/Steve0x2a/DLimiter/blob/main/utils/limiter.py#L69
">=" 应改为 ">"
eg:
若内网客户端播放,则返回值count=0,依然会触发 downloader.set_speed_limit 导致限速。
config配置:
[limiter]
# 部分外网访问是使用端口转发来实现的,需要排除特定的ip
exclude_ip = ["192.168.0.165","10.8.0.0/24"]
使用两个ip进行测试
IP_1: 192.168.0.160
IP_2: 192.168.0.165(exclude_ip)
IP_1: 192.168.0.160 日志如下
https://github.com/Steve0x2a/DLimiter/blob/main/utils/player/jellyfin.py#L34 (IF语句未进入,会话数:0,不应该限速)
2023-03-05 17:50:46 - DLimiter - INFO - 35 当前Jellyfin外网播放会话数:0
2023-03-05 17:50:46 - DLimiter - INFO - 73 监测到jellyfin外网()播放,触发限速,下载器 media 限速为 3000K/s 下载,600K/s 上传
IP_2: 192.168.0.165 日志如下
2023-03-05 17:56:57 - DLimiter - INFO - 34 监测到Jellinfin外网用户wjy(192.168.0.165)正在播放
2023-03-05 17:56:57 - DLimiter - INFO - 35 当前Jellyfin外网播放会话数:1
2023-03-05 17:56:58 - DLimiter - INFO - 73 监测到jellyfin外网()播放,触发限速,下载器 media 限速为 3000K/s 下载,600K/s 上传
2023-02-07 13:59:51 - DLimiter - ERROR - 20 解析Plex webhooks错误:'Session',context:{'payload': ['{"event":"media.resume","user":true,"owner":true,"Account":{"id":185190476,"thumb":"https://plex.tv/users/65e6b75c55973fa7/avatar?c=1674766970","title":"samir2013dzh"},"Server":{"title":"AlexStation","uuid":"582eb5245bc0916d672bd5b0c9739f3bb89a25e0"},"Player":{"local":false,"publicAddress":"10.7.7.7","title":"BigAlex","uuid":"u4nb8m1l0pag9jzz2h83ki1r"},"Metadata":{"librarySectionType":"show","ratingKey":"3060","key":"/library/metadata/3060","parentRatingKey":"3057","grandparentRatingKey":"3056","guid":"plex://episode/633eed8f5ca1ba323833a737","parentGuid":"plex://season/60300df481821b002c1b07ab","grandparentGuid":"plex://show/60300df381821b002c1b07a8","type":"episode","title":"火速增员","grandparentKey":"/library/metadata/3056","parentKey":"/library/metadata/3057","librarySectionTitle":"动漫","librarySectionID":3,"librarySectionKey":"/library/sections/3","grandparentTitle":"孤独摇滚!","parentTitle":"Season 1","originalTitle":"Bocchi the Rock!","contentRating":"TV-14","summary":"预想中的“经过打工沟通能力急速成长”并没有实现,一里依然无法和同学自然地交谈,这一天也是在学校独自吃午饭。想起当时虹夏为了找新成员向自己搭话的样子,她决定向听说能弹吉他又受欢迎的阳光女生喜多伸出橄榄枝,然而......","index":3,"parentIndex":1,"audienceRating":8.0,"viewOffset":367000,"lastViewedAt":1675749337,"year":2022,"thumb":"/library/metadata/3060/thumb/1670273392","art":"/library/metadata/3056/art/1672087301","parentThumb":"/library/metadata/3057/thumb/1669185450","grandparentThumb":"/library/metadata/3056/thumb/1672087301","grandparentArt":"/library/metadata/3056/art/1672087301","duration":1440000,"originallyAvailableAt":"2022-10-23","addedAt":1669038936,"updatedAt":1670273392,"audienceRatingImage":"themoviedb://image.rating","Director":[{"id":11007,"filter":"director=11007","tag":"Yuusuke Yamamoto"}],"Writer":[{"id":10997,"filter":"writer=10997","tag":"Erika Yoshida"}],"Producer":[{"id":11008,"filter":"producer=11008","tag":"Sho Someno"}],"Guid":[{"id":"imdb://tt22797994"},{"id":"tmdb://3989994"},{"id":"tvdb://9390696"}],"Rating":[{"image":"themoviedb://image.rating","value":8.0,"type":"audience"}],"Role":[{"id":7246,"filter":"actor=7246","tag":"Maaya Uchida","tagKey":"5d776a4296b655001fde8a47","role":"Seika Ijichi (voice)","thumb":"https://metadata-static.plex.tv/e/people/ecc9a4fda200da37b6dea6371b21416e.jpg"},{"id":8200,"filter":"actor=8200","tag":"Misaki Watada","tagKey":"5d9c07fa02391c001f57dad6","role":"Futari Gotoh (voice)","thumb":"https://metadata-static.plex.tv/people/5d9c07fa02391c001f57dad6.jpg"},{"id":10982,"filter":"actor=10982","tag":"Hinaki Yano","tagKey":"5f5d60d98edf4c0042ac05a9","role":"Kita\'s Friend (voice)","thumb":"https://metadata-static.plex.tv/a/people/acfa85d0b910ced52bf0c937da61cf74.jpg"},{"id":10983,"filter":"actor=10983","tag":"Yume Miyamoto","tagKey":"6325c9fd31a6256f7eca208e","role":"Kita\'s Friend (voice)","thumb":"https://metadata-static.plex.tv/6/people/6d3f12f341ab7aed6bab734745e20076.jpg"},{"id":7502,"filter":"actor=7502","tag":"Natsumi Kawaida","tagKey":"5f406af402101b0040fde974","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/3/people/3508de5926c805f5bb0974b6edc7897a.jpg"},{"id":10702,"filter":"actor=10702","tag":"Megumi Yamaguchi","tagKey":"5d9f35236fc551001ef808e6","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/7/people/757cd17bb68129e87f024b280f585828.jpg"},{"id":7496,"filter":"actor=7496","tag":"Yohei Azakami","tagKey":"5f4030f703883a0040b50b88","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/c/people/c7b91df98b2cf039e9ccb27f25f69a18.jpg"},{"id":7777,"filter":"actor=7777","tag":"Kotori Koiwai","tagKey":"5d776d4aad5437001f7d2451","role":"PA-san / Jimihen (voice)","thumb":"https://metadata-static.plex.tv/5/people/5d5773dd3d50b778e23a12bb6162e9c5.jpg"}]}}']} 2023-02-07 13:59:51 - DLimiter - ERROR - 104 Event not successful 2023-02-07 14:00:26 - DLimiter - ERROR - 20 解析Plex webhooks错误:'Session',context:{'payload': ['{"event":"media.pause","user":true,"owner":true,"Account":{"id":185190476,"thumb":"https://plex.tv/users/65e6b75c55973fa7/avatar?c=1674766970","title":"samir2013dzh"},"Server":{"title":"AlexStation","uuid":"582eb5245bc0916d672bd5b0c9739f3bb89a25e0"},"Player":{"local":false,"publicAddress":"10.7.7.7","title":"BigAlex","uuid":"u4nb8m1l0pag9jzz2h83ki1r"},"Metadata":{"librarySectionType":"show","ratingKey":"3060","key":"/library/metadata/3060","parentRatingKey":"3057","grandparentRatingKey":"3056","guid":"plex://episode/633eed8f5ca1ba323833a737","parentGuid":"plex://season/60300df481821b002c1b07ab","grandparentGuid":"plex://show/60300df381821b002c1b07a8","type":"episode","title":"火速增员","grandparentKey":"/library/metadata/3056","parentKey":"/library/metadata/3057","librarySectionTitle":"动漫","librarySectionID":3,"librarySectionKey":"/library/sections/3","grandparentTitle":"孤独摇滚!","parentTitle":"Season 1","originalTitle":"Bocchi the Rock!","contentRating":"TV-14","summary":"预想中的“经过打工沟通能力急速成长”并没有实现,一里依然无法和同学自然地交谈,这一天也是在学校独自吃午饭。想起当时虹夏为了找新成员向自己搭话的样子,她决定向听说能弹吉他又受欢迎的阳光女生喜多伸出橄榄枝,然而......","index":3,"parentIndex":1,"audienceRating":8.0,"viewOffset":402000,"lastViewedAt":1675749626,"year":2022,"thumb":"/library/metadata/3060/thumb/1670273392","art":"/library/metadata/3056/art/1672087301","parentThumb":"/library/metadata/3057/thumb/1669185450","grandparentThumb":"/library/metadata/3056/thumb/1672087301","grandparentArt":"/library/metadata/3056/art/1672087301","duration":1440000,"originallyAvailableAt":"2022-10-23","addedAt":1669038936,"updatedAt":1670273392,"audienceRatingImage":"themoviedb://image.rating","Director":[{"id":11007,"filter":"director=11007","tag":"Yuusuke Yamamoto"}],"Writer":[{"id":10997,"filter":"writer=10997","tag":"Erika Yoshida"}],"Producer":[{"id":11008,"filter":"producer=11008","tag":"Sho Someno"}],"Guid":[{"id":"imdb://tt22797994"},{"id":"tmdb://3989994"},{"id":"tvdb://9390696"}],"Rating":[{"image":"themoviedb://image.rating","value":8.0,"type":"audience"}],"Role":[{"id":7246,"filter":"actor=7246","tag":"Maaya Uchida","tagKey":"5d776a4296b655001fde8a47","role":"Seika Ijichi (voice)","thumb":"https://metadata-static.plex.tv/e/people/ecc9a4fda200da37b6dea6371b21416e.jpg"},{"id":8200,"filter":"actor=8200","tag":"Misaki Watada","tagKey":"5d9c07fa02391c001f57dad6","role":"Futari Gotoh (voice)","thumb":"https://metadata-static.plex.tv/people/5d9c07fa02391c001f57dad6.jpg"},{"id":10982,"filter":"actor=10982","tag":"Hinaki Yano","tagKey":"5f5d60d98edf4c0042ac05a9","role":"Kita\'s Friend (voice)","thumb":"https://metadata-static.plex.tv/a/people/acfa85d0b910ced52bf0c937da61cf74.jpg"},{"id":10983,"filter":"actor=10983","tag":"Yume Miyamoto","tagKey":"6325c9fd31a6256f7eca208e","role":"Kita\'s Friend (voice)","thumb":"https://metadata-static.plex.tv/6/people/6d3f12f341ab7aed6bab734745e20076.jpg"},{"id":7502,"filter":"actor=7502","tag":"Natsumi Kawaida","tagKey":"5f406af402101b0040fde974","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/3/people/3508de5926c805f5bb0974b6edc7897a.jpg"},{"id":10702,"filter":"actor=10702","tag":"Megumi Yamaguchi","tagKey":"5d9f35236fc551001ef808e6","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/7/people/757cd17bb68129e87f024b280f585828.jpg"},{"id":7496,"filter":"actor=7496","tag":"Yohei Azakami","tagKey":"5f4030f703883a0040b50b88","role":"Student (voice)","thumb":"https://metadata-static.plex.tv/c/people/c7b91df98b2cf039e9ccb27f25f69a18.jpg"},{"id":7777,"filter":"actor=7777","tag":"Kotori Koiwai","tagKey":"5d776d4aad5437001f7d2451","role":"PA-san / Jimihen (voice)","thumb":"https://metadata-static.plex.tv/5/people/5d5773dd3d50b778e23a12bb6162e9c5.jpg"}]}}']} 2023-02-07 14:00:26 - DLimiter - ERROR - 104 Event not successful
是直接解压文件到群晖本地,然后ssh 运行那个代码就可以了吗?
main - ERROR - 17 Emby 解析出错, error: local variable 'r' referenced before assignment
nt限速插件始终不起作用,MP安装起来也比较麻烦,好在找到了这个docker,感谢!不过目前遇到了不能辨别内网ip的情况。部署情况:路由器安装了lucky做反向代理,这样外网播放地址是https://emby.xxx.com:88。群辉ip是192.168.50.4,安装docker之后,下载器和emby都能正常添加,exclude_ip这里描述得比较模糊,我添加的是exclude_ip = ["192.168.50.1","192.168.50.0/24"]。目的是为了规避整个内网网段。
但是看日志之后,发现它把内网的电视192.168.50.20也视为外网,甚至直接把192.168.50.20添加到exclude_ip也不起作用
File "/usr/local/lib/python3.10/http/client.py", line 1282, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/local/lib/python3.10/http/client.py", line 1328, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.10/http/client.py", line 1277, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.10/http/client.py", line 1037, in _send_output
self.send(msg)
File "/usr/local/lib/python3.10/http/client.py", line 975, in send
self.connect()
File "/usr/local/lib/python3.10/site-packages/urllib3/connection.py", line 205, in connect
conn = self._new_conn()
File "/usr/local/lib/python3.10/site-packages/urllib3/connection.py", line 186, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x14b85e1b6830>: Failed to establish a new connection: [Errno 113] Host is unreachable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/requests/adapters.py", line 439, in send
resp = conn.urlopen(
File "/usr/local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen
retries = retries.increment(
File "/usr/local/lib/python3.10/site-packages/urllib3/util/retry.py", line 592, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.50.105', port=9091): Max retries exceeded with url: /transmission/rpc (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x14b85e1b6830>: Failed to establish a new connection: [Errno 113] Host is unreachable'))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/transmission_rpc/client.py", line 166, in _http_query
r = self._http_session.post(
File "/usr/local/lib/python3.10/site-packages/requests/sessions.py", line 590, in post
return self.request('POST', url, data=data, json=json, **kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/sessions.py", line 542, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/sessions.py", line 655, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python3.10/site-packages/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.50.105', port=9091): Max retries exceeded with url: /transmission/rpc (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x14b85e1b6830>: Failed to establish a new connection: [Errno 113] Host is unreachable'))
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/usr/local/bin/hypercorn", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.10/site-packages/hypercorn/__main__.py", line 287, in main
run(config)
File "/usr/local/lib/python3.10/site-packages/hypercorn/run.py", line 41, in run
load_application(config.application_path, config.wsgi_max_body_size)
File "/usr/local/lib/python3.10/site-packages/hypercorn/utils.py", line 115, in load_application
module = import_module(import_name)
File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/app/main.py", line 2, in <module>
from routes import bp_player
File "/app/routes/__init__.py", line 2, in <module>
from routes.emby import bp_emby
File "/app/routes/emby.py", line 3, in <module>
from utils.limiter import emby_apply_limit
File "/app/utils/limiter.py", line 5, in <module>
from utils.player.plex import parse_plex_webhooks, get_plex_playing_session_count
File "/app/utils/player/plex.py", line 5, in <module>
from client.player.plex import plex_client
File "/app/client/player/plex/__init__.py", line 5, in <module>
config = Config()
File "/app/conf/__init__.py", line 20, in _singleconfig
config = cls(*args, **kwargs)
File "/app/conf/__init__.py", line 31, in __init__
self.parse_downloaders()
File "/app/conf/__init__.py", line 52, in parse_downloaders
downloader = Transmission(name=dl_name,
File "/app/client/downloader/transmission.py", line 24, in __init__
self.client = transmission_rpc.Client(host=host,
File "/usr/local/lib/python3.10/site-packages/transmission_rpc/client.py", line 108, in __init__
self.get_session()
File "/usr/local/lib/python3.10/site-packages/transmission_rpc/client.py", line 778, in get_session
self._request(RpcMethod.SessionGet, timeout=timeout)
File "/usr/local/lib/python3.10/site-packages/transmission_rpc/client.py", line 213, in _request
http_data = self._http_query(query, timeout)
File "/usr/local/lib/python3.10/site-packages/transmission_rpc/client.py", line 175, in _http_query
raise TransmissionConnectError(f"can't connect to transmission daemon: {str(e)}") from e
transmission_rpc.error.TransmissionConnectError: can't connect to transmission daemon: HTTPConnectionPool(host='192.168.50.105', port=9091): Max retries exceeded with url: /transmission/rpc (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x14b85e1b6830>: Failed to establish a new connection: [Errno 113] Host is unreachable'))
上面是程序日志里面的报错
大佬,能做个判定么,根据emby播放数量多少,分别限速多少。
比如播放一个 限速10m 播放俩个 限速8m 播放三个 限速5m 等等
[limiter]
exclude_ip = ["192.168.1.1","10.144.1.0/24"]
配置文件已排除192.168.1.1
目前emby可以正常识别,plex 识别位本地地址。
希望不要以local 字段来判断是否,是本地地址,不知道以IP来判断能不能实现
现在plex 日志 是直接跳过
DLimiter - INFO - 111 本地播放事件,跳过
例如A开始播放限速,但B结束了播放就不限速了,此时A还没有停止播放
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.