Support sending bytes/stream as photos (improved _get_extension)

Letting _get_extension work for photos even when the only information
available is a stream or a few bytes allows sending arbitrary bytes
as photos, if force_document was not set to True explicitly.
This commit is contained in:
Lonami Exo 2019-02-12 11:33:06 +01:00
parent 8f8ae9aee5
commit bf11bbd8a6
2 changed files with 15 additions and 1 deletions

View File

@ -337,6 +337,12 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
else: else:
file_name = str(file_id) file_name = str(file_id)
# If the file name lacks extension, add it if possible.
# Else Telegram complains with `PHOTO_EXT_INVALID_ERROR`
# even if the uploaded image is indeed a photo.
if not os.path.splitext(file_name)[-1]:
file_name += utils._get_extension(file)
# Determine whether the file is too big (over 10MB) or not # Determine whether the file is too big (over 10MB) or not
# Telegram does make a distinction between smaller or larger files # Telegram does make a distinction between smaller or larger files
is_large = file_size > 10 * 1024 * 1024 is_large = file_size > 10 * 1024 * 1024

View File

@ -4,6 +4,9 @@ to convert between an entity like a User, Chat, etc. into its Input version)
""" """
import base64 import base64
import binascii import binascii
import imghdr
import inspect
import io
import itertools import itertools
import math import math
import mimetypes import mimetypes
@ -16,7 +19,6 @@ from types import GeneratorType
from .extensions import markdown, html from .extensions import markdown, html
from .helpers import add_surrogate, del_surrogate from .helpers import add_surrogate, del_surrogate
from .tl import types from .tl import types
import inspect
try: try:
import hachoir import hachoir
@ -632,6 +634,12 @@ def _get_extension(file):
""" """
if isinstance(file, str): if isinstance(file, str):
return os.path.splitext(file)[-1] return os.path.splitext(file)[-1]
elif isinstance(file, bytes):
kind = imghdr.what(io.BytesIO(file))
return ('.' + kind) if kind else ''
elif isinstance(file, io.IOBase) and file.seekable():
kind = imghdr.what(file) is not None
return ('.' + kind) if kind else ''
elif getattr(file, 'name', None): elif getattr(file, 'name', None):
return _get_extension(file.name) return _get_extension(file.name)
else: else: