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