diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index 2bf1a0104..9c25a7861 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -484,13 +484,13 @@ void DocumentData::setattributes( || type == AnimatedDocument || type == RoundVideoDocument || isAnimation()) { - if (_nameType != Type::Video) { + if (!enforceNameType(Type::Video)) { type = FileDocument; _additional = nullptr; } } if (type == SongDocument || type == VoiceDocument || isAudioFile()) { - if (_nameType != Type::Audio) { + if (!enforceNameType(Type::Audio)) { type = FileDocument; _additional = nullptr; } @@ -951,6 +951,24 @@ void DocumentData::setFileName(const QString &remoteFileName) { _nameType = Core::DetectNameType(_filename); } +bool DocumentData::enforceNameType(Core::NameType nameType) { + if (_nameType == nameType) { + return true; + } + const auto base = _filename.isEmpty() ? u"file"_q : _filename; + const auto mime = Core::MimeTypeForName(mimeString()); + const auto patterns = mime.globPatterns(); + for (const auto &pattern : mime.globPatterns()) { + const auto now = base + QString(pattern).replace('*', QString()); + if (Core::DetectNameType(now) == nameType) { + _filename = now; + _nameType = nameType; + return true; + } + } + return false; +} + void DocumentData::setLoadedInMediaCacheLocation() { _location = Core::FileLocation(); _flags |= Flag::LoadedInMediaCache; diff --git a/Telegram/SourceFiles/data/data_document.h b/Telegram/SourceFiles/data/data_document.h index 299a6caf1..47237b3c4 100644 --- a/Telegram/SourceFiles/data/data_document.h +++ b/Telegram/SourceFiles/data/data_document.h @@ -341,6 +341,7 @@ private: void setMaybeSupportsStreaming(bool supports); void setLoadedInMediaCacheLocation(); void setFileName(const QString &remoteFileName); + bool enforceNameType(Core::NameType nameType); void finishLoad(); void handleLoaderUpdates();