async def download_media( client: pyrogram.client.Client, message: pyrogram.types.Message, media_types: List[str], file_formats: dict, ): """ Download media from Telegram. Parameters ---------- client: pyrogram.client.Client Client to interact with Telegram APIs. message: pyrogram.types.Message Message object retrived from telegram. media_types: list List of strings of media types to be downloaded. Ex : `["audio", "photo"]` Supported formats: * audio * document * photo * video * voice file_formats: dict Dictionary containing the list of file_formats to be downloaded for `audio`, `document` & `video` media types. Returns ------- int Current message id. """ if message.media: for _type in media_types: _media = getattr(message, _type, None) if _media: file_ref, file_name, file_format = await _get_media_meta( _media, _type) if _can_download(_type, file_formats, file_format): if _is_exist(file_name): file_name = get_next_name(file_name) download_path = await client.download_media( message, file_ref=file_ref, file_name=file_name) download_path = manage_duplicate_file(download_path) else: download_path = await client.download_media( message, file_ref=file_ref, file_name=file_name) logger.info("Media downloaded - %s", download_path) return message.message_id
async def download_media( client: pyrogram.client.Client, message: pyrogram.types.Message, media_types: List[str], file_formats: dict, ): """ Download media from Telegram. Each of the files to download are retried 3 times with a delay of 5 seconds each. Parameters ---------- client: pyrogram.client.Client Client to interact with Telegram APIs. message: pyrogram.types.Message Message object retrived from telegram. media_types: list List of strings of media types to be downloaded. Ex : `["audio", "photo"]` Supported formats: * audio * document * photo * video * voice file_formats: dict Dictionary containing the list of file_formats to be downloaded for `audio`, `document` & `video` media types. Returns ------- int Current message id. """ for retry in range(3): try: if message.media is None: return message.message_id for _type in media_types: _media = getattr(message, _type, None) if _media is None: continue file_ref, file_name, file_format = await _get_media_meta( _media, _type) if _can_download(_type, file_formats, file_format): if _is_exist(file_name): file_name = get_next_name(file_name) download_path = await client.download_media( message, file_ref=file_ref, file_name=file_name) download_path = manage_duplicate_file(download_path) else: download_path = await client.download_media( message, file_ref=file_ref, file_name=file_name) if download_path: logger.info("Media downloaded - %s", download_path) break except pyrogram.errors.exceptions.bad_request_400.BadRequest: logger.warning( "Message[%d]: file reference expired, refetching...", message.message_id, ) message = await client.get_messages( chat_id=message.chat.id, message_ids=message.message_id, ) if retry == 2: # pylint: disable = C0301 logger.error( "Message[%d]: file reference expired for 3 retries, download skipped.", message.message_id, ) FAILED_IDS.append(message.message_id) except TypeError: # pylint: disable = C0301 logger.warning( "Timeout Error occured when downloading Message[%d], retrying after 5 seconds", message.message_id, ) await asyncio.sleep(5) if retry == 2: logger.error( "Message[%d]: Timing out after 3 reties, download skipped.", message.message_id, ) FAILED_IDS.append(message.message_id) except Exception as e: # pylint: disable = C0301 logger.error( "Message[%d]: could not be downloaded due to following exception:\n[%s].", message.message_id, e, exc_info=True, ) FAILED_IDS.append(message.message_id) break return message.message_id
def test_manage_duplicate_file(self): result = manage_duplicate_file(self.test_file_copy_2) self.assertEqual(result, self.test_file_copy_1) result1 = manage_duplicate_file(self.test_file_copy_1) self.assertEqual(result1, self.test_file_copy_1)