diff --git a/Telegram/SourceFiles/boxes/create_poll_box.cpp b/Telegram/SourceFiles/boxes/create_poll_box.cpp index 3a0dd61a63..9495e04e9f 100644 --- a/Telegram/SourceFiles/boxes/create_poll_box.cpp +++ b/Telegram/SourceFiles/boxes/create_poll_box.cpp @@ -1762,6 +1762,8 @@ object_ptr CreatePollBox::setupContent() { const auto displayName = file.displayName.isEmpty() ? QFileInfo(file.path).fileName() : file.displayName; + auto audioAttributes = PollMediaUpload::ExtractAudioAttributes(file); + const auto isAudio = !audioAttributes.isEmpty(); const auto token = ++media->token; media->media = PollMedia(); media->thumbnail = std::make_shared( @@ -1790,11 +1792,12 @@ object_ptr CreatePollBox::setupContent() { .caption = TextWithTags(), .spoiler = false, .album = nullptr, - .forceFile = true, + .forceFile = !isAudio, .idOverride = 0, .displayName = displayName, }, - [=](std::shared_ptr prepared) { + [=, attributes = std::move(audioAttributes)]( + std::shared_ptr prepared) { if ((media->token != token) || !prepared) { if (media->token == token) { setMedia(media, PollMedia(), nullptr, false); @@ -1810,6 +1813,8 @@ object_ptr CreatePollBox::setupContent() { .token = token, .filename = prepared->filename, .filemime = prepared->filemime, + .attributes = attributes, + .forceFile = !isAudio, }); media->uploadDataId = prepared->id; _controller->session().uploader().upload( diff --git a/Telegram/SourceFiles/poll/poll_media_upload.cpp b/Telegram/SourceFiles/poll/poll_media_upload.cpp index b5dc83441d..b25f0d71b6 100644 --- a/Telegram/SourceFiles/poll/poll_media_upload.cpp +++ b/Telegram/SourceFiles/poll/poll_media_upload.cpp @@ -111,6 +111,28 @@ bool ValidateFileDragData(not_null data) { return (urls.size() == 1) && urls.front().isLocalFile(); } +QVector ExtractAudioAttributes( + const Ui::PreparedFile &file) { + auto result = QVector(); + if (!file.information) { + return result; + } + const auto song = std::get_if( + &file.information->media); + if (!song) { + return result; + } + const auto seconds = song->duration / 1000; + using Flag = MTPDdocumentAttributeAudio::Flag; + result.push_back(MTP_documentAttributeAudio( + MTP_flags(Flag::f_title | Flag::f_performer), + MTP_int(seconds), + MTP_string(song->title), + MTP_string(song->performer), + MTPstring())); + return result; +} + Ui::PreparedList FileListFromMimeData( not_null data, bool premium) { @@ -725,6 +747,8 @@ void PollMediaUploader::startDocumentUpload( const auto displayName = file.displayName.isEmpty() ? QFileInfo(file.path).fileName() : file.displayName; + auto audioAttributes = ExtractAudioAttributes(file); + const auto isAudio = !audioAttributes.isEmpty(); const auto token = ++media->token; media->media = PollMedia(); media->thumbnail = std::make_shared( @@ -752,11 +776,12 @@ void PollMediaUploader::startDocumentUpload( .caption = TextWithTags(), .spoiler = false, .album = nullptr, - .forceFile = true, + .forceFile = !isAudio, .idOverride = 0, .displayName = displayName, }, - [=](std::shared_ptr prepared) { + [=, attributes = std::move(audioAttributes)]( + std::shared_ptr prepared) { if ((media->token != token) || !prepared) { if (media->token == token) { setMedia(media, PollMedia(), nullptr, false); @@ -772,6 +797,8 @@ void PollMediaUploader::startDocumentUpload( .token = token, .filename = prepared->filename, .filemime = prepared->filemime, + .attributes = attributes, + .forceFile = !isAudio, }); media->uploadDataId = prepared->id; _session->uploader().upload(uploadId, prepared); diff --git a/Telegram/SourceFiles/poll/poll_media_upload.h b/Telegram/SourceFiles/poll/poll_media_upload.h index af16b2efb8..5a75f8e7bd 100644 --- a/Telegram/SourceFiles/poll/poll_media_upload.h +++ b/Telegram/SourceFiles/poll/poll_media_upload.h @@ -65,6 +65,9 @@ private: const QString &filename, int size); +[[nodiscard]] QVector ExtractAudioAttributes( + const Ui::PreparedFile &file); + [[nodiscard]] bool ValidateFileDragData(not_null data); [[nodiscard]] Ui::PreparedList FileListFromMimeData(