4#include <QGlobalStatic>
5#include <QMimeDatabase>
6#include <QStandardPaths>
13#define LOC QString("MimeDB: ")
23 using MimeDesc = std::tuple<QString,QString,MimeMagic,uint,QStringList>;
29 QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
30 QLatin1String(
"mime/packages"),
31 QStandardPaths::LocateDirectory);
32 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
33 QString(
"Standard paths: %1").arg(
paths.join(
", ")));
35 static const std::vector<MimeDesc> s_types =
37 {
"application/cbor",
".cbor", { std::monostate() }, 90, {}},
38 {
"application/x-www-form-urlencoded",
".json", { std::monostate() }, 10, {
"text/plain" }},
39 {
"application/x-plist",
".plist", { QByteArrayLiteral(
"bplist00") }, 50, {}},
40 {
"application/x-apple-binary-plist",
".plist", { QByteArrayLiteral(
"bplist00") }, 50, {}},
41 {
"text/x-apple-plist+xml",
".plist", { QStringLiteral(
"http://www.apple.com/DTDs/PropertyList-1.0.dtd") },
42 50, {
"text/plain",
"application/xml"}}
45 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
46 QString(
"Custom entries: %1").arg(s_types.size()));
48 for (
const auto & [name, suffix, magic, weight, inherits] : s_types)
49 m_mimes.push_back({name, suffix, magic, weight, inherits});
59 auto found = std::ranges::find_if(
m_mimes,
60 [&
Name](
const auto & Mime) {
return Name.compare(Mime.Name(), Qt::CaseInsensitive) == 0; });
69 auto name = FileName.trimmed().toLower();
70 for (
const auto & mime :
m_mimes)
71 if (name.endsWith(mime.m_suffix))
72 result.push_back(mime);
78 auto name = FileName.trimmed().toLower();
79 for (
const auto & mime :
m_mimes)
80 if (name.endsWith(mime.m_suffix))
88 for (
const auto & mime : Types)
90 if (
const auto *
bytes = std::get_if<QByteArray>(&mime.m_magic);
bytes)
92 if (Data.contains(*
bytes) && (mime.m_weight > result.
m_weight))
95 else if (
const auto *
string = std::get_if<QString>(&mime.m_magic);
string)
97 if (QString(Data.constData()).contains(*
string, Qt::CaseInsensitive) && (mime.m_weight > result.
m_weight))
110 if (filtered.size() == 1)
111 return filtered.front();
114 bool wasopen =
Device->isOpen();
116 Device->open(QIODevice::ReadOnly);
134 std::ranges::transform(std::as_const(Types), std::back_inserter(result),
135 [](
const auto& Type) {
return MythMimeType { Type }; });
169 const auto &
mythtv = s_mimeDB->AllTypes();
179 const auto mythtv = s_mimeDB->MimeTypesForFileName(FileName);
180 result.insert(result.cend(),
mythtv.cbegin(),
mythtv.cend());
190 if (
auto result = QMimeDatabase().suffixForFileName(FileName); !result.isEmpty())
192 return s_mimeDB->SuffixForFileName(FileName);
204 if (
auto result = s_mimeDB->MimeTypeForName(
Name); result.IsValid())
206 return QMimeDatabase().mimeTypeForName(
Name);
220 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName, Data); result.isValid())
222 QBuffer buffer(
const_cast<QByteArray*
>(&Data));
223 return s_mimeDB->MimeTypeForFileNameAndData(FileName, &buffer);
228 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName,
Device); result.isValid())
230 return s_mimeDB->MimeTypeForFileNameAndData(FileName,
Device);
A device containing images (ie. USB stick, CD, storage group etc)
A private, internal class that holds custom mime types.
const MythMimeTypes & AllTypes() const
static MythMimeType MagicSearch(const MythMimeTypes &Types, const QByteArray &Data)
QString SuffixForFileName(const QString &FileName) const
MythMimeType MimeTypeForName(const QString &Name) const
static MythMimeTypes ToMythMimeTypes(const QList< QMimeType > &Types)
MythMimeTypes MimeTypesForFileName(const QString &FileName) const
std::tuple< QString, QString, MimeMagic, uint, QStringList > MimeDesc
MythMimeType MimeTypeForFileNameAndData(const QString &FileName, QIODevice *Device) const
A wrapper around QMimeDatabase that supports additional mime types.
static MythMimeTypes MimeTypesForFileName(const QString &FileName)
Return a vector of mime types that match the given filename.
static QString SuffixForFileName(const QString &FileName)
Return the preferred suffix for the given filename.
static MythMimeType MimeTypeForName(const QString &Name)
Return a mime type that matches the given name.
static MythMimeTypes AllTypes()
Return a vector containing all of the known types (both Qt and MythTV)
static MythMimeType MimeTypeForFileNameAndData(const QString &FileName, const QByteArray &Data)
Return a mime type for the given FileName and data.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
static constexpr qint64 PEEK_SIZE
std::vector< MythMimeType > MythMimeTypes