TelegramIndex-Fork/app/telegram.py

51 lines
1.9 KiB
Python
Raw Normal View History

2020-08-10 09:27:52 +02:00
import math
import logging
import asyncio
2020-09-01 09:29:32 +02:00
from telethon import TelegramClient, utils
2020-08-10 09:27:52 +02:00
from telethon.sessions import StringSession
class Client(TelegramClient):
2020-08-10 09:27:52 +02:00
def __init__(self, session_string, *args, **kwargs):
super().__init__(StringSession(session_string), *args, **kwargs)
self.log = logging.getLogger(__name__)
2020-12-12 15:16:44 +01:00
2020-08-10 09:27:52 +02:00
async def download(self, file, file_size, offset, limit):
2021-06-14 17:53:33 +02:00
part_size = utils.get_appropriated_part_size(file_size) * 1024
2020-08-10 09:27:52 +02:00
first_part_cut = offset % part_size
first_part = math.floor(offset / part_size)
last_part_cut = part_size - (limit % part_size)
last_part = math.ceil(limit / part_size)
part_count = math.ceil(file_size / part_size)
part = first_part
2021-06-14 17:53:33 +02:00
self.log.debug(
f"""Request Details
part_size(bytes) = {part_size},
first_part = {first_part}, cut = {first_part_cut}(length={part_size-first_part_cut}),
last_part = {last_part}, cut = {last_part_cut}(length={last_part_cut}),
parts_count = {part_count}
"""
)
2020-08-10 09:27:52 +02:00
try:
async for chunk in self.iter_download(
file, offset=first_part * part_size, request_size=part_size
):
2021-06-14 17:53:33 +02:00
self.log.debug(f"Part {part}/{last_part} (total {part_count}) served!")
2020-08-10 09:27:52 +02:00
if part == first_part:
yield chunk[first_part_cut:]
2021-06-14 17:53:33 +02:00
elif part == last_part:
2020-08-10 09:27:52 +02:00
yield chunk[:last_part_cut]
2021-06-14 17:53:33 +02:00
break
2020-08-10 09:27:52 +02:00
else:
yield chunk
2021-06-14 17:53:33 +02:00
2020-08-10 09:27:52 +02:00
part += 1
2021-06-14 17:53:33 +02:00
self.log.debug(f"serving finished")
2020-08-10 09:27:52 +02:00
except (GeneratorExit, StopAsyncIteration, asyncio.CancelledError):
2020-08-11 08:29:09 +02:00
self.log.debug("file serve interrupted")
2020-08-10 09:27:52 +02:00
raise
except Exception:
2020-08-11 08:29:09 +02:00
self.log.debug("file serve errored", exc_info=True)