Use small userpic video in dialogs list / chat history.

This commit is contained in:
John Preston 2022-06-03 15:58:02 +04:00
parent 499923b6d3
commit 705753efb2
10 changed files with 186 additions and 94 deletions

View file

@ -115,7 +115,9 @@ void Preload(
: Data::FileOriginUserPhoto(peerToUser(peer->id), photo->id); : Data::FileOriginUserPhoto(peerToUser(peer->id), photo->id);
state->photoPreloads.push_back(photo->createMediaView()); state->photoPreloads.push_back(photo->createMediaView());
if (photo->hasVideo()) { if (photo->hasVideo()) {
state->photoPreloads.back()->videoWanted(origin); state->photoPreloads.back()->videoWanted(
Data::PhotoSize::Large,
origin);
} else { } else {
state->photoPreloads.back()->wanted( state->photoPreloads.back()->wanted(
Data::PhotoSize::Large, Data::PhotoSize::Large,

View file

@ -317,7 +317,7 @@ bool ShouldAutoPlay(
not_null<PeerData*> peer, not_null<PeerData*> peer,
not_null<PhotoData*> photo) { not_null<PhotoData*> photo) {
const auto source = SourceFromPeer(peer); const auto source = SourceFromPeer(peer);
const auto size = photo->videoByteSize(); const auto size = photo->videoByteSize(PhotoSize::Large);
return photo->hasVideo() return photo->hasVideo()
&& (data.shouldDownload(source, Type::AutoPlayGIF, size) && (data.shouldDownload(source, Type::AutoPlayGIF, size)
|| data.shouldDownload(source, Type::AutoPlayVideo, size) || data.shouldDownload(source, Type::AutoPlayVideo, size)

View file

@ -51,7 +51,7 @@ PhotoData::~PhotoData() {
for (auto &image : _images) { for (auto &image : _images) {
base::take(image.loader).reset(); base::take(image.loader).reset();
} }
base::take(_video.loader).reset(); base::take(_videoSizes);
} }
Data::Session &PhotoData::owner() const { Data::Session &PhotoData::owner() const {
@ -369,7 +369,8 @@ void PhotoData::updateImages(
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime) { crl::time videoStartTime) {
if (!inlineThumbnailBytes.isEmpty() if (!inlineThumbnailBytes.isEmpty()
&& _inlineThumbnailBytes.isEmpty()) { && _inlineThumbnailBytes.isEmpty()) {
@ -399,15 +400,28 @@ void PhotoData::updateImages(
update(PhotoSize::Thumbnail, thumbnail); update(PhotoSize::Thumbnail, thumbnail);
update(PhotoSize::Large, large); update(PhotoSize::Large, large);
if (video.location.valid()) { if (!videoLarge.location.valid()) {
_videoStartTime = videoStartTime; _videoSizes = nullptr;
} else {
if (!_videoSizes) {
_videoSizes = std::make_unique<VideoSizes>();
}
_videoSizes->startTime = videoStartTime;
constexpr auto large = PhotoSize::Large;
constexpr auto small = PhotoSize::Small;
Data::UpdateCloudFile(
_videoSizes->large,
videoLarge,
owner().cache(),
Data::kAnimationCacheTag,
[&](Data::FileOrigin origin) { loadVideo(large, origin); });
Data::UpdateCloudFile(
_videoSizes->small,
videoSmall,
owner().cache(),
Data::kAnimationCacheTag,
[&](Data::FileOrigin origin) { loadVideo(small, origin); });
} }
Data::UpdateCloudFile(
_video,
video,
owner().cache(),
Data::kAnimationCacheTag,
[&](Data::FileOrigin origin) { loadVideo(origin); });
} }
[[nodiscard]] bool PhotoData::hasAttachedStickers() const { [[nodiscard]] bool PhotoData::hasAttachedStickers() const {
@ -426,34 +440,55 @@ int PhotoData::height() const {
return _images[PhotoSizeIndex(PhotoSize::Large)].location.height(); return _images[PhotoSizeIndex(PhotoSize::Large)].location.height();
} }
Data::CloudFile &PhotoData::videoFile(PhotoSize size) {
Expects(_videoSizes != nullptr);
return (size == PhotoSize::Small)
? _videoSizes->small
: _videoSizes->large;
}
const Data::CloudFile &PhotoData::videoFile(PhotoSize size) const {
Expects(_videoSizes != nullptr);
return (size == PhotoSize::Small)
? _videoSizes->small
: _videoSizes->large;
}
bool PhotoData::hasVideo() const { bool PhotoData::hasVideo() const {
return _video.location.valid(); return _videoSizes != nullptr;
} }
bool PhotoData::videoLoading() const { bool PhotoData::videoLoading(Data::PhotoSize size) const {
return _video.loader != nullptr; return _videoSizes && videoFile(size).loader != nullptr;
} }
bool PhotoData::videoFailed() const { bool PhotoData::videoFailed(Data::PhotoSize size) const {
return (_video.flags & Data::CloudFile::Flag::Failed); return _videoSizes
&& (videoFile(size).flags & Data::CloudFile::Flag::Failed);
} }
void PhotoData::loadVideo(Data::FileOrigin origin) { void PhotoData::loadVideo(Data::PhotoSize size, Data::FileOrigin origin) {
if (!_videoSizes) {
return;
}
const auto autoLoading = false; const auto autoLoading = false;
const auto finalCheck = [=] { const auto finalCheck = [=] {
if (const auto active = activeMediaView()) { if (const auto active = activeMediaView()) {
return active->videoContent().isEmpty(); return active->videoContent(size).isEmpty();
} }
return true; return true;
}; };
const auto done = [=](QByteArray result) { const auto done = [=](QByteArray result) {
if (const auto active = activeMediaView()) { if (const auto active = activeMediaView()) {
active->setVideo(std::move(result)); active->setVideo(size, std::move(result));
} }
}; };
Data::LoadCloudFile( Data::LoadCloudFile(
&session(), &session(),
_video, videoFile(size),
origin, origin,
LoadFromCloudOrLocal, LoadFromCloudOrLocal,
autoLoading, autoLoading,
@ -462,12 +497,27 @@ void PhotoData::loadVideo(Data::FileOrigin origin) {
done); done);
} }
const ImageLocation &PhotoData::videoLocation() const { const ImageLocation &PhotoData::videoLocation(Data::PhotoSize size) const {
return _video.location; static const auto empty = ImageLocation();
return _videoSizes ? videoFile(size).location : empty;
} }
int PhotoData::videoByteSize() const { int PhotoData::videoByteSize(Data::PhotoSize size) const {
return _video.byteSize; return _videoSizes ? videoFile(size).byteSize : 0;
}
crl::time PhotoData::videoStartPosition() const {
return _videoSizes ? _videoSizes->startTime : crl::time(0);
}
void PhotoData::setVideoPlaybackFailed() {
if (_videoSizes) {
_videoSizes->playbackFailed = true;
}
}
bool PhotoData::videoPlaybackFailed() const {
return _videoSizes && _videoSizes->playbackFailed;
} }
bool PhotoData::videoCanBePlayed() const { bool PhotoData::videoCanBePlayed() const {
@ -481,17 +531,19 @@ auto PhotoData::createStreamingLoader(
if (!hasVideo()) { if (!hasVideo()) {
return nullptr; return nullptr;
} }
constexpr auto large = PhotoSize::Large;
if (!forceRemoteLoader) { if (!forceRemoteLoader) {
const auto media = activeMediaView(); const auto media = activeMediaView();
if (media && !media->videoContent().isEmpty()) { const auto bytes = media ? media->videoContent(large) : QByteArray();
return Media::Streaming::MakeBytesLoader(media->videoContent()); if (media && !bytes.isEmpty()) {
return Media::Streaming::MakeBytesLoader(bytes);
} }
} }
return v::is<StorageFileLocation>(videoLocation().file().data) return v::is<StorageFileLocation>(videoLocation(large).file().data)
? std::make_unique<Media::Streaming::LoaderMtproto>( ? std::make_unique<Media::Streaming::LoaderMtproto>(
&session().downloader(), &session().downloader(),
v::get<StorageFileLocation>(videoLocation().file().data), v::get<StorageFileLocation>(videoLocation(large).file().data),
videoByteSize(), videoByteSize(large),
origin) origin)
: nullptr; : nullptr;
} }

View file

@ -93,7 +93,8 @@ public:
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime); crl::time videoStartTime);
[[nodiscard]] int validSizeIndex(Data::PhotoSize size) const; [[nodiscard]] int validSizeIndex(Data::PhotoSize size) const;
[[nodiscard]] int existingSizeIndex(Data::PhotoSize size) const; [[nodiscard]] int existingSizeIndex(Data::PhotoSize size) const;
@ -126,20 +127,15 @@ public:
[[nodiscard]] int imageByteSize(Data::PhotoSize size) const; [[nodiscard]] int imageByteSize(Data::PhotoSize size) const;
[[nodiscard]] bool hasVideo() const; [[nodiscard]] bool hasVideo() const;
[[nodiscard]] bool videoLoading() const; [[nodiscard]] bool videoLoading(Data::PhotoSize size) const;
[[nodiscard]] bool videoFailed() const; [[nodiscard]] bool videoFailed(Data::PhotoSize size) const;
void loadVideo(Data::FileOrigin origin); void loadVideo(Data::PhotoSize size, Data::FileOrigin origin);
[[nodiscard]] const ImageLocation &videoLocation() const; [[nodiscard]] const ImageLocation &videoLocation(
[[nodiscard]] int videoByteSize() const; Data::PhotoSize size) const;
[[nodiscard]] crl::time videoStartPosition() const { [[nodiscard]] int videoByteSize(Data::PhotoSize size) const;
return _videoStartTime; [[nodiscard]] crl::time videoStartPosition() const;
} void setVideoPlaybackFailed();
void setVideoPlaybackFailed() { [[nodiscard]] bool videoPlaybackFailed() const;
_videoPlaybackFailed = true;
}
[[nodiscard]] bool videoPlaybackFailed() const {
return _videoPlaybackFailed;
}
[[nodiscard]] bool videoCanBePlayed() const; [[nodiscard]] bool videoCanBePlayed() const;
[[nodiscard]] auto createStreamingLoader( [[nodiscard]] auto createStreamingLoader(
Data::FileOrigin origin, Data::FileOrigin origin,
@ -162,11 +158,19 @@ public:
std::unique_ptr<Data::UploadState> uploadingData; std::unique_ptr<Data::UploadState> uploadingData;
private: private:
[[nodiscard]] Data::CloudFile &videoFile(Data::PhotoSize size);
[[nodiscard]] const Data::CloudFile &videoFile(
Data::PhotoSize size) const;
struct VideoSizes {
Data::CloudFile small;
Data::CloudFile large;
crl::time startTime = 0;
bool playbackFailed = false;
};
QByteArray _inlineThumbnailBytes; QByteArray _inlineThumbnailBytes;
std::array<Data::CloudFile, Data::kPhotoSizeCount> _images; std::array<Data::CloudFile, Data::kPhotoSizeCount> _images;
Data::CloudFile _video; std::unique_ptr<VideoSizes> _videoSizes;
crl::time _videoStartTime = 0;
bool _videoPlaybackFailed = false;
int32 _dc = 0; int32 _dc = 0;
uint64 _access = 0; uint64 _access = 0;

View file

@ -117,23 +117,24 @@ void PhotoMedia::set(
_owner->session().notifyDownloaderTaskFinished(); _owner->session().notifyDownloaderTaskFinished();
} }
QByteArray PhotoMedia::videoContent() const { QByteArray PhotoMedia::videoContent(PhotoSize size) const {
return _videoBytes; return (size == PhotoSize::Large) ? _videoBytesLarge : _videoBytesSmall;
} }
QSize PhotoMedia::videoSize() const { QSize PhotoMedia::videoSize(PhotoSize size) const {
const auto &location = _owner->videoLocation(); const auto &location = _owner->videoLocation(size);
return { location.width(), location.height() }; return { location.width(), location.height() };
} }
void PhotoMedia::videoWanted(Data::FileOrigin origin) { void PhotoMedia::videoWanted(PhotoSize size, Data::FileOrigin origin) {
if (_videoBytes.isEmpty()) { if (videoContent(size).isEmpty()) {
_owner->loadVideo(origin); _owner->loadVideo(size, origin);
} }
} }
void PhotoMedia::setVideo(QByteArray content) { void PhotoMedia::setVideo(PhotoSize size, QByteArray content) {
_videoBytes = std::move(content); ((size == PhotoSize::Large) ? _videoBytesLarge : _videoBytesSmall)
= std::move(content);
} }
bool PhotoMedia::loaded() const { bool PhotoMedia::loaded() const {
@ -191,16 +192,17 @@ void PhotoMedia::collectLocalData(not_null<PhotoMedia*> local) {
} }
bool PhotoMedia::saveToFile(const QString &path) { bool PhotoMedia::saveToFile(const QString &path) {
if (const auto video = videoContent(); !video.isEmpty()) { constexpr auto large = PhotoSize::Large;
if (const auto video = videoContent(large); !video.isEmpty()) {
QFile f(path); QFile f(path);
return f.open(QIODevice::WriteOnly) return f.open(QIODevice::WriteOnly)
&& (f.write(video) == video.size()); && (f.write(video) == video.size());
} else if (const auto photo = imageBytes(Data::PhotoSize::Large) } else if (const auto photo = imageBytes(large)
; !photo.isEmpty()) { ; !photo.isEmpty()) {
QFile f(path); QFile f(path);
return f.open(QIODevice::WriteOnly) return f.open(QIODevice::WriteOnly)
&& (f.write(photo) == photo.size()); && (f.write(photo) == photo.size());
} else if (const auto fallback = image(Data::PhotoSize::Large)->original() } else if (const auto fallback = image(large)->original()
; !fallback.isNull()) { ; !fallback.isNull()) {
return fallback.save(path, "JPG"); return fallback.save(path, "JPG");
} }

View file

@ -33,10 +33,10 @@ public:
QImage image, QImage image,
QByteArray bytes); QByteArray bytes);
[[nodiscard]] QByteArray videoContent() const; [[nodiscard]] QByteArray videoContent(PhotoSize size) const;
[[nodiscard]] QSize videoSize() const; [[nodiscard]] QSize videoSize(PhotoSize size) const;
void videoWanted(Data::FileOrigin origin); void videoWanted(PhotoSize size, Data::FileOrigin origin);
void setVideo(QByteArray content); void setVideo(PhotoSize size, QByteArray content);
[[nodiscard]] bool loaded() const; [[nodiscard]] bool loaded() const;
[[nodiscard]] float64 progress() const; [[nodiscard]] float64 progress() const;
@ -64,7 +64,8 @@ private:
const not_null<PhotoData*> _owner; const not_null<PhotoData*> _owner;
mutable std::unique_ptr<Image> _inlineThumbnail; mutable std::unique_ptr<Image> _inlineThumbnail;
std::array<PhotoImage, kPhotoSizeCount> _images; std::array<PhotoImage, kPhotoSizeCount> _images;
QByteArray _videoBytes; QByteArray _videoBytesSmall;
QByteArray _videoBytesLarge;
}; };

View file

@ -2478,6 +2478,7 @@ not_null<PhotoData*> Session::processPhoto(
thumbnail, thumbnail,
large, large,
ImageWithLocation{}, ImageWithLocation{},
ImageWithLocation{},
crl::time(0)); crl::time(0));
}, [&](const MTPDphotoEmpty &data) { }, [&](const MTPDphotoEmpty &data) {
return photo(data.vid().v); return photo(data.vid().v);
@ -2495,7 +2496,8 @@ not_null<PhotoData*> Session::photo(
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime) { crl::time videoStartTime) {
const auto result = photo(id); const auto result = photo(id);
photoApplyFields( photoApplyFields(
@ -2509,7 +2511,8 @@ not_null<PhotoData*> Session::photo(
small, small,
thumbnail, thumbnail,
large, large,
video, videoSmall,
videoLarge,
videoStartTime); videoStartTime);
return result; return result;
} }
@ -2560,6 +2563,7 @@ PhotoData *Session::photoFromWeb(
ImageWithLocation{ .location = thumbnailLocation }, ImageWithLocation{ .location = thumbnailLocation },
ImageWithLocation{ .location = large }, ImageWithLocation{ .location = large },
ImageWithLocation{}, ImageWithLocation{},
ImageWithLocation{},
crl::time(0)); crl::time(0));
} }
@ -2612,9 +2616,10 @@ void Session::photoApplyFields(
? ImageWithLocation() ? ImageWithLocation()
: Images::FromPhotoSize(_session, data, *i); : Images::FromPhotoSize(_session, data, *i);
}; };
const auto findVideoSize = [&]() -> std::optional<MTPVideoSize> { const auto findVideoSize = [&](PhotoSize size)
-> std::optional<MTPVideoSize> {
const auto sizes = data.vvideo_sizes(); const auto sizes = data.vvideo_sizes();
if (!sizes || sizes->v.isEmpty()) { if (!sizes) {
return std::nullopt; return std::nullopt;
} }
const auto area = [](const MTPVideoSize &size) { const auto area = [](const MTPVideoSize &size) {
@ -2622,18 +2627,28 @@ void Session::photoApplyFields(
return data.vsize().v ? (data.vw().v * data.vh().v) : 0; return data.vsize().v ? (data.vw().v * data.vh().v) : 0;
}); });
}; };
const auto result = *ranges::max_element( const auto type = [](const MTPVideoSize &size) {
sizes->v, return size.match([](const MTPDvideoSize &data) {
std::greater<>(), return data.vtype().v.isEmpty()
area); ? char(0)
return (area(result) > 0) ? std::make_optional(result) : std::nullopt; : data.vtype().v.front();
});
};
const auto result = (size == PhotoSize::Small)
? ranges::find(sizes->v, 'p', type)
: ranges::max_element(sizes->v, std::less<>(), area);
if (result == sizes->v.end() || area(*result) <= 0) {
return std::nullopt;
}
return std::make_optional(*result);
}; };
const auto useProgressive = (progressive != sizes.end()); const auto useProgressive = (progressive != sizes.end());
const auto large = useProgressive const auto large = useProgressive
? Images::FromPhotoSize(_session, data, *progressive) ? Images::FromPhotoSize(_session, data, *progressive)
: image(LargeLevels); : image(LargeLevels);
if (large.location.valid()) { if (large.location.valid()) {
const auto video = findVideoSize(); const auto videoSmall = findVideoSize(PhotoSize::Small);
const auto videoLarge = findVideoSize(PhotoSize::Large);
photoApplyFields( photoApplyFields(
photo, photo,
data.vaccess_hash().v, data.vaccess_hash().v,
@ -2649,12 +2664,15 @@ void Session::photoApplyFields(
? Images::FromProgressiveSize(_session, *progressive, 1) ? Images::FromProgressiveSize(_session, *progressive, 1)
: image(ThumbnailLevels)), : image(ThumbnailLevels)),
large, large,
(video (videoSmall
? Images::FromVideoSize(_session, data, *video) ? Images::FromVideoSize(_session, data, *videoSmall)
: ImageWithLocation()), : ImageWithLocation()),
(video (videoLarge
? VideoStartTime( ? Images::FromVideoSize(_session, data, *videoLarge)
*video->match([](const auto &data) { return &data; })) : ImageWithLocation()),
(videoLarge
? VideoStartTime(*videoLarge->match(
[](const auto &data) { return &data; }))
: 0)); : 0));
} }
} }
@ -2670,7 +2688,8 @@ void Session::photoApplyFields(
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime) { crl::time videoStartTime) {
if (!date) { if (!date) {
return; return;
@ -2683,7 +2702,8 @@ void Session::photoApplyFields(
small, small,
thumbnail, thumbnail,
large, large,
video, videoSmall,
videoLarge,
videoStartTime); videoStartTime);
} }

View file

@ -482,7 +482,8 @@ public:
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime); crl::time videoStartTime);
void photoConvert( void photoConvert(
not_null<PhotoData*> original, not_null<PhotoData*> original,
@ -740,7 +741,8 @@ private:
const ImageWithLocation &small, const ImageWithLocation &small,
const ImageWithLocation &thumbnail, const ImageWithLocation &thumbnail,
const ImageWithLocation &large, const ImageWithLocation &large,
const ImageWithLocation &video, const ImageWithLocation &videoSmall,
const ImageWithLocation &videoLarge,
crl::time videoStartTime); crl::time videoStartTime);
void documentApplyFields( void documentApplyFields(

View file

@ -47,7 +47,9 @@ void VideoUserpic::paintLeft(
_peer->updateFullForced(); _peer->updateFullForced();
} else { } else {
_videoPhotoMedia = photo->createMediaView(); _videoPhotoMedia = photo->createMediaView();
_videoPhotoMedia->videoWanted(_peer->userpicPhotoOrigin()); _videoPhotoMedia->videoWanted(
Data::PhotoSize::Small,
_peer->userpicPhotoOrigin());
} }
} }
if (!_video) { if (!_video) {
@ -55,11 +57,17 @@ void VideoUserpic::paintLeft(
const auto photo = _peer->owner().photo(photoId); const auto photo = _peer->owner().photo(photoId);
if (!photo->isNull()) { if (!photo->isNull()) {
_videoPhotoMedia = photo->createMediaView(); _videoPhotoMedia = photo->createMediaView();
_videoPhotoMedia->videoWanted(_peer->userpicPhotoOrigin()); _videoPhotoMedia->videoWanted(
Data::PhotoSize::Small,
_peer->userpicPhotoOrigin());
} }
} }
if (_videoPhotoMedia) { if (_videoPhotoMedia) {
auto bytes = _videoPhotoMedia->videoContent(); auto small = _videoPhotoMedia->videoContent(
Data::PhotoSize::Small);
auto bytes = small.isEmpty()
? _videoPhotoMedia->videoContent(Data::PhotoSize::Large)
: small;
if (!bytes.isEmpty()) { if (!bytes.isEmpty()) {
auto callback = [=](Media::Clip::Notification notification) { auto callback = [=](Media::Clip::Notification notification) {
clipCallback(notification); clipCallback(notification);

View file

@ -755,7 +755,7 @@ void OverlayWidget::checkForSaveLoaded() {
return; return;
} else if (!_photo } else if (!_photo
|| !_photo->hasVideo() || !_photo->hasVideo()
|| _photoMedia->videoContent().isEmpty()) { || _photoMedia->videoContent(Data::PhotoSize::Large).isEmpty()) {
return; return;
} else if (_savePhotoVideoWhenLoaded == SavePhotoVideo::QuickSave) { } else if (_savePhotoVideoWhenLoaded == SavePhotoVideo::QuickSave) {
_savePhotoVideoWhenLoaded = SavePhotoVideo::None; _savePhotoVideoWhenLoaded = SavePhotoVideo::None;
@ -1647,7 +1647,8 @@ void OverlayWidget::saveAs() {
updateOver(_lastMouseMovePos); updateOver(_lastMouseMovePos);
} }
} else if (_photo && _photo->hasVideo()) { } else if (_photo && _photo->hasVideo()) {
if (const auto bytes = _photoMedia->videoContent(); !bytes.isEmpty()) { constexpr auto large = Data::PhotoSize::Large;
if (const auto bytes = _photoMedia->videoContent(large); !bytes.isEmpty()) {
const auto photo = _photo; const auto photo = _photo;
auto filter = qsl("Video Files (*.mp4);;") + FileDialog::AllFilesFilter(); auto filter = qsl("Video Files (*.mp4);;") + FileDialog::AllFilesFilter();
FileDialog::GetWritePath( FileDialog::GetWritePath(
@ -1669,7 +1670,7 @@ void OverlayWidget::saveAs() {
} }
})); }));
} else { } else {
_photo->loadVideo(fileOrigin()); _photo->loadVideo(large, fileOrigin());
_savePhotoVideoWhenLoaded = SavePhotoVideo::SaveAs; _savePhotoVideoWhenLoaded = SavePhotoVideo::SaveAs;
} }
} else { } else {
@ -1765,7 +1766,7 @@ void OverlayWidget::downloadMedia() {
updateOver(_lastMouseMovePos); updateOver(_lastMouseMovePos);
} }
} else if (_photo && _photo->hasVideo()) { } else if (_photo && _photo->hasVideo()) {
if (!_photoMedia->videoContent().isEmpty()) { if (!_photoMedia->videoContent(Data::PhotoSize::Large).isEmpty()) {
if (!QDir().exists(path)) { if (!QDir().exists(path)) {
QDir().mkpath(path); QDir().mkpath(path);
} }
@ -1774,7 +1775,7 @@ void OverlayWidget::downloadMedia() {
toName = QString(); toName = QString();
} }
} else { } else {
_photo->loadVideo(fileOrigin()); _photo->loadVideo(Data::PhotoSize::Large, fileOrigin());
_savePhotoVideoWhenLoaded = SavePhotoVideo::QuickSave; _savePhotoVideoWhenLoaded = SavePhotoVideo::QuickSave;
} }
} else { } else {
@ -2783,8 +2784,8 @@ void OverlayWidget::initStreamingThumbnail() {
: _photoMedia->thumbnailInline(); : _photoMedia->thumbnailInline();
const auto size = _photo const auto size = _photo
? QSize( ? QSize(
_photo->videoLocation().width(), _photo->videoLocation(Data::PhotoSize::Large).width(),
_photo->videoLocation().height()) _photo->videoLocation(Data::PhotoSize::Large).height())
: good : good
? good->size() ? good->size()
: _document->dimensions; : _document->dimensions;