File indexing completed on 2024-05-12 15:51:17

0001 // SPDX-FileCopyrightText: 2018 Arjen Hiemstra <ahiemstra@heimr.nl>
0002 // SPDX-FileCopyrightText: 2022 Carl Schwan <carl@carlschwan.eu>
0003 // SPDX-License-Identifier: LGPL-2.1-only or LGPL-3.0-only or LicenseRef-KDE-Accepted-LGPL
0004 
0005 #include "contentquery.h"
0006 
0007 #include <QMimeDatabase>
0008 #include <QtGui/QImageReader>
0009 
0010 class ContentQuery::Private
0011 {
0012 public:
0013     QStringList mimeTypesForType(Type type);
0014 
0015     Type type = Any;
0016     QString searchString;
0017     QStringList locations;
0018     QStringList mimeTypes;
0019 };
0020 
0021 ContentQuery::ContentQuery(QObject *parent)
0022     : QObject(parent)
0023     , d(std::make_unique<Private>())
0024 {
0025 }
0026 
0027 ContentQuery::~ContentQuery()
0028 {
0029 }
0030 
0031 ContentQuery::Type ContentQuery::type() const
0032 {
0033     return d->type;
0034 }
0035 
0036 QString ContentQuery::searchString() const
0037 {
0038     return d->searchString;
0039 }
0040 
0041 QStringList ContentQuery::locations() const
0042 {
0043     return d->locations;
0044 }
0045 
0046 QStringList ContentQuery::mimeTypes() const
0047 {
0048     if (!d->mimeTypes.isEmpty())
0049         return d->mimeTypes;
0050 
0051     return d->mimeTypesForType(d->type);
0052 }
0053 
0054 void ContentQuery::setType(ContentQuery::Type type)
0055 {
0056     if (type == d->type)
0057         return;
0058 
0059     d->type = type;
0060     Q_EMIT typeChanged();
0061 }
0062 
0063 void ContentQuery::setSearchString(const QString &searchString)
0064 {
0065     if (searchString == d->searchString)
0066         return;
0067 
0068     d->searchString = searchString;
0069     Q_EMIT searchStringChanged();
0070 }
0071 
0072 void ContentQuery::setLocations(const QStringList &locations)
0073 {
0074     if (locations == d->locations)
0075         return;
0076 
0077     d->locations = locations;
0078     Q_EMIT locationsChanged();
0079 }
0080 
0081 void ContentQuery::setMimeTypes(const QStringList &mimeTypes)
0082 {
0083     if (mimeTypes == d->mimeTypes)
0084         return;
0085 
0086     d->mimeTypes = mimeTypes;
0087     Q_EMIT mimeTypesChanged();
0088 }
0089 
0090 namespace
0091 {
0092 QStringList contentQueryVideo()
0093 {
0094     return {
0095         QStringLiteral("video/x-matroska"),
0096         QStringLiteral("video/mp4"),
0097         QStringLiteral("video/mpeg"),
0098         QStringLiteral("video/ogg"),
0099         QStringLiteral("video/quicktime"),
0100         QStringLiteral("video/webm"),
0101         QStringLiteral("video/x-ms-wmv"),
0102         QStringLiteral("video/x-msvideo"),
0103         QStringLiteral("video/x-ogm+ogg"),
0104         QStringLiteral("video/x-theora+ogg"),
0105     };
0106 }
0107 
0108 QStringList contentQueryAudio()
0109 {
0110     return {
0111         QStringLiteral("audio/aac"),
0112         QStringLiteral("audio/flac"),
0113         QStringLiteral("audio/mp2"),
0114         QStringLiteral("audio/mp4"),
0115         QStringLiteral("audio/mpeg"),
0116         QStringLiteral("audio/ogg"),
0117         QStringLiteral("audio/webm"),
0118         QStringLiteral("audio/x-opus+ogg"),
0119         QStringLiteral("audio/x-ms-wma"),
0120         QStringLiteral("audio/x-vorbis+ogg"),
0121         QStringLiteral("audio/x-wav"),
0122     };
0123 }
0124 
0125 QStringList contentQueryDocuments()
0126 {
0127     return {
0128         QStringLiteral("application/vnd.oasis.opendocument.text"),
0129         QStringLiteral("application/vnd.oasis.opendocument.spreadsheet"),
0130         QStringLiteral("application/vnd.oasis.opendocument.presentation"),
0131         QStringLiteral("application/vnd.ms-word"),
0132         QStringLiteral("application/vnd.ms-excel"),
0133         QStringLiteral("application/vnd.ms-powerpoint"),
0134         QStringLiteral("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.xml"),
0135         QStringLiteral("application/vnd.openxmlformats-officedocument.wordprocessingml.document.xml"),
0136         QStringLiteral("application/vnd.openxmlformats-officedocument.presentationml.presentation.xml"),
0137         QStringLiteral("text/plain"),
0138         QStringLiteral("application/pdf"),
0139     };
0140 }
0141 
0142 QStringList contentQueryImages()
0143 {
0144     // only popylate once.
0145     static QStringList result;
0146     if (result.isEmpty()) {
0147         const auto mimeTypes = QImageReader::supportedMimeTypes();
0148         for (const auto &item : mimeTypes) {
0149             result << QString::fromUtf8(item);
0150         }
0151     }
0152     return result;
0153 }
0154 
0155 QStringList contentQueryEpub()
0156 {
0157     return {
0158         QStringLiteral("application/epub+zip"),
0159     };
0160 }
0161 
0162 QStringList contentQueryComics()
0163 {
0164     return {
0165         QStringLiteral("application/x-cbz"),
0166         QStringLiteral("application/x-cbr"),
0167         QStringLiteral("application/x-cb7"),
0168         QStringLiteral("application/x-cbt"),
0169         QStringLiteral("application/x-cba"),
0170         QStringLiteral("application/vnd.comicbook+zip"),
0171         QStringLiteral("application/vnd.comicbook+rar"),
0172         QStringLiteral("application/vnd.ms-htmlhelp"),
0173         QStringLiteral("image/vnd.djvu"),
0174         QStringLiteral("image/x-djvu"),
0175         QStringLiteral("application/epub+zip"),
0176         QStringLiteral("application/pdf"),
0177     };
0178 }
0179 }
0180 QStringList ContentQuery::Private::mimeTypesForType(ContentQuery::Type type)
0181 {
0182     switch (type) {
0183     case ContentQuery::Type::Video:
0184         return contentQueryVideo();
0185     case ContentQuery::Type::Audio:
0186         return contentQueryAudio();
0187     case ContentQuery::Type::Documents:
0188         return contentQueryDocuments();
0189     case ContentQuery::Type::Images:
0190         return contentQueryImages();
0191     case ContentQuery::Type::Comics:
0192         return contentQueryComics();
0193     case ContentQuery::Type::Epub:
0194         return contentQueryEpub();
0195     case ContentQuery::Type::Any: /* do nothing */
0196         return {};
0197     }
0198     return {};
0199 }
0200 
0201 #include "moc_contentquery.cpp"