File indexing completed on 2025-02-23 04:35:12

0001 // SPDX-FileCopyrightText: 2021 Linus Jahn <lnj@kaidan.im>
0002 // SPDX-License-Identifier: GPL-3.0-or-later
0003 
0004 #pragma once
0005 
0006 #include "abstractapi.h"
0007 #include "channel.h"
0008 #include "comment.h"
0009 #include "credentials.h"
0010 #include "playlist.h"
0011 #include "preferences.h"
0012 #include "searchparameters.h"
0013 #include "video.h"
0014 
0015 #include <QFuture>
0016 #include <QHash>
0017 #include <QNetworkCookie>
0018 #include <QNetworkReply>
0019 #include <QObject>
0020 
0021 #include <variant>
0022 
0023 class QNetworkAccessManager;
0024 
0025 namespace QInvidious
0026 {
0027 
0028 class InvidiousApi : public AbstractApi
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033     explicit InvidiousApi(QNetworkAccessManager *netManager, QObject *parent = nullptr);
0034 
0035     QFuture<LogInResult> logIn(QStringView username, QStringView password) override;
0036     QFuture<VideoResult> requestVideo(QStringView videoId) override;
0037     QString resolveVideoUrl(QStringView videoId) override;
0038     QFuture<SearchListResult> requestSearchResults(const SearchParameters &parameters) override;
0039     QFuture<VideoListResult> requestFeed(qint32 page = 1) override;
0040     QFuture<VideoListResult> requestTop() override;
0041     QFuture<VideoListResult> requestTrending(TrendingTopic = Main) override;
0042     QFuture<VideoListResult> requestChannel(QStringView query, qint32 page = 1) override;
0043     QFuture<SubscriptionsResult> requestSubscriptions() override;
0044     QFuture<Result> subscribeToChannel(QStringView channel) override;
0045     QFuture<Result> unsubscribeFromChannel(QStringView channel) override;
0046     QFuture<HistoryResult> requestHistory(qint32 page = 1) override;
0047     QFuture<Result> markWatched(const QString &videoId) override;
0048     QFuture<Result> markUnwatched(const QString &videoId) override;
0049     QFuture<CommentsResult> requestComments(const QString &videoId, const QString &continuation = {}) override;
0050     QFuture<PlaylistsResult> requestPlaylists() override;
0051     QFuture<PreferencesResult> requestPreferences() override;
0052     QFuture<Result> setPreferences(const QInvidious::Preferences &preferences) override;
0053     QFuture<VideoListResult> requestPlaylist(const QString &plid) override;
0054     QFuture<ChannelResult> requestChannelInfo(QStringView queryd) override;
0055     QFuture<Result> addVideoToPlaylist(const QString &plid, const QString &videoId) override;
0056     QFuture<Result> removeVideoFromPlaylist(const QString &plid, const QString &indexId) override;
0057 
0058 private:
0059     enum VideoListType { Search, Trending, Top, Feed, Channel };
0060 
0061     static Error invalidJsonError();
0062     static Result checkIsReplyOk(QNetworkReply *reply);
0063 
0064     bool supportsFeature(SupportedFeature feature) override;
0065 
0066     QFuture<VideoListResult> requestVideoList(VideoListType queryType, const QString &urlExtension = {}, const QHash<QString, QString> &parameters = {});
0067     QNetworkRequest authenticatedNetworkRequest(QUrl &&url);
0068     QUrlQuery genericUrlQuery() const;
0069     QUrl videoUrl(QStringView videoId) const;
0070     QUrl videoListUrl(VideoListType queryType, const QString &urlExtension = {}, const QHash<QString, QString> &parameters = {}) const;
0071     QUrl subscriptionsUrl() const;
0072     QUrl subscribeUrl(QStringView channelId) const;
0073 };
0074 
0075 }