File indexing completed on 2024-04-21 04:49:00
0001 /* 0002 SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #ifndef MEDIAPLAYLIST_H 0008 #define MEDIAPLAYLIST_H 0009 0010 #include "elisaLib_export.h" 0011 0012 #include "elisautils.h" 0013 #include "datatypes.h" 0014 0015 #include <QAbstractListModel> 0016 #include <QMediaPlayer> 0017 0018 #include <utility> 0019 #include <tuple> 0020 #include <memory> 0021 0022 class MediaPlayListPrivate; 0023 class MediaPlayListEntry; 0024 class QDebug; 0025 0026 class ELISALIB_EXPORT MediaPlayList : public QAbstractListModel 0027 { 0028 Q_OBJECT 0029 0030 public: 0031 0032 enum ColumnsRoles { 0033 TitleRole = DataTypes::TitleRole, 0034 SecondaryTextRole, 0035 ImageUrlRole, 0036 ShadowForImageRole, 0037 ChildModelRole, 0038 DurationRole, 0039 StringDurationRole, 0040 ArtistRole, 0041 AllArtistsRole, 0042 HighestTrackRating, 0043 AlbumRole, 0044 AlbumArtistRole, 0045 IsValidAlbumArtistRole, 0046 TrackNumberRole, 0047 DiscNumberRole, 0048 RatingRole, 0049 GenreRole, 0050 LyricistRole, 0051 ComposerRole, 0052 CommentRole, 0053 YearRole, 0054 ChannelsRole, 0055 BitRateRole, 0056 SampleRateRole, 0057 ResourceRole, 0058 IdRole, 0059 ParentIdRole, 0060 DatabaseIdRole, 0061 IsSingleDiscAlbumRole, 0062 ContainerDataRole, 0063 IsPartialDataRole, 0064 AlbumIdRole, 0065 HasEmbeddedCover, 0066 FileModificationTime, 0067 FirstPlayDate, 0068 LastPlayDate, 0069 PlayCounter, 0070 PlayFrequency, 0071 ElementTypeRole, 0072 LyricsRole, 0073 FullDataRole, 0074 IsDirectoryRole, 0075 IsPlayListRole, 0076 FilePathRole, 0077 IsValidRole, 0078 CountRole, 0079 IsPlayingRole, 0080 AlbumSectionRole, 0081 MetadataModifiableRole, 0082 }; 0083 0084 Q_ENUM(ColumnsRoles) 0085 0086 enum PlayState { 0087 NotPlaying, 0088 IsPlaying, 0089 IsPaused, 0090 }; 0091 0092 Q_ENUM(PlayState) 0093 0094 using ListTrackDataType = DataTypes::ListTrackDataType; 0095 0096 using TrackDataType = DataTypes::TrackDataType; 0097 0098 explicit MediaPlayList(QObject *parent = nullptr); 0099 0100 ~MediaPlayList() override; 0101 0102 [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0103 0104 [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 0105 0106 bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; 0107 0108 [[nodiscard]] QHash<int, QByteArray> roleNames() const override; 0109 0110 bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override; 0111 0112 bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override; 0113 0114 void clearPlayList(); 0115 0116 void enqueueRestoredEntries(const QVariantList &newEntries); 0117 0118 [[nodiscard]] QVariantList getEntriesForRestore() const; 0119 0120 Q_SIGNALS: 0121 0122 void newTrackByNameInList(const QVariant &title, const QVariant &artist, const QVariant &album, const QVariant &trackNumber, const QVariant &discNumber); 0123 0124 void newEntryInList(qulonglong newDatabaseId, 0125 const QString &entryTitle, 0126 ElisaUtils::PlayListEntryType databaseIdType); 0127 0128 void newUrlInList(const QUrl &entryUrl, 0129 ElisaUtils::PlayListEntryType databaseIdType); 0130 0131 public Q_SLOTS: 0132 0133 void tracksListAdded(qulonglong newDatabaseId, 0134 const QString &entryTitle, 0135 ElisaUtils::PlayListEntryType databaseIdType, 0136 const MediaPlayList::ListTrackDataType &tracks); 0137 0138 void trackChanged(const MediaPlayList::TrackDataType &track); 0139 0140 void trackRemoved(qulonglong trackId); 0141 0142 void trackInError(const QUrl &sourceInError, QMediaPlayer::Error playerError); 0143 0144 void enqueueFilesList(const DataTypes::EntryDataList &newEntries); 0145 0146 void enqueueOneEntry(const DataTypes::EntryData &entryData); 0147 0148 void enqueueMultipleEntries(const DataTypes::EntryDataList &entriesData); 0149 0150 private: 0151 0152 std::unique_ptr<MediaPlayListPrivate> d; 0153 }; 0154 0155 class MediaPlayListEntry 0156 { 0157 public: 0158 0159 MediaPlayListEntry() = default; 0160 0161 explicit MediaPlayListEntry(qulonglong id) : mId(id), mIsValid(true) { 0162 } 0163 0164 MediaPlayListEntry(QString title, QString artist, 0165 QString album, int trackNumber, 0166 int discNumber, ElisaUtils::PlayListEntryType entryType = ElisaUtils::Unknown) 0167 : mTitle(std::move(title)), mAlbum(std::move(album)), mArtist(std::move(artist)), 0168 mTrackNumber(trackNumber), mDiscNumber(discNumber), mEntryType(entryType) { 0169 } 0170 0171 MediaPlayListEntry(qulonglong id, QVariant title, QVariant artist, 0172 QVariant album, QVariant trackUrl, 0173 QVariant trackNumber, QVariant discNumber, 0174 ElisaUtils::PlayListEntryType entryType = ElisaUtils::Unknown) 0175 : mTitle(std::move(title)), mAlbum(std::move(album)), mArtist(std::move(artist)), mTrackUrl(std::move(trackUrl)), 0176 mTrackNumber(std::move(trackNumber)), mDiscNumber(std::move(discNumber)), mId(id), mEntryType(entryType) { 0177 } 0178 0179 explicit MediaPlayListEntry(const MediaPlayList::TrackDataType &track) 0180 : mTitle(track[DataTypes::TitleRole]), 0181 mAlbum(track[DataTypes::AlbumRole]), 0182 mTrackNumber(track[DataTypes::TrackNumberRole]), 0183 mDiscNumber(track[DataTypes::DiscNumberRole]), 0184 mId(track[DataTypes::DatabaseIdRole].toULongLong()), 0185 mIsValid(true) { 0186 } 0187 0188 explicit MediaPlayListEntry(QString artist) : mArtist(std::move(artist)), mEntryType(ElisaUtils::Artist) { 0189 } 0190 0191 explicit MediaPlayListEntry(QUrl fileName) : mTrackUrl(std::move(fileName)) { 0192 } 0193 0194 explicit MediaPlayListEntry(qulonglong id, 0195 const QString &entryTitle, 0196 ElisaUtils::PlayListEntryType type) 0197 : mTitle(entryTitle), mId(id), mIsValid(type == ElisaUtils::Track), mEntryType(type) { 0198 } 0199 0200 QVariant mTitle; 0201 0202 QVariant mAlbum; 0203 0204 QVariant mArtist; 0205 0206 QVariant mTrackUrl; 0207 0208 QVariant mTrackNumber; 0209 0210 QVariant mDiscNumber; 0211 0212 qulonglong mId = 0; 0213 0214 bool mIsValid = false; 0215 0216 ElisaUtils::PlayListEntryType mEntryType = ElisaUtils::PlayListEntryType::Unknown; 0217 0218 MediaPlayList::PlayState mIsPlaying = MediaPlayList::NotPlaying; 0219 0220 }; 0221 0222 QDebug operator<<(const QDebug &stream, const MediaPlayListEntry &data); 0223 0224 0225 0226 #endif // MEDIAPLAYLIST_H