diff --git a/telethon/client/downloads.py b/telethon/client/downloads.py index ad2611b3..e2f1a382 100644 --- a/telethon/client/downloads.py +++ b/telethon/client/downloads.py @@ -200,10 +200,13 @@ class DownloadMethods(UserMethods): else: f = file - # The used sender will change if ``FileMigrateError`` occurs - sender = self._sender - exported = False - input_location = utils.get_input_location(input_location) + dc_id, input_location = utils.get_input_location(input_location) + exported = dc_id and self.session.dc_id != dc_id + if exported: + sender = await self._borrow_exported_sender(dc_id) + else: + # The used sender will also change if ``FileMigrateError`` occurs + sender = self._sender __log__.info('Downloading file in chunks of %d bytes', part_size) try: diff --git a/telethon/sessions/memory.py b/telethon/sessions/memory.py index acd09a77..a6c70b97 100644 --- a/telethon/sessions/memory.py +++ b/telethon/sessions/memory.py @@ -42,6 +42,10 @@ class MemorySession(Session): self._server_address = server_address self._port = port + @property + def dc_id(self): + return self._dc_id + @property def server_address(self): return self._server_address diff --git a/telethon/utils.py b/telethon/utils.py index e5bdb614..b5affe9b 100644 --- a/telethon/utils.py +++ b/telethon/utils.py @@ -537,10 +537,15 @@ def sanitize_parse_mode(mode): def get_input_location(location): - """Similar to :meth:`get_input_peer`, but for input messages.""" + """ + Similar to :meth:`get_input_peer`, but for input messages. + + Note that this returns a tuple ``(dc_id, location)``, the + ``dc_id`` being present if known. + """ try: if location.SUBCLASS_OF_ID == 0x1523d462: - return location # crc32(b'InputFileLocation'): + return None, location # crc32(b'InputFileLocation'): except AttributeError: _raise_cast_fail(location, 'InputFileLocation') @@ -553,8 +558,8 @@ def get_input_location(location): location = location.photo if isinstance(location, Document): - return InputDocumentFileLocation( - location.id, location.access_hash, location.version) + return (location.dc_id, InputDocumentFileLocation( + location.id, location.access_hash, location.version)) elif isinstance(location, Photo): try: location = next(x for x in reversed(location.sizes) @@ -563,8 +568,8 @@ def get_input_location(location): pass if isinstance(location, (FileLocation, FileLocationUnavailable)): - return InputFileLocation( - location.volume_id, location.local_id, location.secret) + return (getattr(location, 'dc_id', None), InputFileLocation( + location.volume_id, location.local_id, location.secret)) _raise_cast_fail(location, 'InputFileLocation')