mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-31 07:57:38 +03:00 
			
		
		
		
	Create a new Message.file property (#1168)
This commit is contained in:
		
							parent
							
								
									cfd6d3ce04
								
							
						
					
					
						commit
						10251f9782
					
				|  | @ -216,6 +216,7 @@ Properties | ||||||
|     forward |     forward | ||||||
|     buttons |     buttons | ||||||
|     button_count |     button_count | ||||||
|  |     file | ||||||
|     photo |     photo | ||||||
|     document |     document | ||||||
|     web_preview |     web_preview | ||||||
|  | @ -255,6 +256,31 @@ Methods | ||||||
|     get_buttons |     get_buttons | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | File | ||||||
|  | ==== | ||||||
|  | 
 | ||||||
|  | The `File <telethon.tl.custom.file.File>` type is a wrapper object | ||||||
|  | returned by `Message.file <telethon.tl.custom.message.Message.file>`, | ||||||
|  | and you can use it to easily access a document's attributes, such as | ||||||
|  | its name, bot-API style file ID, etc. | ||||||
|  | 
 | ||||||
|  | .. currentmodule:: telethon.tl.custom.file.File | ||||||
|  | 
 | ||||||
|  | .. autosummary:: | ||||||
|  |     :nosignatures: | ||||||
|  | 
 | ||||||
|  |     id | ||||||
|  |     name | ||||||
|  |     width | ||||||
|  |     height | ||||||
|  |     size | ||||||
|  |     duration | ||||||
|  |     title | ||||||
|  |     performer | ||||||
|  |     emoji | ||||||
|  |     sticker_set | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Conversation | Conversation | ||||||
| ============ | ============ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,6 +18,14 @@ telethon\.tl\.custom\.dialog module | ||||||
|     :undoc-members: |     :undoc-members: | ||||||
|     :show-inheritance: |     :show-inheritance: | ||||||
| 
 | 
 | ||||||
|  | telethon\.tl\.custom\.file module | ||||||
|  | --------------------------------- | ||||||
|  | 
 | ||||||
|  | .. automodule:: telethon.tl.custom.file | ||||||
|  |     :members: | ||||||
|  |     :undoc-members: | ||||||
|  |     :show-inheritance: | ||||||
|  | 
 | ||||||
| telethon\.tl\.custom\.message module | telethon\.tl\.custom\.message module | ||||||
| ------------------------------------ | ------------------------------------ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										128
									
								
								telethon/tl/custom/file.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								telethon/tl/custom/file.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | ||||||
|  | import mimetypes | ||||||
|  | 
 | ||||||
|  | from ... import utils | ||||||
|  | from ...tl import types | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class File: | ||||||
|  |     """ | ||||||
|  |     Convenience class over media like photos or documents, which | ||||||
|  |     supports accessing the attributes in a more convenient way. | ||||||
|  | 
 | ||||||
|  |     If any of the attributes are not present in the current media, | ||||||
|  |     the properties will be ``None``. | ||||||
|  | 
 | ||||||
|  |     The original media is available through the ``media`` attribute. | ||||||
|  |     """ | ||||||
|  |     def __init__(self, media): | ||||||
|  |         self.media = media | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def id(self): | ||||||
|  |         """ | ||||||
|  |         The bot-API style ``file_id`` representing this file. | ||||||
|  |         """ | ||||||
|  |         return utils.pack_bot_file_id(self.media) | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def name(self): | ||||||
|  |         """ | ||||||
|  |         The file name of this document. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(types.DocumentAttributeFilename, 'file_name') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def ext(self): | ||||||
|  |         """ | ||||||
|  |         The extension from the mime type of this file. | ||||||
|  |         """ | ||||||
|  |         return mimetypes.guess_extension(self.mime_type) | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def mime_type(self): | ||||||
|  |         """ | ||||||
|  |         The mime-type of this file. | ||||||
|  |         """ | ||||||
|  |         if isinstance(self.media, types.Photo): | ||||||
|  |             return 'image/jpeg' | ||||||
|  |         elif isinstance(self.media, types.Document): | ||||||
|  |             return self.media.mime_type | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def width(self): | ||||||
|  |         """ | ||||||
|  |         The width in pixels of this media if it's a photo or a video. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(( | ||||||
|  |             types.DocumentAttributeImageSize, types.DocumentAttributeVideo), 'w') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def height(self): | ||||||
|  |         """ | ||||||
|  |         The height in pixels of this media if it's a photo or a video. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(( | ||||||
|  |            types.DocumentAttributeImageSize, types.DocumentAttributeVideo), 'h') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def duration(self): | ||||||
|  |         """ | ||||||
|  |         The duration in seconds of the audio or video. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(( | ||||||
|  |             types.DocumentAttributeAudio, types.DocumentAttributeVideo), 'duration') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def title(self): | ||||||
|  |         """ | ||||||
|  |         The title of the song. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(types.DocumentAttributeAudio, 'title') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def performer(self): | ||||||
|  |         """ | ||||||
|  |         The performer of the song. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(types.DocumentAttributeAudio, 'performer') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def emoji(self): | ||||||
|  |         """ | ||||||
|  |         A string with all emoji that represent the current sticker. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(types.DocumentAttributeSticker, 'alt') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def sticker_set(self): | ||||||
|  |         """ | ||||||
|  |         The :tl:`InputStickerSet` to which the sticker file belongs. | ||||||
|  |         """ | ||||||
|  |         return self._from_attr(types.DocumentAttributeSticker, 'stickerset') | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def size(self): | ||||||
|  |         """ | ||||||
|  |         The size in bytes of this file. | ||||||
|  |         """ | ||||||
|  |         if isinstance(self.media, types.Photo): | ||||||
|  |             return self._size_for(self.media.sizes[-1]) | ||||||
|  |         elif isinstance(self.media, types.Document): | ||||||
|  |             return self.media.size | ||||||
|  | 
 | ||||||
|  |     @staticmethod | ||||||
|  |     def _size_for(kind): | ||||||
|  |         if isinstance(kind, types.PhotoSize): | ||||||
|  |             return kind.size | ||||||
|  |         elif isinstance(kind, types.PhotoStrippedSize): | ||||||
|  |             return utils._stripped_real_length(kind.bytes) | ||||||
|  |         elif isinstance(kind, types.PhotoCachedSize): | ||||||
|  |             return len(kind.bytes) | ||||||
|  |         # elif isinstance(kind, types.PhotoSizeEmpty): | ||||||
|  |         return 0 | ||||||
|  | 
 | ||||||
|  |     def _from_attr(self, cls, field): | ||||||
|  |         if isinstance(self.media, types.Document): | ||||||
|  |             for attr in self.media.attributes: | ||||||
|  |                 if isinstance(attr, cls): | ||||||
|  |                     return getattr(attr, field, None) | ||||||
|  | @ -3,9 +3,11 @@ from .chatgetter import ChatGetter | ||||||
| from .sendergetter import SenderGetter | from .sendergetter import SenderGetter | ||||||
| from .messagebutton import MessageButton | from .messagebutton import MessageButton | ||||||
| from .forward import Forward | from .forward import Forward | ||||||
|  | from .file import File | ||||||
| from .. import TLObject, types, functions | from .. import TLObject, types, functions | ||||||
| from ... import utils, errors | from ... import utils, errors | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| # TODO Figure out a way to have the code generator error on missing fields | # TODO Figure out a way to have the code generator error on missing fields | ||||||
| # Maybe parsing the init function alone if that's possible. | # Maybe parsing the init function alone if that's possible. | ||||||
| class Message(ChatGetter, SenderGetter, TLObject, abc.ABC): | class Message(ChatGetter, SenderGetter, TLObject, abc.ABC): | ||||||
|  | @ -174,8 +176,10 @@ class Message(ChatGetter, SenderGetter, TLObject, abc.ABC): | ||||||
|         self.action = action |         self.action = action | ||||||
| 
 | 
 | ||||||
|         # Convenient storage for custom functions |         # Convenient storage for custom functions | ||||||
|  |         # TODO This is becoming a bit of bloat | ||||||
|         self._client = None |         self._client = None | ||||||
|         self._text = None |         self._text = None | ||||||
|  |         self._file = None | ||||||
|         self._reply_message = None |         self._reply_message = None | ||||||
|         self._buttons = None |         self._buttons = None | ||||||
|         self._buttons_flat = None |         self._buttons_flat = None | ||||||
|  | @ -370,6 +374,25 @@ class Message(ChatGetter, SenderGetter, TLObject, abc.ABC): | ||||||
| 
 | 
 | ||||||
|         return self._buttons_count |         return self._buttons_count | ||||||
| 
 | 
 | ||||||
|  |     @property | ||||||
|  |     def file(self): | ||||||
|  |         """ | ||||||
|  |         Returns a `File <telethon.tl.custom.file.File>` wrapping the | ||||||
|  |         `photo` or `document` in this message. If the media type is different | ||||||
|  |         (polls, games, none, etc.), this property will be ``None``. | ||||||
|  | 
 | ||||||
