Get rid of now broken cache

This commit is contained in:
Lonami Exo 2018-12-25 11:44:10 +01:00
parent 382106aafb
commit f73ae42a03
4 changed files with 13 additions and 75 deletions

View File

@ -690,7 +690,6 @@ class MessageMethods(UploadMethods, ButtonMethods, MessageParseMethods):
reply_markup=self.build_reply_markup(buttons) reply_markup=self.build_reply_markup(buttons)
) )
msg = self._get_response_message(request, await self(request), entity) msg = self._get_response_message(request, await self(request), entity)
await self._cache_media(msg, file, file_handle)
return msg return msg
async def delete_messages(self, entity, message_ids, *, revoke=True): async def delete_messages(self, entity, message_ids, *, revoke=True):

View File

@ -22,7 +22,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
async def send_file( async def send_file(
self, entity, file, *, caption=None, force_document=False, self, entity, file, *, caption=None, force_document=False,
progress_callback=None, reply_to=None, attributes=None, progress_callback=None, reply_to=None, attributes=None,
thumb=None, allow_cache=True, parse_mode=(), thumb=None, parse_mode=(),
voice_note=False, video_note=False, buttons=None, silent=None, voice_note=False, video_note=False, buttons=None, silent=None,
**kwargs): **kwargs):
""" """
@ -74,12 +74,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
Successful thumbnails were files below 20kb and 200x200px. Successful thumbnails were files below 20kb and 200x200px.
Width/height and dimensions/size ratios may be important. Width/height and dimensions/size ratios may be important.
allow_cache (`bool`, optional):
Whether to allow using the cached version stored in the
database or not. Defaults to ``True`` to avoid re-uploads.
Must be ``False`` if you wish to use different attributes
or thumb than those that were used when the file was cached.
parse_mode (`object`, optional): parse_mode (`object`, optional):
See the `TelegramClient.parse_mode` property for allowed See the `TelegramClient.parse_mode` property for allowed
values. Markdown parsing will be used by default. values. Markdown parsing will be used by default.
@ -87,16 +81,10 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
voice_note (`bool`, optional): voice_note (`bool`, optional):
If ``True`` the audio will be sent as a voice note. If ``True`` the audio will be sent as a voice note.
Set `allow_cache` to ``False`` if you sent the same file
without this setting before for it to work.
video_note (`bool`, optional): video_note (`bool`, optional):
If ``True`` the video will be sent as a video note, If ``True`` the video will be sent as a video note,
also known as a round video message. also known as a round video message.
Set `allow_cache` to ``False`` if you sent the same file
without this setting before for it to work.
buttons (`list`, `custom.Button <telethon.tl.custom.button.Button>`, :tl:`KeyboardButton`): buttons (`list`, `custom.Button <telethon.tl.custom.button.Button>`, :tl:`KeyboardButton`):
The matrix (list of lists), row list or button to be shown The matrix (list of lists), row list or button to be shown
after sending the message. This parameter will only work if after sending the message. This parameter will only work if
@ -145,7 +133,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
for x in documents: for x in documents:
result.append(await self.send_file( result.append(await self.send_file(
entity, x, allow_cache=allow_cache, entity, x,
caption=caption, force_document=force_document, caption=caption, force_document=force_document,
progress_callback=progress_callback, reply_to=reply_to, progress_callback=progress_callback, reply_to=reply_to,
attributes=attributes, thumb=thumb, voice_note=voice_note, attributes=attributes, thumb=thumb, voice_note=voice_note,
@ -169,7 +157,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
file_handle, media = await self._file_to_media( file_handle, media = await self._file_to_media(
file, force_document=force_document, file, force_document=force_document,
progress_callback=progress_callback, progress_callback=progress_callback,
attributes=attributes, allow_cache=allow_cache, thumb=thumb, attributes=attributes, thumb=thumb,
voice_note=voice_note, video_note=video_note voice_note=voice_note, video_note=video_note
) )
@ -179,7 +167,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
entities=msg_entities, reply_markup=markup, silent=silent entities=msg_entities, reply_markup=markup, silent=silent
) )
msg = self._get_response_message(request, await self(request), entity) msg = self._get_response_message(request, await self(request), entity)
await self._cache_media(msg, file, file_handle, force_document=force_document)
return msg return msg
@ -187,15 +174,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
progress_callback=None, reply_to=None, progress_callback=None, reply_to=None,
parse_mode=(), silent=None): parse_mode=(), silent=None):
"""Specialized version of .send_file for albums""" """Specialized version of .send_file for albums"""
# We don't care if the user wants to avoid cache, we will use it
# anyway. Why? The cached version will be exactly the same thing
# we need to produce right now to send albums (uploadMedia), and
# cache only makes a difference for documents where the user may
# want the attributes used on them to change.
#
# In theory documents can be sent inside the albums but they appear
# as different messages (not inside the album), and the logic to set
# the attributes/avoid cache is already written in .send_file().
entity = await self.get_input_entity(entity) entity = await self.get_input_entity(entity)
if not utils.is_list_like(caption): if not utils.is_list_like(caption):
caption = (caption,) caption = (caption,)
@ -206,17 +184,15 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
reply_to = utils.get_message_id(reply_to) reply_to = utils.get_message_id(reply_to)
# Need to upload the media first, but only if they're not cached yet
media = [] media = []
for file in files: for file in files:
# fh will either be InputPhoto or a modified InputFile # fh will either be InputPhoto or a modified InputFile
fh = await self.upload_file(file, use_cache=types.InputPhoto) fh = await self.upload_file(file)
if not isinstance(fh, types.InputPhoto): if not isinstance(fh, types.InputPhoto):
r = await self(functions.messages.UploadMediaRequest( r = await self(functions.messages.UploadMediaRequest(
entity, media=types.InputMediaUploadedPhoto(fh) entity, media=types.InputMediaUploadedPhoto(fh)
)) ))
input_photo = utils.get_input_photo(r.photo) input_photo = utils.get_input_photo(r.photo)
self.session.cache_file(fh.md5, fh.size, input_photo)
fh = input_photo fh = input_photo
if captions: if captions:
@ -240,7 +216,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
] ]
async def upload_file( async def upload_file(
self, file, *, part_size_kb=None, file_name=None, use_cache=None, self, file, *, part_size_kb=None, file_name=None,
progress_callback=None): progress_callback=None):
""" """
Uploads the specified file and returns a handle (an instance of Uploads the specified file and returns a handle (an instance of
@ -267,13 +243,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
If not specified, the name will be taken from the ``file`` If not specified, the name will be taken from the ``file``
and if this is not a ``str``, it will be ``"unnamed"``. and if this is not a ``str``, it will be ``"unnamed"``.
use_cache (`type`, optional):
The type of cache to use (currently either :tl:`InputDocument`
or :tl:`InputPhoto`). If present and the file is small enough
to need the MD5, it will be checked against the database,
and if a match is found, the upload won't be made. Instead,
an instance of type ``use_cache`` will be returned.
progress_callback (`callable`, optional): progress_callback (`callable`, optional):
A callback function accepting two parameters: A callback function accepting two parameters:
``(sent bytes, total)``. ``(sent bytes, total)``.
@ -322,20 +291,10 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
is_large = file_size > 10 * 1024 * 1024 is_large = file_size > 10 * 1024 * 1024
hash_md5 = hashlib.md5() hash_md5 = hashlib.md5()
if not is_large: if not is_large:
# Calculate the MD5 hash before anything else.
# As this needs to be done always for small files,
# might as well do it before anything else and
# check the cache.
if isinstance(file, str): if isinstance(file, str):
with open(file, 'rb') as stream: with open(file, 'rb') as stream:
file = stream.read() file = stream.read()
hash_md5.update(file) hash_md5.update(file)
if use_cache:
cached = self.session.get_file(
hash_md5.digest(), file_size, cls=use_cache
)
if cached:
return cached
part_count = (file_size + part_size - 1) // part_size part_count = (file_size + part_size - 1) // part_size
__log__.info('Uploading file of %d bytes in %d chunks of %d', __log__.info('Uploading file of %d bytes in %d chunks of %d',
@ -378,7 +337,7 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
async def _file_to_media( async def _file_to_media(
self, file, force_document=False, self, file, force_document=False,
progress_callback=None, attributes=None, thumb=None, progress_callback=None, attributes=None, thumb=None,
allow_cache=True, voice_note=False, video_note=False): voice_note=False, video_note=False):
if not file: if not file:
return None, None return None, None
@ -397,11 +356,9 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
media = None media = None
file_handle = None file_handle = None
as_image = utils.is_image(file) and not force_document as_image = utils.is_image(file) and not force_document
use_cache = types.InputPhoto if as_image else types.InputDocument
if not isinstance(file, str) or os.path.isfile(file): if not isinstance(file, str) or os.path.isfile(file):
file_handle = await self.upload_file( file_handle = await self.upload_file(
file, progress_callback=progress_callback, file, progress_callback=progress_callback
use_cache=use_cache if allow_cache else None
) )
elif re.match('https?://', file): elif re.match('https?://', file):
if as_image: if as_image:
@ -422,12 +379,6 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
'Failed to convert {} to media. Not an existing file, ' 'Failed to convert {} to media. Not an existing file, '
'an HTTP URL or a valid bot-API-like file ID'.format(file) 'an HTTP URL or a valid bot-API-like file ID'.format(file)
) )
elif isinstance(file_handle, use_cache):
# File was cached, so an instance of use_cache was returned
if as_image:
media = types.InputMediaPhoto(file_handle)
else:
media = types.InputMediaDocument(file_handle)
elif as_image: elif as_image:
media = types.InputMediaUploadedPhoto(file_handle) media = types.InputMediaUploadedPhoto(file_handle)
else: else:
@ -451,17 +402,4 @@ class UploadMethods(ButtonMethods, MessageParseMethods, UserMethods):
) )
return file_handle, media return file_handle, media
async def _cache_media(self, msg, file, file_handle,
force_document=False):
if file and msg and isinstance(file_handle,
custom.InputSizedFile):
# There was a response message and we didn't use cached
# version, so cache whatever we just sent to the database.
md5, size = file_handle.md5, file_handle.size
if utils.is_image(file) and not force_document:
to_cache = utils.get_input_photo(msg.media.photo)
else:
to_cache = utils.get_input_document(msg.media.document)
self.session.cache_file(md5, size, to_cache)
# endregion # endregion

