File indexing completed on 2024-05-12 16:21:17
0001 // SPDX-FileCopyrightText: 2021 Jonah BrĂ¼chert <jbb@kaidan.im> 0002 // 0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0004 0005 0006 #include "playlistmodel.h" 0007 0008 #include <QUrl> 0009 0010 #include "asyncytmusic.h" 0011 #include "playlistutils.h" 0012 0013 #include <QStringBuilder> 0014 0015 0016 PlaylistModel::PlaylistModel(QObject *parent) 0017 : AbstractYTMusicModel(parent) 0018 { 0019 connect(this, &PlaylistModel::playlistIdChanged, this, [=, this] { 0020 setLoading(true); 0021 auto future = YTMusicThread::instance()->fetchPlaylist(m_playlistId); 0022 QCoro::connect(std::move(future), this, [=, this](const playlist::Playlist &&playlist) { 0023 setLoading(false); 0024 beginResetModel(); 0025 m_playlist = std::move(playlist); 0026 std::sort(m_playlist.thumbnails.begin(), m_playlist.thumbnails.end()); 0027 endResetModel(); 0028 0029 Q_EMIT titleChanged(); 0030 Q_EMIT thumbnailUrlChanged(); 0031 }); 0032 }); 0033 } 0034 0035 int PlaylistModel::rowCount(const QModelIndex &parent) const 0036 { 0037 return parent.isValid() ? 0 : int(m_playlist.tracks.size()); 0038 } 0039 0040 QHash<int, QByteArray> PlaylistModel::roleNames() const 0041 { 0042 return { 0043 {Title, "title"}, 0044 {Artists, "artists"}, 0045 {VideoId, "videoId"}, 0046 {ThumbnailUrl, "thumbnailUrl"}, 0047 {ArtistsDisplayString, "artistsDisplayString"} 0048 }; 0049 } 0050 0051 QVariant PlaylistModel::data(const QModelIndex &index, int role) const 0052 { 0053 switch (role) { 0054 case Title: 0055 return QString::fromStdString(m_playlist.tracks[index.row()].title); 0056 case Artists: 0057 return QVariant::fromValue(m_playlist.tracks[index.row()].artists); 0058 case VideoId: 0059 if (m_playlist.tracks[index.row()].video_id) { 0060 return QString::fromStdString(*m_playlist.tracks[index.row()].video_id); 0061 } 0062 return {}; 0063 case ThumbnailUrl: 0064 if (!m_playlist.tracks[index.row()].thumbnails.empty()) { 0065 return QString::fromStdString(m_playlist.tracks[index.row()].thumbnails.front().url); 0066 } else { 0067 return {}; 0068 } 0069 case ArtistsDisplayString: 0070 return PlaylistUtils::artistsToString(m_playlist.tracks[index.row()].artists); 0071 } 0072 0073 Q_UNREACHABLE(); 0074 0075 return {}; 0076 } 0077 0078 QString PlaylistModel::playlistId() const 0079 { 0080 auto id = m_playlistId; 0081 id.remove(QStringLiteral("VL")); // Workaround: get_watch_playlist only accepts 0082 // the playlists without the leading VL 0083 return id; 0084 } 0085 0086 void PlaylistModel::setPlaylistId(const QString &playlistId) 0087 { 0088 m_playlistId = playlistId; 0089 Q_EMIT playlistIdChanged(); 0090 } 0091 0092 QUrl PlaylistModel::thumbnailUrl() const 0093 { 0094 if (m_playlist.thumbnails.empty()) { 0095 return QUrl(); 0096 } 0097 0098 return QUrl(QString::fromStdString(m_playlist.thumbnails.back().url)); 0099 } 0100 0101 QString PlaylistModel::title() const 0102 { 0103 return QString::fromStdString(m_playlist.title); 0104 } 0105 0106 QUrl PlaylistModel::webUrl() const 0107 { 0108 return QUrl(YTMUSIC_WEB_BASE_URL % "playlist?list=" % playlistId()); 0109 } 0110 0111 playlist::Playlist PlaylistModel::playlist() const 0112 { 0113 return m_playlist; 0114 }