]> git.sur5r.net Git - minitube/blob - src/invidious/ivsearch.cpp
New upstream version 3.6.1
[minitube] / src / invidious / ivsearch.cpp
1 #include "ivsearch.h"
2
3 #include "http.h"
4 #include "httputils.h"
5 #include "invidious.h"
6 #include "ivlistparser.h"
7 #include "mainwindow.h"
8 #include "searchparams.h"
9 #include "video.h"
10
11 namespace {
12 int invidiousFixedMax = 20;
13 }
14
15 IVSearch::IVSearch(SearchParams *searchParams, QObject *parent)
16     : IVVideoSource(parent), searchParams(searchParams) {
17     searchParams->setParent(this);
18 }
19
20 void IVSearch::reallyLoadVideos(int max, int startIndex) {
21     QUrl url = Invidious::instance().method("search");
22
23     QUrlQuery q(url);
24
25     // invidious always returns 20 results
26     int page = ((startIndex - 1) / invidiousFixedMax) + 1;
27     q.addQueryItem("page", QString::number(page));
28
29     if (!searchParams->keywords().isEmpty()) {
30         q.addQueryItem("q", searchParams->keywords());
31     }
32
33     if (!searchParams->channelId().isEmpty())
34         q.addQueryItem("channelId", searchParams->channelId());
35
36     switch (searchParams->sortBy()) {
37     case SearchParams::SortByNewest:
38         q.addQueryItem("sort_by", "upload_date");
39         break;
40     case SearchParams::SortByViewCount:
41         q.addQueryItem("sort_by", "view_count");
42         break;
43     case SearchParams::SortByRating:
44         q.addQueryItem("sort_by", "rating");
45         break;
46     }
47
48     switch (searchParams->duration()) {
49     case SearchParams::DurationShort:
50         q.addQueryItem("duration", "short");
51         break;
52     case SearchParams::DurationMedium:
53         q.addQueryItem("duration", "medium");
54         break;
55     case SearchParams::DurationLong:
56         q.addQueryItem("duration", "long");
57         break;
58     }
59
60     switch (searchParams->time()) {
61     case SearchParams::TimeToday:
62         q.addQueryItem("date", "today");
63         break;
64     case SearchParams::TimeWeek:
65         q.addQueryItem("date", "week");
66         break;
67     case SearchParams::TimeMonth:
68         q.addQueryItem("date", "month");
69         break;
70     }
71
72     switch (searchParams->quality()) {
73     case SearchParams::QualityHD:
74         q.addQueryItem("features", "hd");
75         break;
76     }
77
78     url.setQuery(q);
79
80     // qWarning() << "YT3 search" << url.toString();
81     auto reply = Invidious::cachedHttp().get(url);
82     connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResults(QByteArray)));
83     connect(reply, &HttpReply::error, this, &IVSearch::handleError);
84 }
85
86 void IVSearch::parseResults(const QByteArray &data) {
87     if (aborted) return;
88
89     QJsonDocument doc = QJsonDocument::fromJson(data);
90     const QJsonArray items = doc.array();
91     if (items.isEmpty()) {
92         handleError("No videos");
93         return;
94     }
95
96     IVListParser parser(items);
97     const QVector<Video *> &videos = parser.getVideos();
98
99     if (items.size() > invidiousFixedMax) invidiousFixedMax = items.size();
100
101     if (name.isEmpty() && !searchParams->channelId().isEmpty()) {
102         if (!videos.isEmpty()) {
103             name = videos.at(0)->getChannelTitle();
104             if (!searchParams->keywords().isEmpty()) {
105                 name += QLatin1String(": ") + searchParams->keywords();
106             }
107         }
108         emit nameChanged(name);
109     }
110
111     emit gotVideos(videos);
112     emit finished(videos.size());
113 }
114
115 QString IVSearch::getName() {
116     if (!name.isEmpty()) return name;
117     if (!searchParams->keywords().isEmpty()) return searchParams->keywords();
118     return QString();
119 }
120
121 const QList<QAction *> &IVSearch::getActions() {
122     static const QList<QAction *> channelActions = {
123             MainWindow::instance()->getAction("subscribeChannel")};
124     if (searchParams->channelId().isEmpty()) {
125         static const QList<QAction *> noActions;
126         return noActions;
127     }
128     return channelActions;
129 }
130
131 int IVSearch::maxResults() {
132     return invidiousFixedMax;
133 }