1+ # Taken from megadlbot_oss <https://github.com/eyaadh/megadlbot_oss/blob/master/mega/webserver/routes.py>
2+ # Thanks to Eyaadh <https://github.com/eyaadh>
3+
4+ import math
5+ import logging
6+ import secrets
7+ import mimetypes
8+ from ..vars import Var
9+ from aiohttp import web
10+ from ..bot import StreamBot
11+ from ..utils .custom_dl import TGCustomYield , chunk_size , offset_fix
12+
13+ routes = web .RouteTableDef ()
14+
15+
16+ @routes .get ("/" )
17+ async def root_route_handler (request ):
18+ bot_details = await StreamBot .get_me ()
19+ return web .json_response ({"status" : "running" ,
20+ "server_permission" : "Open" ,
21+ "bot_associated_w" : bot_details .username })
22+
23+
24+ @routes .get ("/{message_id}" )
25+ async def stream_handler (request ):
26+ try :
27+ message_id = int (request .match_info ['message_id' ])
28+ return await media_streamer (request , message_id )
29+ except ValueError as e :
30+ logging .error (e )
31+ raise web .HTTPNotFound
32+
33+
34+ async def media_streamer (request , message_id : int ):
35+ range_header = request .headers .get ('Range' , 0 )
36+ media_msg = await StreamBot .get_messages (Var .BIN_CHANNEL , message_id )
37+ file_properties = await TGCustomYield ().generate_file_properties (media_msg )
38+ file_size = file_properties .file_size
39+
40+ if range_header :
41+ from_bytes , until_bytes = range_header .replace ('bytes=' , '' ).split ('-' )
42+ from_bytes = int (from_bytes )
43+ until_bytes = int (until_bytes ) if until_bytes else file_size - 1
44+ else :
45+ from_bytes = request .http_range .start or 0
46+ until_bytes = request .http_range .stop or file_size - 1
47+
48+ req_length = until_bytes - from_bytes
49+
50+ new_chunk_size = await chunk_size (req_length )
51+ offset = await offset_fix (from_bytes , new_chunk_size )
52+ first_part_cut = from_bytes - offset
53+ last_part_cut = (until_bytes % new_chunk_size ) + 1
54+ part_count = math .ceil (req_length / new_chunk_size )
55+ body = TGCustomYield ().yield_file (media_msg , offset , first_part_cut , last_part_cut , part_count ,
56+ new_chunk_size )
57+
58+ file_name = file_properties .file_name if file_properties .file_name \
59+ else f"{ secrets .token_hex (2 )} .jpeg"
60+ mime_type = file_properties .mime_type if file_properties .mime_type \
61+ else f"{ mimetypes .guess_type (file_name )} "
62+
63+ return_resp = web .Response (
64+ status = 206 if range_header else 200 ,
65+ body = body ,
66+ headers = {
67+ "Content-Type" : mime_type ,
68+ "Content-Range" : f"bytes { from_bytes } -{ until_bytes } /{ file_size } " ,
69+ "Content-Disposition" : f'attachment; filename="{ file_name } "' ,
70+ "Accept-Ranges" : "bytes" ,
71+ }
72+ )
73+
74+ if return_resp .status == 200 :
75+ return_resp .headers .add ("Content-Length" , str (file_size ))
76+
77+ return return_resp
0 commit comments