LonamiWebs / Telethon

Pure Python 3 MTProto API Telegram client library, for bots too!
https://docs.telethon.dev
MIT License
9.56k stars 1.37k forks source link

telethon.errors.rpcerrorlist.LimitInvalidError while iter_download #4390

Open lcipria opened 2 months ago

lcipria commented 2 months ago

Code that causes the issue

client.iter_download(file = message, limit = 1, offset = 983040, request_size = 131072)

Expected behavior

iterate for 1 chunk containing the 131072 bytes after the first 983040 from the file in the message

Actual behavior

telethon.errors.rpcerrorlist.LimitInvalidError: An invalid limit was provided.

Traceback

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
  File "/home/luciano/.local/lib/python3.10/site-packages/telethon/requestiter.py", line 87, in __next__
    return self.client.loop.run_until_complete(self.__anext__())
  File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
    return future.result()
  File "/home/luciano/.local/lib/python3.10/site-packages/telethon/requestiter.py", line 74, in __anext__
    if await self._load_next_chunk():
  File "/home/luciano/.local/lib/python3.10/site-packages/telethon/client/downloads.py", line 66, in _load_next_chunk
    cur = await self._request()
  File "/home/luciano/.local/lib/python3.10/site-packages/telethon/client/downloads.py", line 76, in _request
    result = await self.client._call(self._sender, self.request)
  File "/home/luciano/.local/lib/python3.10/site-packages/telethon/client/users.py", line 87, in _call
    result = await future
telethon.errors.rpcerrorlist.LimitInvalidError: An invalid limit was provided. See https://core.telegram.org/api/files#downloading-files (caused by GetFileRequest)

Telethon version

1.36.0

Python version

3.10.12

Operating system (including distribution name and version)

Ubuntu 22.04.4 LTS

Other details

as documentation:

P.S. usingoffset = 1048576 it works

client.iter_download(file = message, limit = 1, offset = 1048576, request_size = 131072)

Checklist

Lonami commented 2 months ago

Most RPC errors come directly from Telegram, and this one is no exception. So I don't think the library will be able to "fix" this.

I don't have plans to look into this any time soon, but it sounds like you've already dug into the code a bit, so you're welcome to experiment calling https://tl.telethon.dev/methods/upload/get_file.html directly and see if it can be made work.

NotStatilko commented 2 months ago

See this https://github.com/LonamiWebs/Telethon/issues/3199

Requirements are slightly different for offset than ones that stated. You will need to use something like my example function from this Issue (pad_request_size) and then truncate result to your desired offset.

lcipria commented 2 months ago

to be honest i wrapped the method like this:

    def __iter_download(self, file, offset, limit, request_size):
        n = 0
        for chunk in self.client.iter_download(file = file, offset = offset, request_size = request_size):
            yield chunk
            if (n := n+1) >= limit:
                break

and it works for me...

I guess there's some dark magic involving _load_next_chunk during _request?

P.S. by not manually set "limit", in my case, it will be automatically be set to 37 and the call will be executed.