File indexing completed on 2024-05-12 16:21:17

0001 // SPDX-FileCopyrightText: 2022 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 #pragma once
0006 
0007 #include "ytmusic.h"
0008 #include "playlistimporter.h"
0009 #include <QAbstractListModel>
0010 #include <QDateTime>
0011 
0012 #include <ThreadedDatabase>
0013 
0014 struct Playlist {
0015     using ColumnTypes = std::tuple<qint64, QString, QString, QDateTime>;
0016 
0017     Playlist static fromSql(ColumnTypes tuple) {
0018         auto [playlistId, title, description, createdOn] = tuple;
0019         return Playlist { playlistId, title, description, createdOn };
0020     }
0021 
0022     qint64 playlistId;
0023     QString title;
0024     QString description;
0025     QDateTime createdOn;
0026 
0027 };
0028 
0029 class LocalPlaylistsModel : public QAbstractListModel
0030 {
0031     Q_OBJECT
0032 
0033     enum Roles {
0034         PlaylistId,
0035         Title,
0036         Description,
0037         CreatedOn,
0038         ThumbnailIds
0039     };
0040 
0041 public:
0042     LocalPlaylistsModel(QObject *parent = nullptr);
0043 
0044     int rowCount(const QModelIndex &index) const override;
0045     QHash<int, QByteArray> roleNames() const override;
0046     QVariant data(const QModelIndex &index, int role) const override;
0047 
0048     Q_INVOKABLE void addPlaylist(const QString &title, const QString &description);
0049     Q_INVOKABLE void addPlaylistEntry(qint64 playlistId, const QString &videoId, const QString &title, const QString &artist, const QString &album);
0050     Q_INVOKABLE void addPlaylistEntry(qint64 playlistId, const playlist::Track &track);
0051     Q_INVOKABLE void importPlaylist(const QString &url);
0052     Q_SIGNAL void importFinished();
0053 
0054     Q_INVOKABLE void renamePlaylist(qint64 playlistId, const QString &name, const QString &description);
0055     Q_INVOKABLE void deletePlaylist(qint64 playlistId);
0056 
0057 
0058     Q_SIGNAL void playlistEntriesChanged(quint64 playlistId);
0059 
0060     void refreshModel();
0061 
0062 private:
0063     QStringView cropURL(QStringView srcURL);
0064     std::vector<Playlist> m_playlists;
0065     std::vector<std::vector<QString>> m_thumbnailIds;
0066     PlaylistImporter *importer;
0067 };
0068