File indexing completed on 2024-04-21 04:51:52

0001 /*
0002     SPDX-FileCopyrightText: 2021 Julius Künzel <jk.kdedev@smartlab.uber.space>
0003     SPDX-FileCopyrightText: 2011 Jean-Baptiste Mardelle <jb@kdenlive.org>
0004     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QJsonDocument>
0010 #include <QJsonObject>
0011 #include <QNetworkReply>
0012 #include <QObject>
0013 #include <QPixmap>
0014 #include <QTemporaryFile>
0015 #include <QtNetworkAuth>
0016 
0017 struct ResourceItemInfo
0018 {
0019     QString fileType;
0020     QString name;
0021     QString description;
0022     QString id;
0023     QString infoUrl;
0024     QString license;
0025     QString author;
0026     QString authorUrl;
0027     int width;
0028     int height;
0029     int duration;
0030     QString downloadUrl;
0031     QString filetype;
0032     QStringList downloadUrls;
0033     QStringList downloadLabels;
0034     QString imageUrl;
0035     QString previewUrl;
0036     // int filesize;
0037 };
0038 
0039 class ProviderModel : public QObject
0040 {
0041     Q_OBJECT
0042 public:
0043     enum SERVICETYPE { UNKNOWN = 0, AUDIO = 1, VIDEO = 2, IMAGE = 3 };
0044     ProviderModel() = delete;
0045     ProviderModel(const QString &path);
0046 
0047     void authorize();
0048     void refreshAccessToken();
0049     bool is_valid() const;
0050     QString name() const;
0051     QString homepage() const;
0052     ProviderModel::SERVICETYPE type() const;
0053     QString attribution() const;
0054     bool downloadOAuth2() const;
0055     bool requiresLogin() const;
0056 
0057 public Q_SLOTS:
0058     void slotStartSearch(const QString &searchText, int page);
0059     void slotFetchFiles(const QString &id);
0060     // void slotShowResults(QNetworkReply *reply);
0061 
0062 protected:
0063     QOAuth2AuthorizationCodeFlow m_oauth2;
0064     QString m_path;
0065     QString m_name;
0066     QString m_homepage;
0067     SERVICETYPE m_type;
0068     QString m_clientkey;
0069     QString m_attribution;
0070     bool m_invalid;
0071     QJsonDocument m_doc;
0072     QString m_apiroot;
0073     QJsonObject m_search;
0074     QJsonObject m_download;
0075     QNetworkAccessManager *m_networkManager;
0076 
0077 private:
0078     void validate();
0079     QUrl getSearchUrl(const QString &searchText, const int page = 1);
0080     QUrl getFilesUrl(const QString &id);
0081     QJsonValue objectGetValue(QJsonObject item, QString key);
0082     QString objectGetString(QJsonObject item, const QString &key, const QString &id = QString(), const QString &parentKey = QString());
0083     QString replacePlaceholders(QString string, const QString &query = QString(), const int page = 0, const QString &id = QString());
0084     std::pair<QList<ResourceItemInfo>, const int> parseSearchResponse(const QByteArray &res);
0085     std::pair<QStringList, QStringList> parseFilesResponse(const QByteArray &res, const QString &id);
0086     QTemporaryFile *m_tmpThumbFile;
0087     const int m_perPage = 15;
0088 
0089 Q_SIGNALS:
0090     void searchDone(QList<ResourceItemInfo> &list, const int pageCount);
0091     void searchError(const QString &msg = QString());
0092     void fetchedFiles(QStringList, QStringList, const QString &token = QString());
0093     void authenticated(const QString &token);
0094     void usePreview();
0095     void authorizeWithBrowser(const QUrl &url);
0096 };