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");
25 // invidious always returns 20 results
26 int page = ((startIndex - 1) / invidiousFixedMax) + 1;
27 q.addQueryItem("page", QString::number(page));
29 if (!searchParams->keywords().isEmpty()) {
30 q.addQueryItem("q", searchParams->keywords());
33 if (!searchParams->channelId().isEmpty())
34 q.addQueryItem("channelId", searchParams->channelId());
36 switch (searchParams->sortBy()) {
37 case SearchParams::SortByNewest:
38 q.addQueryItem("sort_by", "upload_date");
40 case SearchParams::SortByViewCount:
41 q.addQueryItem("sort_by", "view_count");
43 case SearchParams::SortByRating:
44 q.addQueryItem("sort_by", "rating");
48 switch (searchParams->duration()) {
49 case SearchParams::DurationShort:
50 q.addQueryItem("duration", "short");
52 case SearchParams::DurationMedium:
53 q.addQueryItem("duration", "medium");
55 case SearchParams::DurationLong:
56 q.addQueryItem("duration", "long");
60 switch (searchParams->time()) {
61 case SearchParams::TimeToday:
62 q.addQueryItem("date", "today");
64 case SearchParams::TimeWeek:
65 q.addQueryItem("date", "week");
67 case SearchParams::TimeMonth:
68 q.addQueryItem("date", "month");
72 switch (searchParams->quality()) {
73 case SearchParams::QualityHD:
74 q.addQueryItem("features", "hd");
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);
86 void IVSearch::parseResults(const QByteArray &data) {
89 QJsonDocument doc = QJsonDocument::fromJson(data);
90 const QJsonArray items = doc.array();
91 if (items.isEmpty()) {
92 handleError("No videos");
96 IVListParser parser(items);
97 const QVector<Video *> &videos = parser.getVideos();
99 if (items.size() > invidiousFixedMax) invidiousFixedMax = items.size();
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();
108 emit nameChanged(name);
111 emit gotVideos(videos);
112 emit finished(videos.size());
115 QString IVSearch::getName() {
116 if (!name.isEmpty()) return name;
117 if (!searchParams->keywords().isEmpty()) return searchParams->keywords();
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;
128 return channelActions;
131 int IVSearch::maxResults() {
132 return invidiousFixedMax;