From 6c0bd76a63894824caf153f8c30152a7b60c351f Mon Sep 17 00:00:00 2001 From: jrootjunior Date: Thu, 14 Nov 2019 16:39:34 +0200 Subject: [PATCH] Fix input media. And allow to edit media --- aiogram/api/client/bot.py | 11 +++++++---- aiogram/api/methods/edit_message_media.py | 17 +++++++++++------ aiogram/api/session/api.py | 0 aiogram/api/session/base.py | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) delete mode 100644 aiogram/api/session/api.py diff --git a/aiogram/api/client/bot.py b/aiogram/api/client/bot.py index d64e66b9..1eaee1d9 100644 --- a/aiogram/api/client/bot.py +++ b/aiogram/api/client/bot.py @@ -78,6 +78,9 @@ from ..types import ( InlineKeyboardMarkup, InlineQueryResult, InputFile, + InputMedia, + InputMediaPhoto, + InputMediaVideo, LabeledPrice, MaskPosition, Message, @@ -673,7 +676,7 @@ class Bot(BaseBot): async def send_media_group( self, chat_id: Union[int, str], - media: Union[str, InputFile], + media: List[Union[InputMediaPhoto, InputMediaVideo]], disable_notification: Optional[bool] = None, reply_to_message_id: Optional[int] = None, ) -> List[Message]: @@ -685,7 +688,7 @@ class Bot(BaseBot): :param chat_id: Unique identifier for the target chat or username of the target channel (in the format @channelusername) :type chat_id: :obj:`Union[int, str]` :param media: A JSON-serialized array describing photos and videos to be sent, must include 2–10 items - :type media: :obj:`Union[str, InputFile]` + :type media: :obj:`List[Union[InputMediaPhoto, InputMediaVideo]]` :param disable_notification: Sends the messages silently. Users will receive a notification with no sound. :type disable_notification: :obj:`Optional[bool]` :param reply_to_message_id: If the messages are a reply, ID of the original message @@ -1501,7 +1504,7 @@ class Bot(BaseBot): async def edit_message_media( self, - media: Union[str, InputFile], + media: InputMedia, chat_id: Optional[Union[int, str]] = None, message_id: Optional[int] = None, inline_message_id: Optional[str] = None, @@ -1513,7 +1516,7 @@ class Bot(BaseBot): Source: https://core.telegram.org/bots/api#editmessagemedia :param media: A JSON-serialized object for a new media content of the message - :type media: :obj:`Union[str, InputFile]` + :type media: :obj:`InputMedia` :param chat_id: Required if inline_message_id is not specified. Unique identifier for the target chat or username of the target channel (in the format @channelusername) :type chat_id: :obj:`Optional[Union[int, str]]` :param message_id: Required if inline_message_id is not specified. Identifier of the message to edit diff --git a/aiogram/api/methods/edit_message_media.py b/aiogram/api/methods/edit_message_media.py index 46f54a27..dead0e52 100644 --- a/aiogram/api/methods/edit_message_media.py +++ b/aiogram/api/methods/edit_message_media.py @@ -1,7 +1,8 @@ +import secrets from typing import Any, Dict, Optional, Union -from ..types import InlineKeyboardMarkup, InputFile, Message from .base import Request, TelegramMethod +from ..types import InlineKeyboardMarkup, InputMedia, Message, InputFile class EditMessageMedia(TelegramMethod[Union[Message, bool]]): @@ -13,7 +14,7 @@ class EditMessageMedia(TelegramMethod[Union[Message, bool]]): __returning__ = Union[Message, bool] - media: Union[str, InputFile] + media: InputMedia """A JSON-serialized object for a new media content of the message""" chat_id: Optional[Union[int, str]] = None @@ -29,11 +30,15 @@ class EditMessageMedia(TelegramMethod[Union[Message, bool]]): """A JSON-serialized object for a new inline keyboard.""" def build_request(self) -> Request: - data: Dict[str, Any] = self.dict( - exclude={"media",} - ) + data: Dict[str, Any] = self.dict() files: Dict[str, InputFile] = {} - self.prepare_file(data=data, files=files, name="media", value=self.media) + self.prepare_media_file(data=data, files=files) return Request(method="editMessageMedia", data=data, files=files) + + def prepare_media_file(self, data: Dict[str, Any], files: Dict[str, InputFile]) -> None: + if isinstance(data["media"]["media"], InputFile): + tag = secrets.token_urlsafe(10) + files[tag] = data["media"].pop("media") # type: ignore + data["media"]["media"] = f"attach://{tag}" diff --git a/aiogram/api/session/api.py b/aiogram/api/session/api.py deleted file mode 100644 index e69de29b..00000000 diff --git a/aiogram/api/session/base.py b/aiogram/api/session/base.py index 1c9ec27d..af9f787f 100644 --- a/aiogram/api/session/base.py +++ b/aiogram/api/session/base.py @@ -70,7 +70,7 @@ class BaseSession(abc.ABC): loop.create_task(self.close()) def prepare_value(self, value: Any) -> Union[str, int, bool]: - if isinstance(value, (bool, str, int)): + if isinstance(value, str): return value if isinstance(value, (list, dict)): return self.json_dumps(self.clean_json(value))