File indexing completed on 2024-05-05 04:50:34

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 #include "trackmetadatamodel.h"
0008 
0009 #include "musiclistenersmanager.h"
0010 
0011 #include <KLocalizedString>
0012 
0013 #include <QtConcurrentRun>
0014 
0015 #include <algorithm>
0016 
0017 #include <KFormat>
0018 
0019 QList<DataTypes::ColumnsRoles> displayFields(const ElisaUtils::PlayListEntryType dataType)
0020 {
0021     switch (dataType) {
0022     case ElisaUtils::Track:
0023         return {
0024             DataTypes::TitleRole, DataTypes::ArtistRole,
0025             DataTypes::AlbumRole, DataTypes::AlbumArtistRole,
0026             DataTypes::TrackNumberRole, DataTypes::DiscNumberRole,
0027             DataTypes::RatingRole, DataTypes::GenreRole,
0028             DataTypes::LyricistRole, DataTypes::ComposerRole,
0029             DataTypes::CommentRole, DataTypes::YearRole,
0030             DataTypes::ChannelsRole, DataTypes::BitRateRole,
0031             DataTypes::SampleRateRole, DataTypes::LastPlayDate,
0032             DataTypes::PlayCounter, DataTypes::DurationRole,
0033             DataTypes::LyricsRole
0034         };
0035     case ElisaUtils::Radio:
0036         return {DataTypes::TitleRole, DataTypes::ResourceRole, DataTypes::CommentRole, DataTypes::ImageUrlRole};
0037     default:
0038         return {};
0039     }
0040 }
0041 
0042 TrackMetadataModel::TrackMetadataModel(QObject *parent)
0043     : QAbstractListModel(parent)
0044 {
0045     connect(&mLyricsValueWatcher, &QFutureWatcher<QString>::finished,
0046             this, &TrackMetadataModel::lyricsValueIsReady);
0047 }
0048 
0049 TrackMetadataModel::~TrackMetadataModel()
0050 {
0051     if (mLyricsValueWatcher.isRunning() && !mLyricsValueWatcher.isFinished()) {
0052         mLyricsValueWatcher.waitForFinished();
0053     }
0054 }
0055 
0056 int TrackMetadataModel::rowCount(const QModelIndex &parent) const
0057 {
0058     if (parent.isValid()) {
0059         return 0;
0060     }
0061 
0062     return mDisplayKeys.count();
0063 }
0064 
0065 QVariant TrackMetadataModel::data(const QModelIndex &index, int role) const
0066 {
0067     auto result = QVariant{};
0068 
0069     const auto currentKey = mDisplayKeys[index.row()];
0070 
0071     switch (role)
0072     {
0073     case Qt::DisplayRole:
0074         switch (currentKey)
0075         {
0076         case DataTypes::TrackNumberRole:
0077         {
0078             auto trackNumber = mDisplayData.trackNumber();
0079             if (trackNumber > 0) {
0080                 result = trackNumber;
0081             }
0082             break;
0083         }
0084         case DataTypes::DiscNumberRole:
0085         {
0086             auto discNumber = mDisplayData.discNumber();
0087             if (discNumber > 0) {
0088                 result = discNumber;
0089             }
0090             break;
0091         }
0092         case DataTypes::ChannelsRole:
0093         {
0094             auto channels = mDisplayData.channels();
0095             if (channels > 0) {
0096                 result = channels;
0097             }
0098             break;
0099         }
0100         case DataTypes::BitRateRole:
0101         {
0102             auto bitRate = mDisplayData.bitRate();
0103             if (bitRate > 0) {
0104                 result = KFormat().formatValue(bitRate, QStringLiteral("bit/s"), 0,
0105                                                KFormat::UnitPrefix::Kilo, KFormat::MetricBinaryDialect);
0106             }
0107             break;
0108         }
0109         case DataTypes::SampleRateRole:
0110         {
0111             auto sampleRate = mDisplayData.sampleRate();
0112             if (sampleRate > 0) {
0113                 result = KFormat().formatValue(sampleRate, KFormat::Unit::Hertz, 1,
0114                                                KFormat::UnitPrefix::Kilo, KFormat::MetricBinaryDialect);
0115             }
0116             break;
0117         }
0118         case DataTypes::DurationRole:
0119         {
0120             auto trackDuration = mDisplayData.duration();
0121             if (trackDuration.hour() == 0) {
0122                 result = trackDuration.toString(QStringLiteral("mm:ss"));
0123             } else {
0124                 result = trackDuration.toString();
0125             }
0126             break;
0127         }
0128         default:
0129             result = mDisplayData[currentKey];
0130             break;
0131         }
0132         break;
0133     case ItemNameRole:
0134         result = nameFromRole(currentKey);
0135         break;
0136     case ItemTypeRole:
0137         switch (currentKey)
0138         {
0139         case DataTypes::TitleRole:
0140             result = TextEntry;
0141             break;
0142         case DataTypes::ResourceRole:
0143         case DataTypes::ImageUrlRole:
0144             result = UrlEntry;
0145             break;
0146         case DataTypes::ArtistRole:
0147             result = TextEntry;
0148             break;
0149         case DataTypes::AlbumRole:
0150             result = TextEntry;
0151             break;
0152         case DataTypes::AlbumArtistRole:
0153             result = TextEntry;
0154             break;
0155         case DataTypes::TrackNumberRole:
0156             result = IntegerEntry;
0157             break;
0158         case DataTypes::DiscNumberRole:
0159             result = IntegerEntry;
0160             break;
0161         case DataTypes::RatingRole:
0162             result = RatingEntry;
0163             break;
0164         case DataTypes::GenreRole:
0165             result = TextEntry;
0166             break;
0167         case DataTypes::LyricistRole:
0168             result = TextEntry;
0169             break;
0170         case DataTypes::ComposerRole:
0171             result = TextEntry;
0172             break;
0173         case DataTypes::CommentRole:
0174             result = TextEntry;
0175             break;
0176         case DataTypes::YearRole:
0177             result = IntegerEntry;
0178             break;
0179         case DataTypes::LastPlayDate:
0180             result = DateEntry;
0181             break;
0182         case DataTypes::PlayCounter:
0183             result = IntegerEntry;
0184             break;
0185         case DataTypes::LyricsRole:
0186             result = LongTextEntry;
0187             break;
0188         case DataTypes::SampleRateRole:
0189             result = IntegerEntry;
0190             break;
0191         case DataTypes::BitRateRole:
0192             result = IntegerEntry;
0193             break;
0194         case DataTypes::ChannelsRole:
0195             result = IntegerEntry;
0196             break;
0197         case DataTypes::FirstPlayDate:
0198             result = DateEntry;
0199             break;
0200         case DataTypes::DurationRole:
0201             result = DurationEntry;
0202             break;
0203         case DataTypes::SecondaryTextRole:
0204         case DataTypes::ShadowForImageRole:
0205         case DataTypes::ChildModelRole:
0206         case DataTypes::StringDurationRole:
0207         case DataTypes::IsValidAlbumArtistRole:
0208         case DataTypes::AllArtistsRole:
0209         case DataTypes::HighestTrackRating:
0210         case DataTypes::IdRole:
0211         case DataTypes::ParentIdRole:
0212         case DataTypes::DatabaseIdRole:
0213         case DataTypes::IsSingleDiscAlbumRole:
0214         case DataTypes::ContainerDataRole:
0215         case DataTypes::IsPartialDataRole:
0216         case DataTypes::AlbumIdRole:
0217         case DataTypes::HasEmbeddedCover:
0218         case DataTypes::FileModificationTime:
0219         case DataTypes::ElementTypeRole:
0220         case DataTypes::FullDataRole:
0221         case DataTypes::IsDirectoryRole:
0222         case DataTypes::IsPlayListRole:
0223         case DataTypes::FilePathRole:
0224         case DataTypes::HasChildrenRole:
0225         case DataTypes::MultipleImageUrlsRole:
0226             break;
0227         }
0228         break;
0229     }
0230 
0231     return result;
0232 }
0233 
0234 bool TrackMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role)
0235 {
0236     if (data(index, role) != value) {
0237         auto dataType = mDisplayKeys[index.row()];
0238 
0239         mDisplayData[dataType] = value;
0240 
0241         Q_EMIT dataChanged(index, index, QVector<int>() << role);
0242         return true;
0243     }
0244     return false;
0245 }
0246 
0247 void TrackMetadataModel::saveChanges()
0248 {
0249     mFullData.insert(mDisplayData);
0250 }
0251 
0252 void TrackMetadataModel::undoChanges()
0253 {
0254     resetDisplayData();
0255 }
0256 
0257 QHash<int, QByteArray> TrackMetadataModel::roleNames() const
0258 {
0259     auto names = QAbstractListModel::roleNames();
0260 
0261     names[ItemNameRole] = "name";
0262     names[ItemTypeRole] = "type";
0263 
0264     return names;
0265 }
0266 
0267 QString TrackMetadataModel::fileUrl() const
0268 {
0269     if (mFileUrl.isLocalFile()) {
0270         return mFileUrl.toLocalFile();
0271     } else {
0272         return mFileUrl.toString();
0273     }
0274 }
0275 
0276 QUrl TrackMetadataModel::coverUrl() const
0277 {
0278     if (mCoverImage.isEmpty()) {
0279         return QUrl(QStringLiteral("image://icon/media-default-album"));
0280     } else {
0281         return mCoverImage;
0282     }
0283 }
0284 
0285 MusicListenersManager *TrackMetadataModel::manager() const
0286 {
0287     return mManager;
0288 }
0289 
0290 QString TrackMetadataModel::lyrics() const
0291 {
0292     return mFullData[TrackDataType::key_type::LyricsRole].toString();
0293 }
0294 
0295 qulonglong TrackMetadataModel::databaseId() const
0296 {
0297     return mDatabaseId;
0298 }
0299 
0300 void TrackMetadataModel::trackData(const TrackMetadataModel::TrackDataType &trackData)
0301 {
0302     if (!mFileUrl.isEmpty() && trackData.resourceURI() != mFileUrl) {
0303         return;
0304     }
0305 
0306     fillDataFromTrackData(trackData);
0307 }
0308 
0309 void TrackMetadataModel::fillDataFromTrackData(const TrackMetadataModel::TrackDataType &trackData)
0310 {
0311     mFullData = trackData;
0312     resetDisplayData();
0313 
0314     if (trackData.hasDatabaseId()) {
0315         fetchLyrics();
0316     } else {
0317         Q_EMIT lyricsChanged();
0318     }
0319 
0320     mDatabaseId = trackData[DataTypes::DatabaseIdRole].toULongLong();
0321     Q_EMIT databaseIdChanged();
0322 
0323     mCoverImage = trackData[DataTypes::ImageUrlRole].toUrl();
0324     Q_EMIT coverUrlChanged();
0325 
0326     auto rawFileUrl = trackData[DataTypes::ResourceRole].toUrl();
0327 
0328     mFileUrl = rawFileUrl;
0329     Q_EMIT fileUrlChanged();
0330 }
0331 
0332 void TrackMetadataModel::resetDisplayData()
0333 {
0334     const auto fieldsForTrack = displayFields(mFullData.elementType());
0335     beginResetModel();
0336     mDisplayData.clear();
0337     mDisplayKeys.clear();
0338 
0339     for (DataTypes::ColumnsRoles role : fieldsForTrack) {
0340         if (mFullData.constFind(role) != mFullData.constEnd()) {
0341             mDisplayKeys.push_back(role);
0342             mDisplayData[role] = mFullData[role];
0343         }
0344     }
0345     filterDataFromTrackData();
0346     endResetModel();
0347 }
0348 
0349 void TrackMetadataModel::filterDataFromTrackData()
0350 {
0351 }
0352 
0353 void TrackMetadataModel::removeMetaData(DataTypes::ColumnsRoles metaData)
0354 {
0355     auto itMetaData = std::find(mDisplayKeys.cbegin(), mDisplayKeys.cend(), metaData);
0356     if (itMetaData == mDisplayKeys.cend()) {
0357         return;
0358     }
0359 
0360     mDisplayKeys.erase(itMetaData);
0361     mDisplayData.remove(metaData);
0362 }
0363 
0364 TrackMetadataModel::TrackDataType::mapped_type TrackMetadataModel::dataFromType(TrackDataType::key_type metaData) const
0365 {
0366     return mFullData[metaData];
0367 }
0368 
0369 void TrackMetadataModel::fillLyricsDataFromTrack()
0370 {
0371     beginInsertRows({}, mDisplayData.size(), mDisplayData.size());
0372     mDisplayKeys.push_back(DataTypes::LyricsRole);
0373     mDisplayData[DataTypes::LyricsRole] = mLyricsValueWatcher.result();
0374     endInsertRows();
0375 }
0376 
0377 const TrackMetadataModel::TrackDataType &TrackMetadataModel::allTrackData() const
0378 {
0379     return mFullData;
0380 }
0381 
0382 void TrackMetadataModel::lyricsValueIsReady()
0383 {
0384     if (!mLyricsValueWatcher.result().isEmpty()) {
0385         fillLyricsDataFromTrack();
0386 
0387         mFullData[DataTypes::LyricsRole] = mLyricsValueWatcher.result();
0388 
0389         Q_EMIT lyricsChanged();
0390     }
0391 }
0392 
0393 void TrackMetadataModel::initializeByIdAndUrl(ElisaUtils::PlayListEntryType type, qulonglong databaseId, const QUrl &url)
0394 {
0395     if (!mFullData.isEmpty()) {
0396         beginResetModel();
0397         mFullData.clear();
0398         mDisplayData.clear();
0399         mCoverImage.clear();
0400         mFileUrl.clear();
0401         endResetModel();
0402 
0403         Q_EMIT lyricsChanged();
0404     }
0405 
0406     mFileUrl = url;
0407     mDatabaseId = databaseId;
0408 
0409     Q_EMIT needDataByDatabaseIdAndUrl(type, databaseId, url);
0410 }
0411 
0412 void TrackMetadataModel::initialize(MusicListenersManager *newManager, DatabaseInterface *trackDatabase)
0413 {
0414     mManager = newManager;
0415     Q_EMIT managerChanged();
0416 
0417     if (mManager) {
0418         mDataLoader.setDatabase(mManager->viewDatabase());
0419     } else if (trackDatabase) {
0420         mDataLoader.setDatabase(trackDatabase);
0421     }
0422 
0423     if (mManager) {
0424         mManager->connectModel(&mDataLoader);
0425     }
0426 
0427     connect(this, &TrackMetadataModel::needDataByDatabaseIdAndUrl,
0428             &mDataLoader, &ModelDataLoader::loadDataByDatabaseIdAndUrl);
0429     connect(this, &TrackMetadataModel::needDataByUrl,
0430             &mDataLoader, &ModelDataLoader::loadDataByUrl);
0431     connect(&mDataLoader, &ModelDataLoader::trackModified,
0432             this, &TrackMetadataModel::trackData);
0433     connect(&mDataLoader, &ModelDataLoader::allTrackData,
0434             this, &TrackMetadataModel::trackData);
0435     connect(&mDataLoader, &ModelDataLoader::allRadioData,
0436             this, &TrackMetadataModel::radioData);
0437     connect(&mDataLoader, &ModelDataLoader::radioAdded,
0438             this, &TrackMetadataModel::radioData);
0439     connect(&mDataLoader, &ModelDataLoader::radioModified,
0440             this, &TrackMetadataModel::radioData);
0441 }
0442 
0443 ModelDataLoader &TrackMetadataModel::modelDataLoader()
0444 {
0445     return mDataLoader;
0446 }
0447 
0448 const TrackMetadataModel::TrackDataType &TrackMetadataModel::displayedTrackData() const
0449 {
0450     return mDisplayData;
0451 }
0452 
0453 DataTypes::ColumnsRoles TrackMetadataModel::trackKey(int index) const
0454 {
0455     return mDisplayKeys[index];
0456 }
0457 
0458 void TrackMetadataModel::removeDataByIndex(int index)
0459 {
0460     auto dataKey = mDisplayKeys[index];
0461 
0462     mDisplayData[dataKey] = {};
0463     mDisplayKeys.removeAt(index);
0464 }
0465 
0466 void TrackMetadataModel::addDataByName(const QString &name)
0467 {
0468     DataTypes::ColumnsRoles newRole = DataTypes::TitleRole;
0469 
0470     if (name == i18nc("@label:textbox Track title for track metadata view", "Title")) {
0471         newRole = DataTypes::TitleRole;
0472     } else if (name == i18nc("@label:textbox Track artist for track metadata view", "Artist")) {
0473         newRole = DataTypes::ArtistRole;
0474     } else if (name == i18nc("@label:textbox Album name for track metadata view", "Album")) {
0475         newRole = DataTypes::AlbumRole;
0476     } else if (name == i18nc("@label:textbox Album artist for track metadata view", "Album Artist")) {
0477         newRole = DataTypes::AlbumArtistRole;
0478     } else if (name == i18nc("@label:textbox Track number for track metadata view", "Track Number")) {
0479         newRole = DataTypes::TrackNumberRole;
0480     } else if (name == i18nc("@label:textbox Disc number for track metadata view", "Disc Number")) {
0481         newRole = DataTypes::DiscNumberRole;
0482     } else if (name == i18nc("@label:textbox Rating label for information panel", "Rating")) {
0483         newRole = DataTypes::RatingRole;
0484     } else if (name == i18nc("@label:textbox Genre label for track metadata view", "Genre")) {
0485         newRole = DataTypes::GenreRole;
0486     } else if (name == i18nc("@label:textbox Lyricist label for track metadata view", "Lyricist")) {
0487         newRole = DataTypes::LyricistRole;
0488     } else if (name == i18nc("@label:textbox Composer name for track metadata view", "Composer")) {
0489         newRole = DataTypes::ComposerRole;
0490     } else if (name == i18nc("@label:textbox Comment label for track metadata view", "Comment")) {
0491         newRole = DataTypes::CommentRole;
0492     } else if (name == i18nc("@label:textbox Year label for track metadata view", "Year")) {
0493         newRole = DataTypes::YearRole;
0494     } else if (name == i18nc("@label:textbox Channels label for track metadata view", "Channels")) {
0495         newRole = DataTypes::ChannelsRole;
0496     } else if (name == i18nc("@label:textbox Bit rate label for track metadata view", "Bit Rate")) {
0497         newRole = DataTypes::BitRateRole;
0498     } else if (name == i18nc("@label:textbox Sample Rate label for track metadata view", "Sample Rate")) {
0499         newRole = DataTypes::SampleRateRole;
0500     } else if (name == i18nc("@label:textbox Lyrics label for track metadata view", "Lyrics")) {
0501         newRole = DataTypes::LyricsRole;
0502     } else if (name == i18nc("@label:textbox Duration label for track metadata view", "Duration")) {
0503         newRole = DataTypes::DurationRole;
0504     }
0505 
0506     mDisplayData[newRole] = {};
0507     mDisplayKeys.push_back(newRole);
0508 }
0509 
0510 QString TrackMetadataModel::nameFromRole(DataTypes::ColumnsRoles role)
0511 {
0512     auto result = QString{};
0513     switch (role)
0514     {
0515     case DataTypes::TitleRole:
0516         result = i18nc("@label:textbox Track title for track metadata view", "Title");
0517         break;
0518     case DataTypes::DurationRole:
0519         result = i18nc("@label:textbox Duration label for track metadata view", "Duration");
0520         break;
0521     case DataTypes::ArtistRole:
0522         result = i18nc("@label:textbox Track artist for track metadata view", "Artist");
0523         break;
0524     case DataTypes::AlbumRole:
0525         result = i18nc("@label:textbox Album name for track metadata view", "Album");
0526         break;
0527     case DataTypes::AlbumArtistRole:
0528         result = i18nc("@label:textbox Album artist for track metadata view", "Album Artist");
0529         break;
0530     case DataTypes::TrackNumberRole:
0531         result = i18nc("@label:textbox Track number for track metadata view", "Track Number");
0532         break;
0533     case DataTypes::DiscNumberRole:
0534         result = i18nc("@label:textbox Disc number for track metadata view", "Disc Number");
0535         break;
0536     case DataTypes::RatingRole:
0537         result = i18nc("@label:textbox Rating label for information panel", "Rating");
0538         break;
0539     case DataTypes::GenreRole:
0540         result = i18nc("@label:textbox Genre label for track metadata view", "Genre");
0541         break;
0542     case DataTypes::LyricistRole:
0543         result = i18nc("@label:textbox Lyricist label for track metadata view", "Lyricist");
0544         break;
0545     case DataTypes::ComposerRole:
0546         result = i18nc("@label:textbox Composer name for track metadata view", "Composer");
0547         break;
0548     case DataTypes::CommentRole:
0549         result = i18nc("@label:textbox Comment label for track metadata view", "Comment");
0550         break;
0551     case DataTypes::YearRole:
0552         result = i18nc("@label:textbox Year label for track metadata view", "Year");
0553         break;
0554     case DataTypes::ChannelsRole:
0555         result = i18nc("@label:textbox Channels label for track metadata view", "Channels");
0556         break;
0557     case DataTypes::BitRateRole:
0558         result = i18nc("@label:textbox Bit rate label for track metadata view", "Bit Rate");
0559         break;
0560     case DataTypes::SampleRateRole:
0561         result = i18nc("@label:textbox Sample Rate label for track metadata view", "Sample Rate");
0562         break;
0563     case DataTypes::LastPlayDate:
0564         result = i18nc("@label:textbox Last play date label for track metadata view", "Last played");
0565         break;
0566     case DataTypes::FirstPlayDate:
0567         result = i18nc("@label:textbox First play date label for track metadata view", "First played");
0568         break;
0569     case DataTypes::PlayCounter:
0570         result = i18nc("@label:textbox Play counter label for track metadata view", "Play count");
0571         break;
0572     case DataTypes::LyricsRole:
0573         result = i18nc("@label:textbox Lyrics label for track metadata view", "Lyrics");
0574         break;
0575     case DataTypes::ResourceRole:
0576         result = i18nc("@label:textbox Radio HTTP address for radio metadata view", "Stream Http Address");
0577         break;
0578     case DataTypes::ImageUrlRole:
0579         result = i18nc("@label:textbox Image address for radio metadata view", "Image Address");
0580         break;
0581     case DataTypes::SecondaryTextRole:
0582     case DataTypes::ShadowForImageRole:
0583     case DataTypes::ChildModelRole:
0584     case DataTypes::StringDurationRole:
0585     case DataTypes::IsValidAlbumArtistRole:
0586     case DataTypes::AllArtistsRole:
0587     case DataTypes::HighestTrackRating:
0588     case DataTypes::IdRole:
0589     case DataTypes::ParentIdRole:
0590     case DataTypes::DatabaseIdRole:
0591     case DataTypes::IsSingleDiscAlbumRole:
0592     case DataTypes::ContainerDataRole:
0593     case DataTypes::IsPartialDataRole:
0594     case DataTypes::AlbumIdRole:
0595     case DataTypes::HasEmbeddedCover:
0596     case DataTypes::FileModificationTime:
0597     case DataTypes::ElementTypeRole:
0598     case DataTypes::FullDataRole:
0599     case DataTypes::IsDirectoryRole:
0600     case DataTypes::IsPlayListRole:
0601     case DataTypes::FilePathRole:
0602     case DataTypes::HasChildrenRole:
0603     case DataTypes::MultipleImageUrlsRole:
0604         break;
0605     }
0606     return result;
0607 }
0608 
0609 bool TrackMetadataModel::metadataExists(DataTypes::ColumnsRoles metadataRole) const
0610 {
0611     return std::find(mDisplayKeys.begin(), mDisplayKeys.end(), metadataRole) != mDisplayKeys.end();
0612 }
0613 
0614 void TrackMetadataModel::fetchLyrics()
0615 {
0616     auto fileUrl = mFullData[DataTypes::ResourceRole].toUrl();
0617     auto lyricicsValue = QtConcurrent::run(QThreadPool::globalInstance(), [fileUrl, this]() {
0618         auto locker = QMutexLocker(&mFileScannerMutex);
0619         auto trackData = mFileScanner.scanOneFile(fileUrl);
0620         if (!trackData.lyrics().isEmpty()) {
0621             return trackData.lyrics();
0622         }
0623         return QString{};
0624     });
0625 
0626     mLyricsValueWatcher.setFuture(lyricicsValue);
0627 }
0628 
0629 void TrackMetadataModel::initializeForNewRadio()
0630 {
0631     mFullData.clear();
0632     mDisplayData.clear();
0633 
0634     fillDataForNewRadio();
0635 }
0636 
0637 void TrackMetadataModel::fillDataForNewRadio()
0638 {
0639     beginResetModel();
0640     mFullData.clear();
0641     mDisplayData.clear();
0642     mDisplayKeys.clear();
0643 
0644     auto allRoles = {DataTypes::TitleRole, DataTypes::ResourceRole,
0645                      DataTypes::CommentRole, DataTypes::ImageUrlRole};
0646 
0647     for (auto role : allRoles) {
0648         mDisplayKeys.push_back(role);
0649         if (role == DataTypes::DatabaseIdRole) {
0650             mFullData[role] = -1;
0651         } else {
0652             mFullData[role] = QString();
0653         }
0654     }
0655     mDisplayData = mFullData;
0656     mFullData[DataTypes::ElementTypeRole] = ElisaUtils::Radio;
0657     filterDataFromTrackData();
0658     endResetModel();
0659 }
0660 
0661 void TrackMetadataModel::initializeByUrl(ElisaUtils::PlayListEntryType type, const QUrl &url)
0662 {
0663     mFullData.clear();
0664     mDisplayData.clear();
0665     mCoverImage.clear();
0666     mFileUrl.clear();
0667 
0668     Q_EMIT lyricsChanged();
0669 
0670     mFileUrl = url;
0671 
0672     Q_EMIT needDataByUrl(type, url);
0673 }
0674 
0675 void TrackMetadataModel::setManager(MusicListenersManager *newManager)
0676 {
0677     initialize(newManager, nullptr);
0678 }
0679 
0680 void TrackMetadataModel::setDatabase(DatabaseInterface *trackDatabase)
0681 {
0682     initialize(nullptr, trackDatabase);
0683 }
0684 
0685 void TrackMetadataModel::radioData(const TrackDataType &radiosData)
0686 {
0687     if (!mFullData.isEmpty() && mFullData[DataTypes::DatabaseIdRole].toInt() != -1 &&
0688             mFullData.databaseId() != radiosData.databaseId()) {
0689         return;
0690     }
0691 
0692     fillDataFromTrackData(radiosData);
0693 }
0694 
0695 #include "moc_trackmetadatamodel.cpp"