Parse and store video_timestamp.

This commit is contained in:
John Preston 2025-01-24 14:57:23 +04:00
parent 23ae638512
commit b618d1e56a
5 changed files with 71 additions and 72 deletions

View file

@ -557,6 +557,10 @@ PhotoData *Media::videoCover() const {
return nullptr; return nullptr;
} }
TimeId Media::videoTimestamp() const {
return 0;
}
bool Media::hasQualitiesList() const { bool Media::hasQualitiesList() const {
return false; return false;
} }
@ -973,19 +977,16 @@ std::unique_ptr<HistoryView::Media> MediaPhoto::createView(
MediaFile::MediaFile( MediaFile::MediaFile(
not_null<HistoryItem*> parent, not_null<HistoryItem*> parent,
not_null<DocumentData*> document, not_null<DocumentData*> document,
PhotoData *videoCover, Args &&args)
bool skipPremiumEffect,
bool hasQualitiesList,
bool spoiler,
crl::time ttlSeconds)
: Media(parent) : Media(parent)
, _document(document) , _document(document)
, _videoCover(videoCover) , _videoCover(args.videoCover)
, _ttlSeconds(args.ttlSeconds)
, _emoji(document->sticker() ? document->sticker()->alt : QString()) , _emoji(document->sticker() ? document->sticker()->alt : QString())
, _skipPremiumEffect(skipPremiumEffect) , _videoTimestamp(args.videoTimestamp)
, _hasQualitiesList(hasQualitiesList) , _skipPremiumEffect(args.skipPremiumEffect)
, _spoiler(spoiler) , _hasQualitiesList(args.hasQualitiesList)
, _ttlSeconds(ttlSeconds) { , _spoiler(args.spoiler) {
parent->history()->owner().registerDocumentItem(_document, parent); parent->history()->owner().registerDocumentItem(_document, parent);
if (!_emoji.isEmpty()) { if (!_emoji.isEmpty()) {
@ -1009,14 +1010,14 @@ MediaFile::~MediaFile() {
} }
std::unique_ptr<Media> MediaFile::clone(not_null<HistoryItem*> parent) { std::unique_ptr<Media> MediaFile::clone(not_null<HistoryItem*> parent) {
return std::make_unique<MediaFile>( return std::make_unique<MediaFile>(parent, _document, MediaFile::Args{
parent, .ttlSeconds = _ttlSeconds,
_document, .videoCover = _videoCover,
_videoCover, .videoTimestamp = _videoTimestamp,
!_document->session().premium(), .hasQualitiesList = _hasQualitiesList,
_hasQualitiesList, .skipPremiumEffect = !_document->session().premium(),
_spoiler, .spoiler = _spoiler,
_ttlSeconds); });
} }
DocumentData *MediaFile::document() const { DocumentData *MediaFile::document() const {
@ -1027,6 +1028,10 @@ PhotoData *MediaFile::videoCover() const {
return _videoCover; return _videoCover;
} }
TimeId MediaFile::videoTimestamp() const {
return _videoTimestamp;
}
bool MediaFile::hasQualitiesList() const { bool MediaFile::hasQualitiesList() const {
return _hasQualitiesList; return _hasQualitiesList;
} }

View file

@ -180,6 +180,7 @@ public:
virtual DocumentData *document() const; virtual DocumentData *document() const;
virtual PhotoData *videoCover() const; virtual PhotoData *videoCover() const;
virtual TimeId videoTimestamp() const;
virtual bool hasQualitiesList() const; virtual bool hasQualitiesList() const;
virtual PhotoData *photo() const; virtual PhotoData *photo() const;
virtual WebPageData *webpage() const; virtual WebPageData *webpage() const;
@ -299,20 +300,26 @@ private:
class MediaFile final : public Media { class MediaFile final : public Media {
public: public:
struct Args {
crl::time ttlSeconds = 0;
PhotoData *videoCover = nullptr;
TimeId videoTimestamp = 0;
bool hasQualitiesList = false;
bool skipPremiumEffect = false;
bool spoiler = false;
};
MediaFile( MediaFile(
not_null<HistoryItem*> parent, not_null<HistoryItem*> parent,
not_null<DocumentData*> document, not_null<DocumentData*> document,
PhotoData *videoCover, Args &&args);
bool skipPremiumEffect,
bool hasQualitiesList,
bool spoiler,
crl::time ttlSeconds);
~MediaFile(); ~MediaFile();
std::unique_ptr<Media> clone(not_null<HistoryItem*> parent) override; std::unique_ptr<Media> clone(not_null<HistoryItem*> parent) override;
DocumentData *document() const override; DocumentData *document() const override;
PhotoData *videoCover() const override; PhotoData *videoCover() const override;
TimeId videoTimestamp() const override;
bool hasQualitiesList() const override; bool hasQualitiesList() const override;
bool uploading() const override; bool uploading() const override;
@ -343,14 +350,16 @@ public:
private: private:
not_null<DocumentData*> _document; not_null<DocumentData*> _document;
PhotoData *_videoCover = nullptr; PhotoData *_videoCover = nullptr;
QString _emoji;
bool _skipPremiumEffect = false;
bool _hasQualitiesList = false;
bool _spoiler = false;
// Video (unsupported) / Voice / Round. // Video (unsupported) / Voice / Round.
crl::time _ttlSeconds = 0; crl::time _ttlSeconds = 0;
QString _emoji;
TimeId _videoTimestamp = 0;
bool _skipPremiumEffect = false;
bool _hasQualitiesList = false;
bool _spoiler = false;
}; };
class MediaContact final : public Media { class MediaContact final : public Media {

View file

@ -304,16 +304,18 @@ std::unique_ptr<Data::Media> HistoryItem::CreateMedia(
return document->match([&](const MTPDdocument &document) -> Result { return document->match([&](const MTPDdocument &document) -> Result {
const auto list = media.valt_documents(); const auto list = media.valt_documents();
const auto owner = &item->history()->owner(); const auto owner = &item->history()->owner();
return std::make_unique<Data::MediaFile>( const auto data = owner->processDocument(document);
item, using Args = Data::MediaFile::Args;
owner->processDocument(document, list), return std::make_unique<Data::MediaFile>(item, data, Args{
(media.vvideo_cover() .ttlSeconds = media.vttl_seconds().value_or_empty(),
.videoCover = (media.vvideo_cover()
? owner->processPhoto(*media.vvideo_cover()).get() ? owner->processPhoto(*media.vvideo_cover()).get()
: nullptr), : nullptr),
media.is_nopremium(), .videoTimestamp = media.vvideo_timestamp().value_or_empty(),
list && !list->v.isEmpty(), .hasQualitiesList = list && !list->v.isEmpty(),
media.is_spoiler(), .skipPremiumEffect = media.is_nopremium(),
media.vttl_seconds().value_or_empty()); .spoiler = media.is_spoiler(),
});
}, [](const MTPDdocumentEmpty &) -> Result { }, [](const MTPDdocumentEmpty &) -> Result {
return nullptr; return nullptr;
}); });
@ -657,17 +659,12 @@ HistoryItem::HistoryItem(
: HistoryItem(history, fields) { : HistoryItem(history, fields) {
createComponentsHelper(std::move(fields)); createComponentsHelper(std::move(fields));
const auto skipPremiumEffect = !history->session().premium();
const auto video = document->video(); const auto video = document->video();
const auto spoiler = false; using Args = Data::MediaFile::Args;
_media = std::make_unique<Data::MediaFile>( _media = std::make_unique<Data::MediaFile>(this, document, Args{
this, .hasQualitiesList = video && !video->qualities.empty(),
document, .skipPremiumEffect = !history->session().premium(),
/*videoCover=*/nullptr, });
skipPremiumEffect,
video && !video->qualities.empty(),
spoiler,
/*ttlSeconds = */0);
setText(caption); setText(caption);
} }
@ -1853,18 +1850,12 @@ void HistoryItem::applyChanges(not_null<Data::Story*> story) {
} }
void HistoryItem::setStoryFields(not_null<Data::Story*> story) { void HistoryItem::setStoryFields(not_null<Data::Story*> story) {
const auto spoiler = false;
if (const auto photo = story->photo()) { if (const auto photo = story->photo()) {
const auto spoiler = false;
_media = std::make_unique<Data::MediaPhoto>(this, photo, spoiler); _media = std::make_unique<Data::MediaPhoto>(this, photo, spoiler);
} else if (const auto document = story->document()) { } else if (const auto document = story->document()) {
_media = std::make_unique<Data::MediaFile>( using Args = Data::MediaFile::Args;
this, _media = std::make_unique<Data::MediaFile>(this, document, Args{});
document,
/*videoCover=*/nullptr,
/*skipPremiumEffect=*/false,
/*hasQualitiesList=*/false,
spoiler,
/*ttlSeconds = */0);
} }
setText(story->caption()); setText(story->caption());
if (story->pinnedToTop()) { if (story->pinnedToTop()) {

View file

@ -76,16 +76,11 @@ constexpr auto kSponsoredUserpicLines = 2;
const auto spoiler = false; const auto spoiler = false;
for (const auto &item : data.items) { for (const auto &item : data.items) {
if (const auto document = std::get_if<DocumentData*>(&item)) { if (const auto document = std::get_if<DocumentData*>(&item)) {
const auto hasQualitiesList = false; using MediaFile = Data::MediaFile;
const auto skipPremiumEffect = false; using Args = MediaFile::Args;
result.push_back(std::make_unique<Data::MediaFile>( const auto data = *document;
parent, result.push_back(
*document, std::make_unique<Data::MediaFile>(parent, data, Args{}));
/*videoCover=*/nullptr,
skipPremiumEffect,
hasQualitiesList,
spoiler,
/*ttlSeconds = */0));
} else if (const auto photo = std::get_if<PhotoData*>(&item)) { } else if (const auto photo = std::get_if<PhotoData*>(&item)) {
result.push_back(std::make_unique<Data::MediaPhoto>( result.push_back(std::make_unique<Data::MediaPhoto>(
parent, parent,

View file

@ -310,14 +310,13 @@ void AddViewMediaHandler(
owner->photo(item.id), owner->photo(item.id),
false)); // spoiler false)); // spoiler
} else { } else {
fake.push_back(std::make_unique<Data::MediaFile>( const auto document = owner->document(item.id);
state->item, const auto item = state->item;
owner->document(item.id), using MediaFile = Data::MediaFile;
nullptr, // videoCover using Args = MediaFile::Args;
true, // skipPremiumEffect fake.push_back(std::make_unique<MediaFile>(item, document, Args{
false, // hasQualitiesList .skipPremiumEffect = true,
false, // spoiler }));
0)); // ttlSeconds
} }
} }
state->item->overrideMedia(std::make_unique<Data::MediaInvoice>( state->item->overrideMedia(std::make_unique<Data::MediaInvoice>(