diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py
index 01d7d13a..a5548590 100644
--- a/compiler/docs/compiler.py
+++ b/compiler/docs/compiler.py
@@ -511,6 +511,7 @@ def pyrogram_api():
Audio
AvailableEffect
Document
+ AlternativeVideo
Animation
Video
Voice
diff --git a/pyrogram/types/messages_and_media/__init__.py b/pyrogram/types/messages_and_media/__init__.py
index acf61e5e..1acf6d5a 100644
--- a/pyrogram/types/messages_and_media/__init__.py
+++ b/pyrogram/types/messages_and_media/__init__.py
@@ -17,6 +17,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with PyroFork. If not, see .
+from .alternative_video import AlternativeVideo
from .animation import Animation
from .audio import Audio
from .available_effect import AvailableEffect
@@ -71,6 +72,7 @@ from .wallpaper_settings import WallpaperSettings
from .translated_text import TranslatedText
__all__ = [
+ "AlternativeVideo",
"Animation",
"Audio",
"AvailableEffect",
diff --git a/pyrogram/types/messages_and_media/alternative_video.py b/pyrogram/types/messages_and_media/alternative_video.py
new file mode 100644
index 00000000..921830a7
--- /dev/null
+++ b/pyrogram/types/messages_and_media/alternative_video.py
@@ -0,0 +1,134 @@
+# Pyrogram - Telegram MTProto API Client Library for Python
+# Copyright (C) 2017-present Dan
+#
+# This file is part of Pyrogram.
+#
+# Pyrogram is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pyrogram is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with Pyrogram. If not, see .
+
+from datetime import datetime
+from typing import List
+
+import pyrogram
+from pyrogram import raw, utils
+from pyrogram import types
+from pyrogram.file_id import FileId, FileType, FileUniqueId, FileUniqueType, ThumbnailSource
+from ..object import Object
+
+
+class AlternativeVideo(Object):
+ """Describes an alternative reencoded quality of a video file.
+
+ Parameters:
+ file_id (``str``):
+ Identifier for this file, which can be used to download or reuse the file.
+
+ file_unique_id (``str``):
+ Unique identifier for this file, which is supposed to be the same over time and for different accounts.
+ Can't be used to download or reuse the file.
+
+ width (``int``):
+ Video width as defined by sender.
+
+ height (``int``):
+ Video height as defined by sender.
+
+ codec (``str``):
+ Codec used for video file encoding, for example, "h264", "h265", or "av1".
+
+ duration (``int``):
+ Duration of the video in seconds as defined by sender.
+
+ file_name (``str``, *optional*):
+ Video file name.
+
+ mime_type (``str``, *optional*):
+ Mime type of a file as defined by sender.
+
+ file_size (``int``, *optional*):
+ File size.
+
+ supports_streaming (``bool``, *optional*):
+ True, if the video was uploaded with streaming support.
+
+ date (:py:obj:`~datetime.datetime`, *optional*):
+ Date the video was sent.
+
+ thumbs (List of :obj:`~pyrogram.types.Thumbnail`, *optional*):
+ Video thumbnails.
+
+ """
+
+ def __init__(
+ self,
+ *,
+ client: "pyrogram.Client" = None,
+ file_id: str,
+ file_unique_id: str,
+ width: int,
+ height: int,
+ codec: str,
+ duration: int,
+ file_name: str = None,
+ mime_type: str = None,
+ file_size: int = None,
+ supports_streaming: bool = None,
+ date: datetime = None,
+ thumbs: List["types.Thumbnail"] = None
+ ):
+ super().__init__(client)
+
+ self.file_id = file_id
+ self.file_unique_id = file_unique_id
+ self.width = width
+ self.height = height
+ self.codec = codec
+ self.duration = duration
+ self.file_name = file_name
+ self.mime_type = mime_type
+ self.file_size = file_size
+ self.supports_streaming = supports_streaming
+ self.date = date
+ self.thumbs = thumbs
+
+ @staticmethod
+ def _parse(
+ client,
+ video: "raw.types.Document",
+ video_attributes: "raw.types.DocumentAttributeVideo",
+ file_name: str
+ ) -> "AlternativeVideo":
+ return AlternativeVideo(
+ file_id=FileId(
+ file_type=FileType.VIDEO,
+ dc_id=video.dc_id,
+ media_id=video.id,
+ access_hash=video.access_hash,
+ file_reference=video.file_reference
+ ).encode() if video else None,
+ file_unique_id=FileUniqueId(
+ file_unique_type=FileUniqueType.DOCUMENT,
+ media_id=video.id
+ ).encode() if video else None,
+ width=video_attributes.w if video_attributes else None,
+ height=video_attributes.h if video_attributes else None,
+ codec=video_attributes.video_codec if video_attributes else None,
+ duration=video_attributes.duration if video_attributes else None,
+ file_name=file_name,
+ mime_type=video.mime_type if video else None,
+ supports_streaming=video_attributes.supports_streaming if video_attributes else None,
+ file_size=video.size if video else None,
+ date=utils.timestamp_to_datetime(video.date) if video else None,
+ thumbs=types.Thumbnail._parse(client, video) if video else None,
+ client=client
+ )
diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py
index 4fbd57ef..2daf4e9a 100644
--- a/pyrogram/types/messages_and_media/message.py
+++ b/pyrogram/types/messages_and_media/message.py
@@ -628,6 +628,7 @@ class Message(Object, Update):
self.invoice = invoice
self.story = story
self.video = video
+ self.alternative_videos = alternative_videos
self.voice = voice
self.video_note = video_note
self.web_page_preview = web_page_preview
@@ -1055,6 +1056,7 @@ class Message(Object, Update):
voice = None
animation = None
video = None
+ alternative_videos = []
video_note = None
web_page_preview = None
sticker = None
@@ -1122,6 +1124,22 @@ class Message(Object, Update):
video = types.Video._parse(client, doc, video_attributes, file_name, media.ttl_seconds)
media_type = enums.MessageMediaType.VIDEO
has_media_spoiler = media.spoiler
+
+ altdocs = media.alt_documents or []
+ for altdoc in altdocs:
+ if isinstance(altdoc, raw.types.Document):
+ altdoc_attributes = {type(i): i for i in altdoc.attributes}
+
+ altdoc_file_name = getattr(
+ altdoc_attributes.get(
+ raw.types.DocumentAttributeFilename, None
+ ), "file_name", None
+ )
+ altdoc_video_attribute = altdoc_attributes.get(raw.types.DocumentAttributeVideo, None)
+ if altdoc_video_attribute:
+ alternative_videos.append(
+ types.AlternativeVideo._parse(client, altdoc, altdoc_video_attribute, altdoc_file_name)
+ )
elif raw.types.DocumentAttributeAudio in attributes:
audio_attributes = attributes[raw.types.DocumentAttributeAudio]
@@ -1238,6 +1256,7 @@ class Message(Object, Update):
invoice=invoice,
story=story,
video=video,
+ alternative_videos=types.List(alternative_videos) if alternative_videos else None,
video_note=video_note,
web_page_preview=web_page_preview,
sticker=sticker,