2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-22 18:07:21 +00:00

Add media spoiler support for other relevant methods

- send_media_group()
- edit_message_media()
- edit_inline_media()
This commit is contained in:
Dan 2022-12-30 15:12:42 +01:00
parent 50d87bf5e9
commit e8bd639634
3 changed files with 91 additions and 67 deletions

View File

@ -16,11 +16,10 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import os
import re
import io
import asyncio import asyncio
import io import io
import os
import re
import pyrogram import pyrogram
from pyrogram import raw from pyrogram import raw
@ -80,8 +79,6 @@ class EditInlineMedia:
caption = media.caption caption = media.caption
parse_mode = media.parse_mode parse_mode = media.parse_mode
is_photo = isinstance(media, types.InputMediaPhoto)
is_bytes_io = isinstance(media.media, io.BytesIO) is_bytes_io = isinstance(media.media, io.BytesIO)
is_uploaded_file = is_bytes_io or os.path.isfile(media.media) is_uploaded_file = is_bytes_io or os.path.isfile(media.media)
@ -99,15 +96,16 @@ class EditInlineMedia:
else: else:
filename_attribute = [] filename_attribute = []
if isinstance(media, types.InputMediaPhoto):
if is_photo:
if is_uploaded_file: if is_uploaded_file:
media = raw.types.InputMediaUploadedPhoto( media = raw.types.InputMediaUploadedPhoto(
file=await self.save_file(media.media) file=await self.save_file(media.media),
spoiler=media.has_spoiler
) )
elif is_external_url: elif is_external_url:
media = raw.types.InputMediaPhotoExternal( media = raw.types.InputMediaPhotoExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.PHOTO) media = utils.get_input_media_from_file_id(media.media, FileType.PHOTO)
@ -117,18 +115,20 @@ class EditInlineMedia:
mime_type=(None if is_bytes_io else self.guess_mime_type(media.media)) or "video/mp4", mime_type=(None if is_bytes_io else self.guess_mime_type(media.media)) or "video/mp4",
thumb=await self.save_file(media.thumb), thumb=await self.save_file(media.thumb),
file=await self.save_file(media.media), file=await self.save_file(media.media),
spoiler=media.has_spoiler,
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
supports_streaming=media.supports_streaming or None, supports_streaming=media.supports_streaming or None,
duration=media.duration, duration=media.duration,
w=media.width, w=media.width,
h=media.height h=media.height
) )
] + filename_attribute ] + filename_attribute
) )
elif is_external_url: elif is_external_url:
media = raw.types.InputMediaDocumentExternal( media = raw.types.InputMediaDocumentExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.VIDEO) media = utils.get_input_media_from_file_id(media.media, FileType.VIDEO)
@ -139,12 +139,12 @@ class EditInlineMedia:
thumb=await self.save_file(media.thumb), thumb=await self.save_file(media.thumb),
file=await self.save_file(media.media), file=await self.save_file(media.media),
attributes=[ attributes=[
raw.types.DocumentAttributeAudio( raw.types.DocumentAttributeAudio(
duration=media.duration, duration=media.duration,
performer=media.performer, performer=media.performer,
title=media.title title=media.title
) )
] + filename_attribute ] + filename_attribute
) )
elif is_external_url: elif is_external_url:
media = raw.types.InputMediaDocumentExternal( media = raw.types.InputMediaDocumentExternal(
@ -158,20 +158,22 @@ class EditInlineMedia:
mime_type=(None if is_bytes_io else self.guess_mime_type(media.media)) or "video/mp4", mime_type=(None if is_bytes_io else self.guess_mime_type(media.media)) or "video/mp4",
thumb=await self.save_file(media.thumb), thumb=await self.save_file(media.thumb),
file=await self.save_file(media.media), file=await self.save_file(media.media),
spoiler=media.has_spoiler,
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
supports_streaming=True, supports_streaming=True,
duration=media.duration, duration=media.duration,
w=media.width, w=media.width,
h=media.height h=media.height
), ),
raw.types.DocumentAttributeAnimated() raw.types.DocumentAttributeAnimated()
] + filename_attribute, ] + filename_attribute,
nosound_video=True nosound_video=True
) )
elif is_external_url: elif is_external_url:
media = raw.types.InputMediaDocumentExternal( media = raw.types.InputMediaDocumentExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.ANIMATION) media = utils.get_input_media_from_file_id(media.media, FileType.ANIMATION)
@ -196,7 +198,6 @@ class EditInlineMedia:
session = await get_session(self, dc_id) session = await get_session(self, dc_id)
if is_uploaded_file: if is_uploaded_file:
uploaded_media = await self.invoke( uploaded_media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
@ -210,13 +211,15 @@ class EditInlineMedia:
id=uploaded_media.photo.id, id=uploaded_media.photo.id,
access_hash=uploaded_media.photo.access_hash, access_hash=uploaded_media.photo.access_hash,
file_reference=uploaded_media.photo.file_reference file_reference=uploaded_media.photo.file_reference
) ),
) if is_photo else raw.types.InputMediaDocument( spoiler=getattr(media, "has_spoiler", None)
) if isinstance(media, types.InputMediaPhoto) else raw.types.InputMediaDocument(
id=raw.types.InputDocument( id=raw.types.InputDocument(
id=uploaded_media.document.id, id=uploaded_media.document.id,
access_hash=uploaded_media.document.access_hash, access_hash=uploaded_media.document.access_hash,
file_reference=uploaded_media.document.file_reference file_reference=uploaded_media.document.file_reference
) ),
spoiler=getattr(media, "has_spoiler", None)
) )
else: else:
actual_media = media actual_media = media

