Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion app/telegram.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)

58 changes: 51 additions & 7 deletions app/views/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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