Files
audiotube/src/searchmodel.cpp
T
Jonah Brüchert 463bdde0a0 Add library feature
The library page currently shows favourites and most played songs.
2022-05-22 11:16:38 +00:00

189 lines
6.7 KiB
C++

// SPDX-FileCopyrightText: 2021 Jonah Brüchert <[email protected]>
//
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
#include "searchmodel.h"
SearchModel::SearchModel(QObject *parent)
: AbstractYTMusicModel(parent)
{
connect(this, &SearchModel::searchQueryChanged, this, [this] {
if (m_searchQuery.isEmpty()) {
beginResetModel();
m_searchResults.clear();
endResetModel();
return;
}
setLoading(true);
auto future = YTMusicThread::instance()->search(m_searchQuery);
connectFuture(future, this, [=, this](const std::vector<search::SearchResultItem> &results) {
beginResetModel();
setLoading(false);
m_searchResults = results;
endResetModel();
});
});
connect(&YTMusicThread::instance().get(), &AsyncYTMusic::errorOccurred, this, [this] {
setLoading(false);
});
}
int SearchModel::rowCount(const QModelIndex &parent) const
{
return parent.isValid() ? 0 : int(m_searchResults.size());
}
QVariant SearchModel::data(const QModelIndex &index, int role) const
{
switch (role) {
case Title:
return QString::fromStdString(std::visit([&](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Album>) {
return arg.title;
} else if constexpr (std::is_same_v<T, search::Artist>) {
return arg.artist;
} else if constexpr (std::is_same_v<T, search::Playlist>) {
return arg.title;
} else if constexpr (std::is_same_v<T, search::Song>) {
return arg.title;
} else if constexpr (std::is_same_v<T, search::Video>) {
return arg.title;
} else {
Q_UNREACHABLE();
}
}, m_searchResults.at(index.row())));
case Type:
return std::visit([&](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Album>) {
return Type::Album;
} else if constexpr (std::is_same_v<T, search::Artist>) {
return Type::Artist;
} else if constexpr (std::is_same_v<T, search::Playlist>) {
return Type::Playlist;
} else if constexpr (std::is_same_v<T, search::Song>) {
return Type::Song;
} else if constexpr (std::is_same_v<T, search::Video>) {
return Type::Video;
} else {
Q_UNREACHABLE();
}
}, m_searchResults.at(index.row()));
case VideoId:
return std::visit([&](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Album>) {
return QString();
} else if constexpr (std::is_same_v<T, search::Artist>) {
return QString();
} else if constexpr (std::is_same_v<T, search::Playlist>) {
return QString();
} else if constexpr (std::is_same_v<T, search::Song>) {
return QString::fromStdString(arg.video_id);
} else if constexpr (std::is_same_v<T, search::Video>) {
return QString::fromStdString(arg.video_id);
} else {
Q_UNREACHABLE();
}
}, m_searchResults.at(index.row()));
case Artists:
return QVariant::fromValue(std::visit([&](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Album>) {
return std::vector<meta::Artist>();
} else if constexpr (std::is_same_v<T, search::Artist>) {
return std::vector<meta::Artist>();
} else if constexpr (std::is_same_v<T, search::Playlist>) {
return std::vector<meta::Artist>();
} else if constexpr (std::is_same_v<T, search::Song>) {
return arg.artists;
} else if constexpr (std::is_same_v<T, search::Video>) {
return arg.artists;
} else {
Q_UNREACHABLE();
}
}, m_searchResults.at(index.row())));
case RadioPlaylistId:
return std::visit([&](auto &&arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Artist>) {
if (arg.radio_id) {
return QString::fromStdString(*arg.radio_id);
}
}
return QString();
}, m_searchResults.at(index.row()));
}
Q_UNREACHABLE();
return {};
}
QHash<int, QByteArray> SearchModel::roleNames() const
{
return {
{Title, "title"},
{Type, "type"},
{VideoId, "videoId"},
{Artists, "artists"},
{RadioPlaylistId, "radioPlaylistId"},
};
}
QString SearchModel::searchQuery() const
{
return m_searchQuery;
}
void SearchModel::setSearchQuery(const QString &searchQuery)
{
m_searchQuery = searchQuery;
Q_EMIT searchQueryChanged();
}
void SearchModel::triggerItem(int row)
{
std::visit([&](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, search::Album>) {
Q_EMIT openAlbum(QString::fromStdString(arg.browse_id));
} else if constexpr (std::is_same_v<T, search::Artist>) {
Q_EMIT openArtist(QString::fromStdString(arg.browse_id));
} else if constexpr (std::is_same_v<T, search::Playlist>) {
Q_EMIT openPlaylist(QString::fromStdString(arg.browse_id));
} else if constexpr (std::is_same_v<T, search::Song>) {
Q_EMIT openSong(QString::fromStdString(arg.video_id));
} else if constexpr (std::is_same_v<T, search::Video>) {
Q_EMIT openVideo(QString::fromStdString(arg.video_id), QString::fromStdString(arg.title));
} else {
Q_UNREACHABLE();
}
}, m_searchResults.at(row));
}
int SearchModel::itemType(search::SearchResultItem const &item)
{
return std::visit([&](auto &&arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr(std::is_same_v<T, search::Album>) {
return SearchModel::Type::Album;
} else if constexpr(std::is_same_v<T, search::Artist>) {
return SearchModel::Type::Artist;
} else if constexpr(std::is_same_v<T, search::Playlist>) {
return SearchModel::Type::Playlist;
} else if constexpr(std::is_same_v<T, search::Song>) {
return SearchModel::Type::Song;
} else if constexpr(std::is_same_v<T, search::Video>) {
return SearchModel::Type::Video;
} else {
Q_UNREACHABLE();
}
}, item);
}