diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index f21dad9d42..6884af1c26 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -721,9 +721,7 @@ int DocumentData::thumbnailByteSize() const { } bool DocumentData::hasVideoThumbnail() const { - return _videoThumbnailLocation.valid() - && (_videoThumbnailLocation.width() > 0) - && (_videoThumbnailLocation.height() > 0); + return _videoThumbnailLocation.valid(); } bool DocumentData::videoThumbnailLoading() const { diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 6acdc30274..d29fe9b5cc 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -2482,15 +2482,20 @@ void Session::documentConvert( DocumentData *Session::documentFromWeb( const MTPWebDocument &data, - const ImageLocation &thumbnailLocation) { + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation) { return data.match([&](const auto &data) { - return documentFromWeb(data, thumbnailLocation); + return documentFromWeb( + data, + thumbnailLocation, + videoThumbnailLocation); }); } DocumentData *Session::documentFromWeb( const MTPDwebDocument &data, - const ImageLocation &thumbnailLocation) { + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation) { const auto result = document( rand_value(), uint64(0), @@ -2500,7 +2505,7 @@ DocumentData *Session::documentFromWeb( data.vmime_type().v, QByteArray(), ImageWithLocation{ .location = thumbnailLocation }, - ImageWithLocation(), + ImageWithLocation{ .location = videoThumbnailLocation }, MTP::maindc(), int32(0)); // data.vsize().v result->setWebLocation(WebFileLocation( @@ -2511,7 +2516,8 @@ DocumentData *Session::documentFromWeb( DocumentData *Session::documentFromWeb( const MTPDwebDocumentNoProxy &data, - const ImageLocation &thumbnailLocation) { + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation) { const auto result = document( rand_value(), uint64(0), @@ -2521,7 +2527,7 @@ DocumentData *Session::documentFromWeb( data.vmime_type().v, QByteArray(), ImageWithLocation{ .location = thumbnailLocation }, - ImageWithLocation(), + ImageWithLocation{ .location = videoThumbnailLocation }, MTP::maindc(), int32(0)); // data.vsize().v result->setContentUrl(qs(data.vurl())); diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index c4e6483ec4..aea8a2f6c7 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -508,7 +508,8 @@ public: const MTPDocument &data); [[nodiscard]] DocumentData *documentFromWeb( const MTPWebDocument &data, - const ImageLocation &thumbnailLocation); + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation); [[nodiscard]] not_null webpage(WebPageId id); not_null processWebpage(const MTPWebPage &data); @@ -760,10 +761,12 @@ private: int32 size); DocumentData *documentFromWeb( const MTPDwebDocument &data, - const ImageLocation &thumbnailLocation); + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation); DocumentData *documentFromWeb( const MTPDwebDocumentNoProxy &data, - const ImageLocation &thumbnailLocation); + const ImageLocation &thumbnailLocation, + const ImageLocation &videoThumbnailLocation); void webpageApplyFields( not_null page, diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp index a68ab21d73..d74e0f8eaa 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp @@ -133,11 +133,12 @@ int Gif::resizeGetHeight(int width) { void Gif::paint(Painter &p, const QRect &clip, const PaintContext *context) const { const auto document = getShownDocument(); - const auto displayLoading = document->displayLoading(); ensureDataMediaCreated(document); const auto preview = Data::VideoPreviewState(_dataMedia.get()); preview.automaticLoad(fileOrigin()); + const auto displayLoading = !preview.usingThumbnail() + && document->displayLoading(); const auto loaded = preview.loaded(); const auto loading = preview.loading(); if (loaded diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp index 993d58737d..0408317992 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp @@ -26,6 +26,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace InlineBots { namespace { +const auto kVideoThumbMime = "video/mp4"_q; + QString GetContentUrl(const MTPWebDocument &document) { switch (document.type()) { case mtpc_webDocument: @@ -84,8 +86,19 @@ std::unique_ptr Result::create( result->_title = qs(r.vtitle().value_or_empty()); result->_description = qs(r.vdescription().value_or_empty()); result->_url = qs(r.vurl().value_or_empty()); - if (const auto thumb = r.vthumb()) { - result->_thumb = Images::Create(*thumb, result->thumbBox()); + const auto thumbMime = [&] { + if (const auto thumb = r.vthumb()) { + return thumb->match([&](const auto &data) { + return data.vmime_type().v; + }); + } + return QByteArray(); + }(); + const auto imageThumb = !thumbMime.isEmpty() + && (thumbMime != kVideoThumbMime); + const auto videoThumb = !thumbMime.isEmpty() && !imageThumb; + if (imageThumb) { + result->_thumb = Images::Create(*r.vthumb(), result->thumbBox()); } if (const auto content = r.vcontent()) { result->_content_url = GetContentUrl(*content); @@ -97,7 +110,10 @@ std::unique_ptr Result::create( } else { result->_document = Auth().data().documentFromWeb( result->adjustAttributes(*content), - (r.vthumb() + (imageThumb + ? Images::FromWebDocument(*r.vthumb()) + : ImageLocation()), + (videoThumb ? Images::FromWebDocument(*r.vthumb()) : ImageLocation())); }