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

View file

@ -180,6 +180,7 @@ public:
virtual DocumentData *document() const;
virtual PhotoData *videoCover() const;
virtual TimeId videoTimestamp() const;
virtual bool hasQualitiesList() const;
virtual PhotoData *photo() const;
virtual WebPageData *webpage() const;
@ -299,20 +300,26 @@ private:
class MediaFile final : public Media {
public:
struct Args {
crl::time ttlSeconds = 0;
PhotoData *videoCover = nullptr;
TimeId videoTimestamp = 0;
bool hasQualitiesList = false;
bool skipPremiumEffect = false;
bool spoiler = false;
};
MediaFile(
not_null<HistoryItem*> parent,
not_null<DocumentData*> document,
PhotoData *videoCover,
bool skipPremiumEffect,
bool hasQualitiesList,
bool spoiler,
crl::time ttlSeconds);
Args &&args);
~MediaFile();
std::unique_ptr<Media> clone(not_null<HistoryItem*> parent) override;
DocumentData *document() const override;
PhotoData *videoCover() const override;
TimeId videoTimestamp() const override;
bool hasQualitiesList() const override;
bool uploading() const override;
@ -343,14 +350,16 @@ public:
private:
not_null<DocumentData*> _document;
PhotoData *_videoCover = nullptr;
QString _emoji;
bool _skipPremiumEffect = false;
bool _hasQualitiesList = false;
bool _spoiler = false;
// Video (unsupported) / Voice / Round.
crl::time _ttlSeconds = 0;
QString _emoji;
TimeId _videoTimestamp = 0;
bool _skipPremiumEffect = false;
bool _hasQualitiesList = false;
bool _spoiler = false;
};
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 {
const auto list = media.valt_documents();
const auto owner = &item->history()->owner();
return std::make_unique<Data::MediaFile>(
item,
owner->processDocument(document, list),
(media.vvideo_cover()
const auto data = owner->processDocument(document);
using Args = Data::MediaFile::Args;
return std::make_unique<Data::MediaFile>(item, data, Args{
.ttlSeconds = media.vttl_seconds().value_or_empty(),
.videoCover = (media.vvideo_cover()
? owner->processPhoto(*media.vvideo_cover()).get()
: nullptr),
media.is_nopremium(),
list && !list->v.isEmpty(),
media.is_spoiler(),
media.vttl_seconds().value_or_empty());
.videoTimestamp = media.vvideo_timestamp().value_or_empty(),
.hasQualitiesList = list && !list->v.isEmpty(),
.skipPremiumEffect = media.is_nopremium(),
.spoiler = media.is_spoiler(),
});
}, [](const MTPDdocumentEmpty &) -> Result {
return nullptr;
});
@ -657,17 +659,12 @@ HistoryItem::HistoryItem(
: HistoryItem(history, fields) {
createComponentsHelper(std::move(fields));
const auto skipPremiumEffect = !history->session().premium();
const auto video = document->video();
const auto spoiler = false;
_media = std::make_unique<Data::MediaFile>(
this,
document,
/*videoCover=*/nullptr,
skipPremiumEffect,
video && !video->qualities.empty(),
spoiler,
/*ttlSeconds = */0);
using Args = Data::MediaFile::Args;
_media = std::make_unique<Data::MediaFile>(this, document, Args{
.hasQualitiesList = video && !video->qualities.empty(),
.skipPremiumEffect = !history->session().premium(),
});
setText(caption);
}
@ -1853,18 +1850,12 @@ void HistoryItem::applyChanges(not_null<Data::Story*> story) {
}
void HistoryItem::setStoryFields(not_null<Data::Story*> story) {
const auto spoiler = false;
if (const auto photo = story->photo()) {
const auto spoiler = false;
_media = std::make_unique<Data::MediaPhoto>(this, photo, spoiler);
} else if (const auto document = story->document()) {
_media = std::make_unique<Data::MediaFile>(
this,
document,
/*videoCover=*/nullptr,
/*skipPremiumEffect=*/false,
/*hasQualitiesList=*/false,
spoiler,
/*ttlSeconds = */0);
using Args = Data::MediaFile::Args;
_media = std::make_unique<Data::MediaFile>(this, document, Args{});
}
setText(story->caption());
if (story->pinnedToTop()) {

View file

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

View file

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