6 #include "ivlistparser.h"
7 #include "mainwindow.h"
8 #include "searchparams.h"
12 int invidiousFixedMax = 20;
15 IVSearch::IVSearch(SearchParams *searchParams, QObject *parent)
16 : VideoSource(parent), searchParams(searchParams) {
17 searchParams->setParent(this);
20 void IVSearch::loadVideos(int max, int startIndex) {
23 QUrl url = Invidious::instance().method("search");
27 // invidious always returns 20 results
28 int page = ((startIndex - 1) / invidiousFixedMax) + 1;
29 q.addQueryItem("page", QString::number(page));
31 if (!searchParams->keywords().isEmpty()) {
32 q.addQueryItem("q", searchParams->keywords());
35 if (!searchParams->channelId().isEmpty())
36 q.addQueryItem("channelId", searchParams->channelId());
38 switch (searchParams->sortBy()) {
39 case SearchParams::SortByNewest:
40 q.addQueryItem("sort_by", "upload_date");
42 case SearchParams::SortByViewCount:
43 q.addQueryItem("sort_by", "view_count");
45 case SearchParams::SortByRating:
46 q.addQueryItem("sort_by", "rating");
50 switch (searchParams->duration()) {
51 case SearchParams::DurationShort:
52 q.addQueryItem("duration", "short");
54 case SearchParams::DurationMedium:
55 q.addQueryItem("duration", "medium");
57 case SearchParams::DurationLong:
58 q.addQueryItem("duration", "long");
62 switch (searchParams->time()) {
63 case SearchParams::TimeToday:
64 q.addQueryItem("date", "today");
66 case SearchParams::TimeWeek:
67 q.addQueryItem("date", "week");
69 case SearchParams::TimeMonth:
70 q.addQueryItem("date", "month");
74 switch (searchParams->quality()) {
75 case SearchParams::QualityHD:
76 q.addQueryItem("features", "hd");
82 // qWarning() << "YT3 search" << url.toString();
83 QObject *reply = Invidious::cachedHttp().get(url);
84 connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResults(QByteArray)));
85 connect(reply, SIGNAL(error(QString)), SLOT(requestError(QString)));
88 void IVSearch::parseResults(const QByteArray &data) {
91 QJsonDocument doc = QJsonDocument::fromJson(data);
92 const QJsonArray items = doc.array();
93 IVListParser parser(items);
94 const QVector<Video *> &videos = parser.getVideos();
96 if (items.size() > invidiousFixedMax) invidiousFixedMax = items.size();
98 if (name.isEmpty() && !searchParams->channelId().isEmpty()) {
99 if (!videos.isEmpty()) {
100 name = videos.at(0)->getChannelTitle();
101 if (!searchParams->keywords().isEmpty()) {
102 name += QLatin1String(": ") + searchParams->keywords();
105 emit nameChanged(name);
108 emit gotVideos(videos);
109 emit finished(videos.size());
112 void IVSearch::abort() {
116 QString IVSearch::getName() {
117 if (!name.isEmpty()) return name;
118 if (!searchParams->keywords().isEmpty()) return searchParams->keywords();
122 void IVSearch::requestError(const QString &message) {
123 Invidious::instance().initServers();
124 QString msg = message;
128 const QList<QAction *> &IVSearch::getActions() {
129 static const QList<QAction *> channelActions = {
130 MainWindow::instance()->getAction("subscribeChannel")};
131 if (searchParams->channelId().isEmpty()) {
132 static const QList<QAction *> noActions;
135 return channelActions;
138 int IVSearch::maxResults() {
139 return invidiousFixedMax;