|  |         This instance lets you easily access other properties, such as | ||||||
|  |         `file.id <telethon.tl.custom.file.File.id>`, | ||||||
|  |         `file.name <telethon.tl.custom.file.File.name>`, | ||||||
|  |         etc., without having to manually inspect the ``document.attributes``. | ||||||
|  |         """ | ||||||
|  |         if not self._file: | ||||||
|  |             media = self.photo or self.document | ||||||
|  |             if media: | ||||||
|  |                 self._file = File(media) | ||||||
|  | 
 | ||||||
|  |         return self._file | ||||||
|  | 
 | ||||||
|     @property |     @property | ||||||
|     def photo(self): |     def photo(self): | ||||||
|         """ |         """ | ||||||
|  |  | ||||||
|  | @ -1162,6 +1162,7 @@ def stripped_photo_to_jpg(stripped): | ||||||
| 
 | 
 | ||||||
|     Ported from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225 |     Ported from https://github.com/telegramdesktop/tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225 | ||||||
|     """ |     """ | ||||||
|  |     # NOTE: Changes here should update _stripped_real_length | ||||||
|     if len(stripped) < 3 or stripped[0] != 1: |     if len(stripped) < 3 or stripped[0] != 1: | ||||||
|         return stripped |         return stripped | ||||||
| 
 | 
 | ||||||
|  | @ -1170,3 +1171,10 @@ def stripped_photo_to_jpg(stripped): | ||||||
|     header[164] = stripped[1] |     header[164] = stripped[1] | ||||||
|     header[166] = stripped[2] |     header[166] = stripped[2] | ||||||
|     return bytes(header) + stripped[3:] + footer |     return bytes(header) + stripped[3:] + footer | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _stripped_real_length(stripped): | ||||||
|  |     if len(stripped) < 3 or stripped[0] != 1: | ||||||
|  |         return len(stripped) | ||||||
|  | 
 | ||||||
|  |     return len(stripped) + 622 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user