# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# 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 <http://www.gnu.org/licenses/>.
from datetime import datetime
from typing import List
import pyrogram
from pyrogram import raw, types, utils
from pyrogram.file_id import FileId, FileType, FileUniqueId, FileUniqueType, ThumbnailSource
from ..object import Object
[docs]
class Photo(Object):
"""A Photo.
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``):
Photo width.
height (``int``):
Photo height.
file_size (``int``):
File size.
date (:py:obj:`~datetime.datetime`):
Date the photo was sent.
ttl_seconds (``int``, *optional*):
Time-to-live seconds, for secret photos.
thumbs (List of :obj:`~pyrogram.types.Thumbnail`, *optional*):
Available thumbnails of this photo.
"""
def __init__(
self,
*,
client: "pyrogram.Client" = None,
file_id: str,
file_unique_id: str,
width: int,
height: int,
file_size: int,
date: datetime,
ttl_seconds: int = 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.file_size = file_size
self.date = date
self.ttl_seconds = ttl_seconds
self.thumbs = thumbs
@staticmethod
def _parse(client, photo: "raw.types.Photo", ttl_seconds: int = None) -> "Photo":
if isinstance(photo, raw.types.Photo):
photos: List[raw.types.PhotoSize] = []
for p in photo.sizes:
if isinstance(p, raw.types.PhotoSize):
photos.append(p)
if isinstance(p, raw.types.PhotoSizeProgressive):
photos.append(
raw.types.PhotoSize(
type=p.type,
w=p.w,
h=p.h,
size=max(p.sizes)
)
)
photos.sort(key=lambda p: p.w * p.h)
main = photos[-1]
return Photo(
file_id=FileId(
file_type=FileType.PHOTO,
dc_id=photo.dc_id,
media_id=photo.id,
access_hash=photo.access_hash,
file_reference=photo.file_reference,
thumbnail_source=ThumbnailSource.THUMBNAIL,
thumbnail_file_type=FileType.PHOTO,
thumbnail_size=main.type,
volume_id=0,
local_id=0
).encode(),
file_unique_id=FileUniqueId(
file_unique_type=FileUniqueType.DOCUMENT,
media_id=photo.id
).encode(),
width=main.w,
height=main.h,
file_size=main.size,
date=utils.timestamp_to_datetime(photo.date),
ttl_seconds=ttl_seconds,
thumbs=types.Thumbnail._parse(client, photo),
client=client
)