1 | /* |
2 | This file is part of KFileMetaData |
3 | SPDX-FileCopyrightText: 2019 Stefan BrĂ¼ns <stefan.bruens@rwth-aachen.de> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.1-or-later |
6 | */ |
7 | |
8 | #include "mimeutils.h" |
9 | |
10 | namespace KFileMetaData { |
11 | namespace MimeUtils { |
12 | |
13 | QMimeType strictMimeType(const QString& filePath, const QMimeDatabase& db) |
14 | { |
15 | auto extensionMimes = db.mimeTypesForFileName(fileName: filePath); |
16 | auto contentMime = db.mimeTypeForFile(fileName: filePath, mode: QMimeDatabase::MatchContent); |
17 | |
18 | if (extensionMimes.contains(t: contentMime)) { |
19 | // content based mime type is one of the types for the file extension, e.g.: |
20 | // *.ogg -> [ audio/ogg, audio/x-vorbis+ogg, ...] |
21 | // content -> audio/x-vorbis+ogg |
22 | return contentMime; |
23 | } |
24 | |
25 | for (const auto &mime : extensionMimes) { |
26 | // check if the content is generic and the extension is more specific, e.g.: |
27 | // *.mkv -> [ video/matroska ] |
28 | // content -> application/matroska |
29 | if (mime.inherits(mimeTypeName: contentMime.name())) { |
30 | return mime; |
31 | } |
32 | } |
33 | // content mime type does not match the extension, trust the content |
34 | return contentMime; |
35 | } |
36 | |
37 | }} // namespace KFileMetaData::MimeUtils |
38 | |