View File

@ -16,9 +16,9 @@
# You should have received a copy of the GNU Lesser General Public License # You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>. # along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
import io
import os import os
import re import re
import io
from typing import Union from typing import Union
import pyrogram import pyrogram
@ -93,36 +93,40 @@ class EditMessageMedia:
if isinstance(media, types.InputMediaPhoto): if isinstance(media, types.InputMediaPhoto):
if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media): if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media):
media = await self.invoke( uploaded_media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedPhoto( media=raw.types.InputMediaUploadedPhoto(
file=await self.save_file(media.media) file=await self.save_file(media.media),
spoiler=media.has_spoiler
) )
) )
) )
media = raw.types.InputMediaPhoto( media = raw.types.InputMediaPhoto(
id=raw.types.InputPhoto( id=raw.types.InputPhoto(
id=media.photo.id, id=uploaded_media.photo.id,
access_hash=media.photo.access_hash, access_hash=uploaded_media.photo.access_hash,
file_reference=media.photo.file_reference file_reference=uploaded_media.photo.file_reference
) ),
spoiler=media.has_spoiler
) )
elif re.match("^https?://", media.media): elif re.match("^https?://", media.media):
media = raw.types.InputMediaPhotoExternal( media = raw.types.InputMediaPhotoExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.PHOTO) media = utils.get_input_media_from_file_id(media.media, FileType.PHOTO)
elif isinstance(media, types.InputMediaVideo): elif isinstance(media, types.InputMediaVideo):
if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media): if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media):
media = await self.invoke( uploaded_media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument( media=raw.types.InputMediaUploadedDocument(
mime_type=self.guess_mime_type(media.media) or "video/mp4", mime_type=self.guess_mime_type(media.media) or "video/mp4",
thumb=await self.save_file(media.thumb), thumb=await self.save_file(media.thumb),
spoiler=media.has_spoiler,
file=await self.save_file(media.media), file=await self.save_file(media.media),
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
@ -141,14 +145,16 @@ class EditMessageMedia:
media = raw.types.InputMediaDocument( media = raw.types.InputMediaDocument(
id=raw.types.InputDocument( id=raw.types.InputDocument(
id=media.document.id, id=uploaded_media.document.id,
access_hash=media.document.access_hash, access_hash=uploaded_media.document.access_hash,
file_reference=media.document.file_reference file_reference=uploaded_media.document.file_reference
) ),
spoiler=media.has_spoiler
) )
elif re.match("^https?://", media.media): elif re.match("^https?://", media.media):
media = raw.types.InputMediaDocumentExternal( media = raw.types.InputMediaDocumentExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.VIDEO) media = utils.get_input_media_from_file_id(media.media, FileType.VIDEO)
@ -190,12 +196,13 @@ class EditMessageMedia:
media = utils.get_input_media_from_file_id(media.media, FileType.AUDIO) media = utils.get_input_media_from_file_id(media.media, FileType.AUDIO)
elif isinstance(media, types.InputMediaAnimation): elif isinstance(media, types.InputMediaAnimation):
if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media): if isinstance(media.media, io.BytesIO) or os.path.isfile(media.media):
media = await self.invoke( uploaded_media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedDocument( media=raw.types.InputMediaUploadedDocument(
mime_type=self.guess_mime_type(media.media) or "video/mp4", mime_type=self.guess_mime_type(media.media) or "video/mp4",
thumb=await self.save_file(media.thumb), thumb=await self.save_file(media.thumb),
spoiler=media.has_spoiler,
file=await self.save_file(media.media), file=await self.save_file(media.media),
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
@ -215,14 +222,16 @@ class EditMessageMedia:
media = raw.types.InputMediaDocument( media = raw.types.InputMediaDocument(
id=raw.types.InputDocument( id=raw.types.InputDocument(
id=media.document.id, id=uploaded_media.document.id,
access_hash=media.document.access_hash, access_hash=uploaded_media.document.access_hash,
file_reference=media.document.file_reference file_reference=uploaded_media.document.file_reference
) ),
spoiler=media.has_spoiler
) )
elif re.match("^https?://", media.media): elif re.match("^https?://", media.media):
media = raw.types.InputMediaDocumentExternal( media = raw.types.InputMediaDocumentExternal(
url=media.media url=media.media,
spoiler=media.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(media.media, FileType.ANIMATION) media = utils.get_input_media_from_file_id(media.media, FileType.ANIMATION)

View File

@ -100,7 +100,8 @@ class SendMediaGroup:
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedPhoto( media=raw.types.InputMediaUploadedPhoto(
file=await self.save_file(i.media) file=await self.save_file(i.media),
spoiler=i.has_spoiler
) )
) )
) )
@ -110,14 +111,16 @@ class SendMediaGroup:
id=media.photo.id, id=media.photo.id,
access_hash=media.photo.access_hash, access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference file_reference=media.photo.file_reference
) ),
spoiler=i.has_spoiler
) )
elif re.match("^https?://", i.media): elif re.match("^https?://", i.media):
media = await self.invoke( media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaPhotoExternal( media=raw.types.InputMediaPhotoExternal(
url=i.media url=i.media,
spoiler=i.has_spoiler
) )
) )
) )
@ -127,7 +130,8 @@ class SendMediaGroup:
id=media.photo.id, id=media.photo.id,
access_hash=media.photo.access_hash, access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference file_reference=media.photo.file_reference
) ),
spoiler=i.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(i.media, FileType.PHOTO) media = utils.get_input_media_from_file_id(i.media, FileType.PHOTO)
@ -136,7 +140,8 @@ class SendMediaGroup:
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaUploadedPhoto( media=raw.types.InputMediaUploadedPhoto(
file=await self.save_file(i.media) file=await self.save_file(i.media),
spoiler=i.has_spoiler
) )
) )
) )
@ -146,7 +151,8 @@ class SendMediaGroup:
id=media.photo.id, id=media.photo.id,
access_hash=media.photo.access_hash, access_hash=media.photo.access_hash,
file_reference=media.photo.file_reference file_reference=media.photo.file_reference
) ),
spoiler=i.has_spoiler
) )
elif isinstance(i, types.InputMediaVideo): elif isinstance(i, types.InputMediaVideo):
if isinstance(i.media, str): if isinstance(i.media, str):
@ -157,6 +163,7 @@ class SendMediaGroup:
media=raw.types.InputMediaUploadedDocument( media=raw.types.InputMediaUploadedDocument(
file=await self.save_file(i.media), file=await self.save_file(i.media),
thumb=await self.save_file(i.thumb), thumb=await self.save_file(i.thumb),
spoiler=i.has_spoiler,
mime_type=self.guess_mime_type(i.media) or "video/mp4", mime_type=self.guess_mime_type(i.media) or "video/mp4",
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
@ -176,14 +183,16 @@ class SendMediaGroup:
id=media.document.id, id=media.document.id,
access_hash=media.document.access_hash, access_hash=media.document.access_hash,
file_reference=media.document.file_reference file_reference=media.document.file_reference
) ),
spoiler=i.has_spoiler
) )
elif re.match("^https?://", i.media): elif re.match("^https?://", i.media):
media = await self.invoke( media = await self.invoke(
raw.functions.messages.UploadMedia( raw.functions.messages.UploadMedia(
peer=await self.resolve_peer(chat_id), peer=await self.resolve_peer(chat_id),
media=raw.types.InputMediaDocumentExternal( media=raw.types.InputMediaDocumentExternal(
url=i.media url=i.media,
spoiler=i.has_spoiler
) )
) )
) )
@ -193,7 +202,8 @@ class SendMediaGroup:
id=media.document.id, id=media.document.id,
access_hash=media.document.access_hash, access_hash=media.document.access_hash,
file_reference=media.document.file_reference file_reference=media.document.file_reference
) ),
spoiler=i.has_spoiler
) )
else: else:
media = utils.get_input_media_from_file_id(i.media, FileType.VIDEO) media = utils.get_input_media_from_file_id(i.media, FileType.VIDEO)
@ -204,6 +214,7 @@ class SendMediaGroup:
media=raw.types.InputMediaUploadedDocument( media=raw.types.InputMediaUploadedDocument(
file=await self.save_file(i.media), file=await self.save_file(i.media),
thumb=await self.save_file(i.thumb), thumb=await self.save_file(i.thumb),
spoiler=i.has_spoiler,
mime_type=self.guess_mime_type(getattr(i.media, "name", "video.mp4")) or "video/mp4", mime_type=self.guess_mime_type(getattr(i.media, "name", "video.mp4")) or "video/mp4",
attributes=[ attributes=[
raw.types.DocumentAttributeVideo( raw.types.DocumentAttributeVideo(
@ -223,7 +234,8 @@ class SendMediaGroup:
id=media.document.id, id=media.document.id,
access_hash=media.document.access_hash, access_hash=media.document.access_hash,
file_reference=media.document.file_reference file_reference=media.document.file_reference
) ),
spoiler=i.has_spoiler
) )
elif isinstance(i, types.InputMediaAudio): elif isinstance(i, types.InputMediaAudio):
if isinstance(i.media, str): if isinstance(i.media, str):