4 #include <QGlobalStatic>
5 #include <QMimeDatabase>
6 #include <QStandardPaths>
12 #define LOC QString("MimeDB: ")
22 using MimeDesc = std::tuple<QString,QString,MimeMagic,uint,QStringList>;
28 QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
29 QLatin1String(
"mime/packages"),
30 QStandardPaths::LocateDirectory);
31 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
32 QString(
"Standard paths: %1").arg(
paths.join(
", ")));
34 static const std::vector<MimeDesc> s_types =
36 {
"application/cbor",
".cbor", { std::monostate() }, 90, {}},
37 {
"application/x-www-form-urlencoded",
".json", { std::monostate() }, 10, {
"text/plain" }},
38 {
"application/x-plist",
".plist", { QByteArrayLiteral(
"bplist00") }, 50, {}},
39 {
"application/x-apple-binary-plist",
".plist", { QByteArrayLiteral(
"bplist00") }, 50, {}},
40 {
"text/x-apple-plist+xml",
".plist", { QStringLiteral(
"http://www.apple.com/DTDs/PropertyList-1.0.dtd") },
41 50, {
"text/plain",
"application/xml"}}
44 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
45 QString(
"Custom entries: %1").arg(s_types.size()));
47 for (
const auto & [name, suffix, magic, weight, inherits] : s_types)
48 m_mimes.push_back({name, suffix, magic, weight, inherits});
59 [&
Name](
const auto & Mime) { return Name.compare(Mime.Name(), Qt::CaseInsensitive) == 0; });
68 auto name = FileName.trimmed().toLower();
69 for (
const auto & mime :
m_mimes)
70 if (name.endsWith(mime.m_suffix))
71 result.push_back(mime);
77 auto name = FileName.trimmed().toLower();
78 for (
const auto & mime :
m_mimes)
79 if (name.endsWith(mime.m_suffix))
87 for (
const auto & mime : Types)
89 if (
const auto *
bytes = std::get_if<QByteArray>(&mime.m_magic);
bytes)
91 if (Data.contains(*
bytes) && (mime.m_weight > result.
m_weight))
94 else if (
const auto *
string = std::get_if<QString>(&mime.m_magic);
string)
96 if (QString(Data.constData()).contains(*
string, Qt::CaseInsensitive) && (mime.m_weight > result.
m_weight))
109 if (filtered.size() == 1)
110 return filtered.front();
113 bool wasopen =
Device->isOpen();
115 Device->open(QIODevice::ReadOnly);
133 std::transform(Types.cbegin(), Types.cend(), std::back_inserter(result),
134 [](
const auto& Type) { return MythMimeType { Type }; });
168 const auto &
mythtv = s_mimeDB->AllTypes();
178 const auto mythtv = s_mimeDB->MimeTypesForFileName(FileName);
179 result.insert(result.cend(),
mythtv.cbegin(),
mythtv.cend());
189 if (
auto result = QMimeDatabase().suffixForFileName(FileName); !result.isEmpty())
191 return s_mimeDB->SuffixForFileName(FileName);
203 if (
auto result = s_mimeDB->MimeTypeForName(
Name); result.IsValid())
205 return QMimeDatabase().mimeTypeForName(
Name);
219 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName, Data); result.isValid())
221 QBuffer buffer(
const_cast<QByteArray*
>(&Data));
222 return s_mimeDB->MimeTypeForFileNameAndData(FileName, &buffer);
227 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName,
Device); result.isValid())
229 return s_mimeDB->MimeTypeForFileNameAndData(FileName,
Device);