File indexing completed on 2024-04-28 04:49:03

0001 /*
0002    SPDX-FileCopyrightText: 2018 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
0003 
0004    SPDX-License-Identifier: LGPL-3.0-or-later
0005  */
0006 
0007 #ifndef TRACKMETADATAMODEL_H
0008 #define TRACKMETADATAMODEL_H
0009 
0010 #include "elisaLib_export.h"
0011 
0012 #include "elisautils.h"
0013 #include "trackslistener.h"
0014 #include "datatypes.h"
0015 #include "modeldataloader.h"
0016 #include "filescanner.h"
0017 
0018 #include <QUrl>
0019 #include <QAbstractListModel>
0020 #include <QFutureWatcher>
0021 #include <QMutex>
0022 
0023 class MusicListenersManager;
0024 
0025 class ELISALIB_EXPORT TrackMetadataModel : public QAbstractListModel
0026 {
0027     Q_OBJECT
0028 
0029     Q_PROPERTY(QUrl coverUrl
0030                READ coverUrl
0031                NOTIFY coverUrlChanged)
0032 
0033     Q_PROPERTY(QString fileUrl
0034                READ fileUrl
0035                NOTIFY fileUrlChanged)
0036 
0037     Q_PROPERTY(qulonglong databaseId
0038                READ databaseId
0039                NOTIFY databaseIdChanged)
0040 
0041     Q_PROPERTY(MusicListenersManager* manager
0042                READ manager
0043                WRITE setManager
0044                NOTIFY managerChanged)
0045 
0046     Q_PROPERTY(QString lyrics
0047                READ lyrics
0048                NOTIFY lyricsChanged)
0049 
0050 public:
0051 
0052     enum ColumnRoles
0053     {
0054         ItemNameRole = Qt::UserRole + 1,
0055         ItemTypeRole,
0056     };
0057 
0058     Q_ENUM(ColumnRoles)
0059 
0060     enum ItemType
0061     {
0062         TextEntry,
0063         UrlEntry,
0064         IntegerEntry,
0065         RatingEntry,
0066         DateEntry,
0067         DurationEntry,
0068         LongTextEntry,
0069     };
0070 
0071     Q_ENUM(ItemType)
0072 
0073     using TrackDataType = DataTypes::TrackDataType;
0074 
0075     explicit TrackMetadataModel(QObject *parent = nullptr);
0076 
0077     ~TrackMetadataModel() override;
0078 
0079     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0080 
0081     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
0082 
0083     bool setData(const QModelIndex &index, const QVariant &value,
0084                  int role = Qt::EditRole) override;
0085 
0086     QHash<int, QByteArray> roleNames() const override;
0087 
0088     QUrl coverUrl() const;
0089 
0090     QString fileUrl() const;
0091 
0092     MusicListenersManager* manager() const;
0093 
0094     QString lyrics() const;
0095 
0096     qulonglong databaseId() const;
0097 
0098 Q_SIGNALS:
0099 
0100     void needDataByDatabaseIdAndUrl(ElisaUtils::PlayListEntryType dataType, qulonglong databaseId, const QUrl &url);
0101 
0102     void needDataByUrl(ElisaUtils::PlayListEntryType dataType, const QUrl &fileName);
0103 
0104     void coverUrlChanged();
0105 
0106     void fileUrlChanged();
0107 
0108     void managerChanged();
0109 
0110     void lyricsChanged();
0111 
0112     void databaseIdChanged();
0113 
0114 public Q_SLOTS:
0115 
0116     void trackData(const TrackMetadataModel::TrackDataType &trackData);
0117 
0118     void initializeByIdAndUrl(ElisaUtils::PlayListEntryType type, qulonglong databaseId, const QUrl &url);
0119 
0120     void initializeByUrl(ElisaUtils::PlayListEntryType type, const QUrl &url);
0121 
0122     void initializeForNewRadio();
0123 
0124     void setManager(MusicListenersManager *newManager);
0125 
0126     void setDatabase(DatabaseInterface *trackDatabase);
0127 
0128     void radioData(const TrackMetadataModel::TrackDataType &radiosData);
0129 
0130 protected:
0131 
0132     void saveChanges();
0133 
0134     void undoChanges();
0135 
0136     virtual void fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData);
0137 
0138     virtual void fillDataForNewRadio();
0139 
0140     virtual void filterDataFromTrackData();
0141 
0142     void removeMetaData(DataTypes::ColumnsRoles metaData);
0143 
0144     TrackDataType::mapped_type dataFromType(TrackDataType::key_type metaData) const;
0145 
0146     virtual void fillLyricsDataFromTrack();
0147 
0148     const TrackDataType& allTrackData() const;
0149 
0150     virtual void initialize(MusicListenersManager *newManager,
0151                             DatabaseInterface *trackDatabase);
0152 
0153     ModelDataLoader& modelDataLoader();
0154 
0155     const TrackDataType& displayedTrackData() const;
0156 
0157     DataTypes::ColumnsRoles trackKey(int index) const;
0158 
0159     void removeDataByIndex(int index);
0160 
0161     void addDataByName(const QString &name);
0162 
0163     static QString nameFromRole(DataTypes::ColumnsRoles role);
0164 
0165     bool metadataExists(DataTypes::ColumnsRoles metadataRole) const;
0166 
0167 private Q_SLOTS:
0168 
0169     void lyricsValueIsReady();
0170 
0171 private:
0172 
0173     void fetchLyrics();
0174 
0175     void resetDisplayData();
0176 
0177     TrackDataType mFullData;
0178 
0179     TrackDataType mDisplayData;
0180 
0181     QUrl mCoverImage;
0182 
0183     QUrl mFileUrl;
0184 
0185     qulonglong mDatabaseId = 0;
0186 
0187     QList<TrackDataType::key_type> mDisplayKeys;
0188 
0189     ModelDataLoader mDataLoader;
0190 
0191     MusicListenersManager *mManager = nullptr;
0192 
0193     FileScanner mFileScanner;
0194 
0195     QMutex mFileScannerMutex;
0196 
0197     QFutureWatcher<QString> mLyricsValueWatcher;
0198 };
0199 
0200 #endif // TRACKMETADATAMODEL_H