From 23ae638512959032f842ae85b823f4ee6af57c10 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Jan 2025 14:00:20 +0400 Subject: [PATCH] Parse video cover photos. --- Telegram/SourceFiles/data/data_media_types.cpp | 11 +++++++++++ Telegram/SourceFiles/data/data_media_types.h | 4 ++++ Telegram/SourceFiles/history/history_item.cpp | 8 +++++++- .../history/view/media/history_view_gif.cpp | 5 ++++- .../SourceFiles/history/view/media/history_view_gif.h | 1 + .../history/view/media/history_view_web_page.cpp | 1 + .../settings/settings_credits_graphics.cpp | 1 + 7 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index fa9049262..48715a0c4 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -553,6 +553,10 @@ DocumentData *Media::document() const { return nullptr; } +PhotoData *Media::videoCover() const { + return nullptr; +} + bool Media::hasQualitiesList() const { return false; } @@ -969,12 +973,14 @@ std::unique_ptr MediaPhoto::createView( MediaFile::MediaFile( not_null parent, not_null document, + PhotoData *videoCover, bool skipPremiumEffect, bool hasQualitiesList, bool spoiler, crl::time ttlSeconds) : Media(parent) , _document(document) +, _videoCover(videoCover) , _emoji(document->sticker() ? document->sticker()->alt : QString()) , _skipPremiumEffect(skipPremiumEffect) , _hasQualitiesList(hasQualitiesList) @@ -1006,6 +1012,7 @@ std::unique_ptr MediaFile::clone(not_null parent) { return std::make_unique( parent, _document, + _videoCover, !_document->session().premium(), _hasQualitiesList, _spoiler, @@ -1016,6 +1023,10 @@ DocumentData *MediaFile::document() const { return _document; } +PhotoData *MediaFile::videoCover() const { + return _videoCover; +} + bool MediaFile::hasQualitiesList() const { return _hasQualitiesList; } diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index f190e1035..4dd246ea0 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -179,6 +179,7 @@ public: virtual std::unique_ptr clone(not_null parent) = 0; virtual DocumentData *document() const; + virtual PhotoData *videoCover() const; virtual bool hasQualitiesList() const; virtual PhotoData *photo() const; virtual WebPageData *webpage() const; @@ -301,6 +302,7 @@ public: MediaFile( not_null parent, not_null document, + PhotoData *videoCover, bool skipPremiumEffect, bool hasQualitiesList, bool spoiler, @@ -310,6 +312,7 @@ public: std::unique_ptr clone(not_null parent) override; DocumentData *document() const override; + PhotoData *videoCover() const override; bool hasQualitiesList() const override; bool uploading() const override; @@ -339,6 +342,7 @@ public: private: not_null _document; + PhotoData *_videoCover = nullptr; QString _emoji; bool _skipPremiumEffect = false; bool _hasQualitiesList = false; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index b589f482f..fc07cf5d4 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -303,9 +303,13 @@ std::unique_ptr HistoryItem::CreateMedia( } return document->match([&](const MTPDdocument &document) -> Result { const auto list = media.valt_documents(); + const auto owner = &item->history()->owner(); return std::make_unique( item, - item->history()->owner().processDocument(document, list), + owner->processDocument(document, list), + (media.vvideo_cover() + ? owner->processPhoto(*media.vvideo_cover()).get() + : nullptr), media.is_nopremium(), list && !list->v.isEmpty(), media.is_spoiler(), @@ -659,6 +663,7 @@ HistoryItem::HistoryItem( _media = std::make_unique( this, document, + /*videoCover=*/nullptr, skipPremiumEffect, video && !video->qualities.empty(), spoiler, @@ -1855,6 +1860,7 @@ void HistoryItem::setStoryFields(not_null story) { _media = std::make_unique( this, document, + /*videoCover=*/nullptr, /*skipPremiumEffect=*/false, /*hasQualitiesList=*/false, spoiler, diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 389ffa189..c6ef0f197 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -150,7 +150,8 @@ Gif::Gif( ? std::make_unique() : nullptr) , _downloadSize(Ui::FormatSizeText(_data->size)) -, _sensitiveSpoiler(realParent->isMediaSensitive()) { +, _sensitiveSpoiler(realParent->isMediaSensitive()) +, _hasVideoCover(realParent->media() && realParent->media()->videoCover()) { if (_data->isVideoMessage() && _parent->data()->media()->ttlSeconds()) { if (_spoiler) { _drawTtl = CreateTtlPaintCallback([=] { repaint(); }); @@ -395,6 +396,8 @@ bool Gif::downloadInCorner() const { bool Gif::autoplayEnabled() const { if (_realParent->isSponsored()) { return true; + } else if (_hasVideoCover) { + return false; } return Data::AutoDownload::ShouldAutoPlay( _data->session().settings().autoDownload(), diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.h b/Telegram/SourceFiles/history/view/media/history_view_gif.h index 45edc9ce3..bfe5aca04 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.h +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.h @@ -224,6 +224,7 @@ private: mutable bool _pollingStory : 1 = false; mutable bool _purchasedPriceTag : 1 = false; const bool _sensitiveSpoiler : 1 = false; + const bool _hasVideoCover : 1 = false; }; diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp index 2b248cfe9..d1551af4e 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -81,6 +81,7 @@ constexpr auto kSponsoredUserpicLines = 2; result.push_back(std::make_unique( parent, *document, + /*videoCover=*/nullptr, skipPremiumEffect, hasQualitiesList, spoiler, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 81c3ec3ff..876afcda5 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -313,6 +313,7 @@ void AddViewMediaHandler( fake.push_back(std::make_unique( state->item, owner->document(item.id), + nullptr, // videoCover true, // skipPremiumEffect false, // hasQualitiesList false, // spoiler