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"