MediaGroup: Detect media type from dict (in MediaGroup.attach) and other minor improvements.

This commit is contained in:
Alex Root Junior 2017-11-17 23:45:50 +02:00
parent 61e7ff9a47
commit 698a2dca03

View file

@ -88,22 +88,43 @@ class MediaGroup(base.TelegramObject):
""" """
Helper for sending media group Helper for sending media group
""" """
def __init__(self, media: typing.Optional[typing.List] = None): def __init__(self, medias: typing.Optional[typing.List[typing.Union[InputMedia, typing.Dict]]] = None):
super(MediaGroup, self).__init__() super(MediaGroup, self).__init__()
self.media = [] self.media = []
if media: if medias:
for item in media: self.attach_many(medias)
self._attach(item)
def _attach(self, media: InputMedia): def attach_many(self, *medias: typing.Union[InputMedia, typing.Dict]):
""" """
Attach file Attach list of media
:param medias:
"""
for media in medias:
self.attach(media)
def attach(self, media: typing.Union[InputMedia, typing.Dict]):
"""
Attach media
:param media: :param media:
:return:
""" """
# TODO: Detect media type from dict if isinstance(media, dict):
if 'type' not in media:
raise ValueError(f"Invalid media!")
media_type = media['type']
if media_type == 'photo':
media = InputMediaPhoto(**media)
elif media_type == 'video':
media = InputMediaVideo(**media)
else:
raise TypeError(f"Invalid media type '{media_type}'!")
elif not isinstance(media, InputMedia):
raise TypeError(f"Media must be an instance of InputMedia or dict, not {type(media).__name__}")
self.media.append(media) self.media.append(media)
def attach_photo(self, photo: typing.Union[InputMediaPhoto, base.InputFile], def attach_photo(self, photo: typing.Union[InputMediaPhoto, base.InputFile],
@ -113,11 +134,10 @@ class MediaGroup(base.TelegramObject):
:param photo: :param photo:
:param caption: :param caption:
:return:
""" """
if not isinstance(photo, InputMedia): if not isinstance(photo, InputMedia):
photo = InputMediaPhoto(media=photo, caption=caption) photo = InputMediaPhoto(media=photo, caption=caption)
self._attach(photo) self.attach(photo)
def attach_video(self, video: typing.Union[InputMediaVideo, base.InputFile], def attach_video(self, video: typing.Union[InputMediaVideo, base.InputFile],
caption: base.String = None, caption: base.String = None,
@ -130,12 +150,11 @@ class MediaGroup(base.TelegramObject):
:param width: :param width:
:param height: :param height:
:param duration: :param duration:
:return:
""" """
if not isinstance(video, InputMedia): if not isinstance(video, InputMedia):
video = InputMediaVideo(media=video, caption=caption, video = InputMediaVideo(media=video, caption=caption,
width=width, height=height, duration=duration) width=width, height=height, duration=duration)
self._attach(video) self.attach(video)
def to_python(self) -> typing.List: def to_python(self) -> typing.List:
""" """
@ -154,4 +173,4 @@ class MediaGroup(base.TelegramObject):
def get_files(self): def get_files(self):
return {inputmedia.attachment_key: inputmedia.file return {inputmedia.attachment_key: inputmedia.file
for inputmedia in self.media for inputmedia in self.media
if isinstance(inputmedia, InputMedia) and inputmedia.file} if isinstance(inputmedia, InputMedia) and inputmedia.file}