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 }