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()));
47 m_mimes.reserve(s_types.size());
49 for (
const auto & [name, suffix, magic, weight, inherits] : s_types)
50 m_mimes.push_back({name, suffix, magic, weight, inherits});
60 auto found = std::ranges::find_if(
m_mimes,
61 [&
Name](
const auto & Mime) {
return Name.compare(Mime.Name(), Qt::CaseInsensitive) == 0; });
70 auto name = FileName.trimmed().toLower();
71 for (
const auto & mime :
m_mimes)
72 if (name.endsWith(mime.m_suffix))
73 result.push_back(mime);
79 auto name = FileName.trimmed().toLower();
80 for (
const auto & mime :
m_mimes)
81 if (name.endsWith(mime.m_suffix))
89 for (
const auto & mime : Types)
91 if (
const auto *
bytes = std::get_if<QByteArray>(&mime.m_magic);
bytes)
93 if (Data.contains(*
bytes) && (mime.m_weight > result.
m_weight))
96 else if (
const auto *
string = std::get_if<QString>(&mime.m_magic);
string)
98 if (QString(Data.constData()).contains(*
string, Qt::CaseInsensitive) && (mime.m_weight > result.
m_weight))
111 if (filtered.size() == 1)
112 return filtered.front();
115 bool wasopen =
Device->isOpen();
117 Device->open(QIODevice::ReadOnly);
135 std::ranges::transform(std::as_const(Types), std::back_inserter(result),
136 [](
const auto& Type) {
return MythMimeType { Type }; });
170 const auto &
mythtv = s_mimeDB->AllTypes();
180 const auto mythtv = s_mimeDB->MimeTypesForFileName(FileName);
181 result.insert(result.cend(),
mythtv.cbegin(),
mythtv.cend());
191 if (
auto result = QMimeDatabase().suffixForFileName(FileName); !result.isEmpty())
193 return s_mimeDB->SuffixForFileName(FileName);
205 if (
auto result = s_mimeDB->MimeTypeForName(
Name); result.IsValid())
207 return QMimeDatabase().mimeTypeForName(
Name);
221 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName, Data); result.isValid())
223 QBuffer buffer(
const_cast<QByteArray*
>(&Data));
224 return s_mimeDB->MimeTypeForFileNameAndData(FileName, &buffer);
229 if (
auto result = QMimeDatabase().mimeTypeForFileNameAndData(FileName,
Device); result.isValid())
231 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