View File

@ -120,6 +120,8 @@ class Session(ABC):
""" """
raise NotImplementedError raise NotImplementedError
# TODO get rid of now useless cache
@abstractmethod @abstractmethod
def cache_file(self, md5_digest, file_size, instance): def cache_file(self, md5_digest, file_size, instance):
""" """

View File

@ -113,7 +113,7 @@ class InlineBuilder:
Same as ``file`` for `client.send_file Same as ``file`` for `client.send_file
<telethon.client.uploads.UploadMethods.send_file>`. <telethon.client.uploads.UploadMethods.send_file>`.
""" """
fh = await self._client.upload_file(file, use_cache=types.InputPhoto) fh = await self._client.upload_file(file)
if not isinstance(fh, types.InputPhoto): if not isinstance(fh, types.InputPhoto):
r = await self._client(functions.messages.UploadMediaRequest( r = await self._client(functions.messages.UploadMediaRequest(
types.InputPeerSelf(), media=types.InputMediaUploadedPhoto(fh) types.InputPeerSelf(), media=types.InputMediaUploadedPhoto(fh)
@ -140,14 +140,14 @@ class InlineBuilder:
async def document( async def document(
self, file, title=None, *, description=None, type=None, self, file, title=None, *, description=None, type=None,
mime_type=None, attributes=None, force_document=False, mime_type=None, attributes=None, force_document=False,
voice_note=False, video_note=False, use_cache=True, id=None, voice_note=False, video_note=False, id=None,
text=None, parse_mode=(), link_preview=True, text=None, parse_mode=(), link_preview=True,
geo=None, period=60, contact=None, game=False, buttons=None geo=None, period=60, contact=None, game=False, buttons=None
): ):
""" """
Creates a new inline result of document type. Creates a new inline result of document type.
`use_cache`, `mime_type`, `attributes`, `force_document`, `mime_type`, `attributes`, `force_document`,
`voice_note` and `video_note` are described in `client.send_file `voice_note` and `video_note` are described in `client.send_file
<telethon.client.uploads.UploadMethods.send_file>`. <telethon.client.uploads.UploadMethods.send_file>`.
@ -174,8 +174,7 @@ class InlineBuilder:
else: else:
type = 'document' type = 'document'
use_cache = types.InputDocument if use_cache else None fh = await self._client.upload_file(file)
fh = await self._client.upload_file(file, use_cache=use_cache)
if not isinstance(fh, types.InputDocument): if not isinstance(fh, types.InputDocument):
attributes, mime_type = utils.get_attributes( attributes, mime_type = utils.get_attributes(
file, file,