1313from WebStreamer import StartTime , __version__ , bot_info
1414from WebStreamer .bot .clients import multi_clients , work_loads
1515from WebStreamer .utils .time_format import get_readable_time
16+ from WebStreamer .utils .file_id import get_unique_id
1617from WebStreamer .utils .custom_dl import TGCustomYield , chunk_size , offset_fix
1718
1819
1920routes = web .RouteTableDef ()
2021
22+
2123@routes .get ("/" , allow_head = True )
2224async def root_route_handler (request ):
23- return web .json_response ({"server_status" : "running" ,
24- "uptime" : get_readable_time (time .time () - StartTime ),
25- "telegram_bot" : '@' + bot_info .username ,
26- "connected_bots" : len (multi_clients ),
27- "loads" : work_loads ,
28- "version" : __version__ })
25+ return web .json_response (
26+ {
27+ "server_status" : "running" ,
28+ "uptime" : get_readable_time (time .time () - StartTime ),
29+ "telegram_bot" : "@" + bot_info .username ,
30+ "connected_bots" : len (multi_clients ),
31+ "loads" : work_loads ,
32+ "version" : __version__ ,
33+ }
34+ )
2935
3036
31- @routes .get (r"/{message_id:\S+}" )
37+ @routes .get (r"/{message_id:\S+}-{secure_hash:\w+} " )
3238async def stream_handler (request : web .Request ):
3339 try :
34- message_id = request .match_info ['message_id' ]
35- message_id = int (re .search (r'(\d+)(?:\/\S+)?' , message_id ).group (1 ))
36- return await media_streamer (request , message_id )
40+ message_id = request .match_info ["message_id" ]
41+ message_id = int (re .search (r"(\d+)(?:\/\S+)?" , message_id ).group (1 ))
42+ secure_hash = request .match_info ["secure_hash" ]
43+ return await media_streamer (request , message_id , secure_hash )
3744 except ValueError :
3845 raise web .HTTPNotFound
3946 except AttributeError :
4047 pass
4148
4249
43-
44-
45-
46- async def media_streamer (request : web .Request , message_id : int ):
47- range_header = request .headers .get ('Range' , 0 )
50+ async def media_streamer (request : web .Request , message_id : int , secure_hash : str ):
51+ range_header = request .headers .get ("Range" , 0 )
4852 _index = min (work_loads , key = work_loads .get )
4953 faster_client = multi_clients [_index ]
5054 work_loads [_index ] += 1
@@ -53,11 +57,14 @@ async def media_streamer(request: web.Request, message_id: int):
5357
5458 tg_connect = TGCustomYield (faster_client )
5559 media_msg = await faster_client .get_messages (Var .BIN_CHANNEL , message_id )
60+ if get_unique_id (media_msg ) != secure_hash :
61+ work_loads [_index ] -= 1
62+ raise web .HTTPForbidden
5663 file_properties = await tg_connect .generate_file_properties (media_msg )
5764 file_size = file_properties .file_size
5865
5966 if range_header :
60- from_bytes , until_bytes = range_header .replace (' bytes=' , '' ).split ('-' )
67+ from_bytes , until_bytes = range_header .replace (" bytes=" , "" ).split ("-" )
6168 from_bytes = int (from_bytes )
6269 until_bytes = int (until_bytes ) if until_bytes else file_size - 1
6370 else :
@@ -70,8 +77,9 @@ async def media_streamer(request: web.Request, message_id: int):
7077 first_part_cut = from_bytes - offset
7178 last_part_cut = (until_bytes % new_chunk_size ) + 1
7279 part_count = math .ceil (req_length / new_chunk_size )
73- body = tg_connect .yield_file (media_msg , offset , first_part_cut , last_part_cut , part_count ,
74- new_chunk_size )
80+ body = tg_connect .yield_file (
81+ media_msg , offset , first_part_cut , last_part_cut , part_count , new_chunk_size
82+ )
7583
7684 mime_type = file_properties .mime_type
7785 file_name = file_properties .file_name
@@ -87,7 +95,7 @@ async def media_streamer(request: web.Request, message_id: int):
8795 mime_type = mimetypes .guess_type (file_properties .file_name )
8896 else :
8997 mime_type = "application/octet-stream"
90- file_name = f"{ secrets .token_hex (2 )} .unknown"
98+ file_name = f"{ secrets .token_hex (2 )} .unknown"
9199 if "video/" in mime_type or "audio/" in mime_type :
92100 dispo = "inline"
93101 return_resp = web .Response (
@@ -98,7 +106,7 @@ async def media_streamer(request: web.Request, message_id: int):
98106 "Content-Range" : f"bytes { from_bytes } -{ until_bytes } /{ file_size } " ,
99107 "Content-Disposition" : f'{ dispo } ; filename="{ file_name } "' ,
100108 "Accept-Ranges" : "bytes" ,
101- }
109+ },
102110 )
103111
104112 if return_resp .status == 200 :
0 commit comments