diff --git a/app/telegram.py b/app/telegram.py index 083ede9..f0b93af 100644 --- a/app/telegram.py +++ b/app/telegram.py @@ -12,7 +12,9 @@ def __init__(self, session_string, *args, **kwargs): self.log = logging.getLogger(__name__) async def download(self, file, file_size, offset, limit): - part_size = utils.get_appropriated_part_size(file_size) * 1024 + # part_size_kb = utils.get_appropriated_part_size(file_size) + # part_size = int(part_size_kb * 1024) + part_size = 512*1024 first_part_cut = offset % part_size first_part = math.floor(offset / part_size) last_part_cut = part_size - (limit % part_size) @@ -48,3 +50,4 @@ async def download(self, file, file_size, offset, limit): raise except Exception: self.log.debug("file serve errored", exc_info=True) + diff --git a/app/views/download.py b/app/views/download.py index 33180d0..916f2f6 100644 --- a/app/views/download.py +++ b/app/views/download.py @@ -42,12 +42,28 @@ async def handle_request(self, req, head=False): media = message.media size = message.file.size + file_size = size file_name = get_file_name(message, quote_name=False) mime_type = message.file.mime_type try: - offset = req.http_range.start or 0 - limit = req.http_range.stop or size + request = req + range_header = request.headers.get('Range', 0) + if range_header: + range_data = range_header.replace('bytes=', '').split('-') + from_bytes = int(range_data[0]) + until_bytes = int(range_data[1]) if range_data[1] else file_size - 1 + else: + from_bytes = request.http_range.start or 0 + until_bytes = request.http_range.stop or file_size - 1 + + req_length = until_bytes - from_bytes + + + # offset = req.http_range.start or 0 + # limit = req.http_range.stop or size + offset = from_bytes or 0 + limit = until_bytes or size if (limit > size) or (offset < 0) or (limit < offset): raise ValueError("range not in acceptable format") except ValueError: @@ -65,12 +81,40 @@ async def handle_request(self, req, head=False): else: body = None - headers = { + # headers={ + # "Connection":"keep-alive", + # "Content-Type": mime_type, + # "Content-Range": f"bytes {offset}-{limit}/{size}", + # "Accept-Ranges": "bytes", + # "Content-Disposition": f'attachment; filename="{file_name}"', + # "Transfer-Encoding":"chunked", + # #"Content-Length": str(limit - offset) + + # } + + # r= web.Response( + # status=206 if req.http_range.start else 200, + # body=body, + # headers=headers + # ) + + # r.enable_chunked_encoding() + # return r + + return_resp = web.Response( + status=206 if req.http_range.start else 200, + body=body, + headers={ + "Access-Control-Allow-Origin": "*", "Content-Type": mime_type, "Content-Range": f"bytes {offset}-{limit}/{size}", - "Content-Length": str(limit - offset), - "Accept-Ranges": "bytes", "Content-Disposition": f'attachment; filename="{file_name}"', - } + "Accept-Ranges": "bytes", + # "Content-Length": f"{limit-offset}" + } + ) + + if return_resp.status == 200: + return_resp.headers.add("Content-Length", str(size)) - return web.Response(status=206 if offset else 200, body=body, headers=headers) + return return_resp