6 #include "ivlistparser.h"
7 #include "mainwindow.h"
8 #include "searchparams.h"
12 int invidiousFixedMax = 20;
15 IVSearch::IVSearch(SearchParams *searchParams, QObject *parent)
16 : IVVideoSource(parent), searchParams(searchParams) {
17 searchParams->setParent(this);
20 void IVSearch::reallyLoadVideos(int max, int startIndex) {
21 QUrl url = Invidious::instance().method("search");
23 QTimer::singleShot(500, this, [this] { handleError("No baseUrl"); });
29 // invidious always returns 20 results
30 int page = ((startIndex - 1) / invidiousFixedMax) + 1;
31 q.addQueryItem("page", QString::number(page));
33 if (!searchParams->keywords().isEmpty()) {
34 q.addQueryItem("q", searchParams->keywords());
37 if (!searchParams->channelId().isEmpty())
38 q.addQueryItem("channelId", searchParams->channelId());
40 switch (searchParams->sortBy()) {
41 case SearchParams::SortByNewest:
42 q.addQueryItem("sort_by", "upload_date");
44 case SearchParams::SortByViewCount:
45 q.addQueryItem("sort_by", "view_count");
47 case SearchParams::SortByRating:
48 q.addQueryItem("sort_by", "rating");
52 switch (searchParams->duration()) {
53 case SearchParams::DurationShort:
54 q.addQueryItem("duration", "short");
56 case SearchParams::DurationMedium:
57 q.addQueryItem("duration", "medium");
59 case SearchParams::DurationLong:
60 q.addQueryItem("duration", "long");
64 switch (searchParams->time()) {
65 case SearchParams::TimeToday:
66 q.addQueryItem("date", "today");
68 case SearchParams::TimeWeek:
69 q.addQueryItem("date", "week");
71 case SearchParams::TimeMonth:
72 q.addQueryItem("date", "month");
76 switch (searchParams->quality()) {
77 case SearchParams::QualityHD:
78 q.addQueryItem("features", "hd");
84 // qWarning() << "YT3 search" << url.toString();
85 auto reply = Invidious::cachedHttp().get(url);
86 connect(reply, SIGNAL(data(QByteArray)), SLOT(parseResults(QByteArray)));
87 connect(reply, &HttpReply::error, this, &IVSearch::handleError);
90 void IVSearch::parseResults(const QByteArray &data) {
93 QJsonDocument doc = QJsonDocument::fromJson(data);
94 const QJsonArray items = doc.array();
95 if (items.isEmpty()) {
96 handleError("No videos");
100 IVListParser parser(items);
101 const QVector<Video *> &videos = parser.getVideos();
103 if (items.size() > invidiousFixedMax) invidiousFixedMax = items.size();
105 if (name.isEmpty() && !searchParams->channelId().isEmpty()) {
106 if (!videos.isEmpty()) {
107 name = videos.at(0)->getChannelTitle();
108 if (!searchParams->keywords().isEmpty()) {
109 name += QLatin1String(": ") + searchParams->keywords();
112 emit nameChanged(name);
115 emit gotVideos(videos);
116 emit finished(videos.size());
119 QString IVSearch::getName() {
120 if (!name.isEmpty()) return name;
121 if (!searchParams->keywords().isEmpty()) return searchParams->keywords();
125 const QList<QAction *> &IVSearch::getActions() {
126 static const QList<QAction *> channelActions = {
127 MainWindow::instance()->getAction("subscribeChannel")};
128 if (searchParams->channelId().isEmpty()) {
129 static const QList<QAction *> noActions;
132 return channelActions;
135 int IVSearch::maxResults() {
136 return invidiousFixedMax;