python-telegram-bot / python-telegram-bot

We have made you a wrapper you can't refuse
https://python-telegram-bot.org
GNU General Public License v3.0
26.3k stars 5.34k forks source link

[BUG] Cannot Download a File if it doesnt have a `file_path` or if `custom_path` is not provided to `download()` #1590

Closed GabrielSimonetto closed 4 years ago

GabrielSimonetto commented 5 years ago

Steps to reproduce

  1. Create an operation with the above mentioned aspects

Ex:

def run_bot(token):
    def make_pasta(update, context):
        msg = update.message

        if msg.reply_to_message is None:
            msg.reply_text(responses.NOT_A_REPLY)
            return
        if msg.reply_to_message.document is None:
            msg.reply_text(responses.NOT_A_DOC)
            return
        telegram_file = File(msg.reply_to_message.document.file_id)
        telegram_file.download() 

    updater = Updater(token, use_context=True)
    dp = updater.dispatcher

    dp.add_handler(CommandHandler('hello', hello))
    dp.add_handler(CommandHandler('make_pasta', make_pasta))

    print('Log: Seu bot iniciou! (:')
    updater.start_polling()
    updater.idle() 

(I know this is not exactly a MWE, sorry)

Expected behaviour

According to the documentation, it should download the file directly to my current working directory Download this file. By default, the file is saved in the current working directory with its original filename as reported by Telegram.

Actual behaviour

on telegram/files/file.py, on the download function, we get a type error since self.file_path is NoneType, not str or os.PathLike object

Configuration

Ubuntu 18.04

python-telegram-bot 12.2.0 certifi 2019.09.11 future 0.18.1 Python 3.7.3 (default, Apr 3 2019, 19:16:38) [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]

tsnoam commented 5 years ago

@GabrielSimonetto Please complete all info as requested in issue template.

GabrielSimonetto commented 5 years ago

@tsnoam done, sorry

Poolitzer commented 5 years ago

Hey there. Your problem is you, not us ;) As pointed put by tsnoam, this was totally unecessary, my apologies. Heat of the moment.

You create here telegram_file = File(msg.reply_to_message.document.file_id) a new file object without settings its filename. Thats why you see the NoneType error. In the wild (meaning: Retreived from Telegram), files always have a filename.

This is what you actually want: telegram_file = msg.reply_to_message.document.get_file()

Then filename is set and you can download it without an error