diff --git a/src/filescanner.cpp b/src/filescanner.cpp index d4311567..ea781abe 100644 --- a/src/filescanner.cpp +++ b/src/filescanner.cpp @@ -1,317 +1,273 @@ /* * Copyright 2018 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "filescanner.h" #include "config-upnp-qt.h" #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND #include #include #include #include #include #include #if defined KF5Baloo_FOUND && KF5Baloo_FOUND #include #endif #endif #include #include #include class FileScannerPrivate { public: static const QStringList constSearchStrings; #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND KFileMetaData::ExtractorCollection mAllExtractors; KFileMetaData::PropertyMap mAllProperties; - QString checkForMultipleEntries(KFileMetaData::Property::Property property); - KFileMetaData::EmbeddedImageData mImageScanner; #endif }; const QStringList FileScannerPrivate::constSearchStrings = { QStringLiteral("*[Cc]over*.jpg"), QStringLiteral("*[Cc]over*.png"), QStringLiteral("*[Ff]older*.jpg"), QStringLiteral("*[Ff]older*.png"), QStringLiteral("*[Ff]ront*.jpg"), QStringLiteral("*[Ff]ront*.png") }; FileScanner::FileScanner() : d(std::make_unique()) { } FileScanner::~FileScanner() = default; MusicAudioTrack FileScanner::scanOneFile(const QUrl &scanFile, const QMimeDatabase &mimeDatabase) { #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND MusicAudioTrack newTrack; auto localFileName = scanFile.toLocalFile(); QFileInfo scanFileInfo(localFileName); newTrack.setFileModificationTime(scanFileInfo.fileTime(QFile::FileModificationTime)); newTrack.setResourceURI(scanFile); const auto &fileMimeType = mimeDatabase.mimeTypeForFile(localFileName); if (!fileMimeType.name().startsWith(QStringLiteral("audio/"))) { return newTrack; } QString mimetype = fileMimeType.name(); QList exList = d->mAllExtractors.fetchExtractors(mimetype); if (exList.isEmpty()) { return newTrack; } KFileMetaData::Extractor* ex = exList.first(); KFileMetaData::SimpleExtractionResult result(localFileName, mimetype, KFileMetaData::ExtractionResult::ExtractMetaData); ex->extract(&result); d->mAllProperties = result.properties(); scanProperties(localFileName, newTrack); return newTrack; #else Q_UNUSED(scanFile) Q_UNUSED(mimeDatabase) return {}; #endif } void FileScanner::scanProperties(const Baloo::File &match, MusicAudioTrack &trackData) { #if defined KF5Baloo_FOUND && KF5Baloo_FOUND d->mAllProperties = match.properties(); scanProperties(match.path(), trackData); #else Q_UNUSED(match) Q_UNUSED(trackData) #endif } void FileScanner::scanProperties(const QString &localFileName, MusicAudioTrack &trackData) { #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND - auto artistString = d->checkForMultipleEntries(KFileMetaData::Property::Artist); - auto albumArtistString = d->checkForMultipleEntries(KFileMetaData::Property::AlbumArtist); - auto genreString = d->checkForMultipleEntries(KFileMetaData::Property::Genre); - auto composerString = d->checkForMultipleEntries(KFileMetaData::Property::Composer); - auto lyricistString = d->checkForMultipleEntries(KFileMetaData::Property::Lyricist); - - auto titleProperty = d->mAllProperties.find(KFileMetaData::Property::Title); - auto durationProperty = d->mAllProperties.find(KFileMetaData::Property::Duration); - auto albumProperty = d->mAllProperties.find(KFileMetaData::Property::Album); - auto trackNumberProperty = d->mAllProperties.find(KFileMetaData::Property::TrackNumber); - auto discNumberProperty = d->mAllProperties.find(KFileMetaData::Property::DiscNumber); - auto yearProperty = d->mAllProperties.find(KFileMetaData::Property::ReleaseYear); - auto lyricsProperty = d->mAllProperties.find(KFileMetaData::Property::Lyrics); - auto channelsProperty = d->mAllProperties.find(KFileMetaData::Property::Channels); - auto bitRateProperty = d->mAllProperties.find(KFileMetaData::Property::BitRate); - auto sampleRateProperty = d->mAllProperties.find(KFileMetaData::Property::SampleRate); - auto commentProperty = d->mAllProperties.find(KFileMetaData::Property::Comment); - auto ratingProperty = d->mAllProperties.find(KFileMetaData::Property::Rating); -#if !defined Q_OS_ANDROID - auto fileData = KFileMetaData::UserMetaData(localFileName); -#endif - - if (!artistString.isEmpty()) { - trackData.setArtist(artistString); - } - - if (!albumArtistString.isEmpty()) { - trackData.setAlbumArtist(albumArtistString); - } - - if (!genreString.isEmpty()) { - trackData.setGenre(genreString); - } - - if (!composerString.isEmpty()) { - trackData.setComposer(composerString); - } - - if (!lyricistString.isEmpty()) { - trackData.setLyricist(lyricistString); - } - - if (albumProperty != d->mAllProperties.end()) { - trackData.setAlbumName(albumProperty->toString()); - } - - if (durationProperty != d->mAllProperties.end()) { - trackData.setDuration(QTime::fromMSecsSinceStartOfDay(int(1000 * durationProperty->toDouble()))); - } - - if (titleProperty != d->mAllProperties.end()) { - trackData.setTitle(titleProperty->toString()); - } - - if (trackNumberProperty != d->mAllProperties.end()) { - trackData.setTrackNumber(trackNumberProperty->toInt()); - } - - if (discNumberProperty != d->mAllProperties.end()) { - trackData.setDiscNumber(discNumberProperty->toInt()); - } - - if (yearProperty != d->mAllProperties.end()) { - trackData.setYear(yearProperty->toInt()); - } - - if (channelsProperty != d->mAllProperties.end()) { - trackData.setChannels(channelsProperty->toInt()); - } - - if (bitRateProperty != d->mAllProperties.end()) { - trackData.setBitRate(bitRateProperty->toInt()); - } - - if (sampleRateProperty != d->mAllProperties.end()) { - trackData.setSampleRate(sampleRateProperty->toInt()); - } - - if (lyricsProperty != d->mAllProperties.end()) { - trackData.setLyrics(lyricsProperty->toString()); + if (d->mAllProperties.isEmpty()) { + return; } - - if (trackData.artist().isEmpty()) { - trackData.setArtist(trackData.albumArtist()); + using entry = std::pair; + + auto rangeBegin = d->mAllProperties.constKeyValueBegin(); + QVariant value; + while (rangeBegin != d->mAllProperties.constKeyValueEnd()) { + auto key = (*rangeBegin).first; + + auto rangeEnd = std::find_if(rangeBegin, d->mAllProperties.constKeyValueEnd(), + [key](const entry& e) { return e.first != key; }); + + auto distance = std::distance(rangeBegin, rangeEnd); + if (distance > 1) { + QStringList list; + list.reserve(static_cast(distance)); + std::for_each(rangeBegin, rangeEnd, [&list](const entry& s) { list.append(s.second.toString()); }); + value = QLocale().createSeparatedList(list); + } else { + value = (*rangeBegin).second; + } + switch (key) + { + case KFileMetaData::Property::Artist: + trackData.setArtist(value.toString()); + break; + case KFileMetaData::Property::AlbumArtist: + trackData.setAlbumArtist(value.toString()); + break; + case KFileMetaData::Property::Genre: + trackData.setGenre(value.toString()); + break; + case KFileMetaData::Property::Composer: + trackData.setComposer(value.toString()); + break; + case KFileMetaData::Property::Lyricist: + trackData.setLyricist(value.toString()); + break; + case KFileMetaData::Property::Title: + trackData.setTitle(value.toString()); + break; + case KFileMetaData::Property::Duration: + trackData.setDuration(QTime::fromMSecsSinceStartOfDay(int(1000 * value.toDouble()))); + break; + case KFileMetaData::Property::Album: + trackData.setAlbumName(value.toString()); + break; + case KFileMetaData::Property::TrackNumber: + trackData.setTrackNumber(value.toInt()); + break; + case KFileMetaData::Property::DiscNumber: + trackData.setDiscNumber(value.toInt()); + break; + case KFileMetaData::Property::ReleaseYear: + trackData.setYear(value.toInt()); + break; + case KFileMetaData::Property::Lyrics: + trackData.setLyrics(value.toString()); + break; + case KFileMetaData::Property::Channels: + trackData.setChannels(value.toInt()); + break; + case KFileMetaData::Property::BitRate: + trackData.setBitRate(value.toInt()); + break; + case KFileMetaData::Property::SampleRate: + trackData.setSampleRate(value.toInt()); + break; + case KFileMetaData::Property::Comment: + trackData.setComment(value.toString()); + break; + case KFileMetaData::Property::Rating: + trackData.setRating(value.toInt()); + break; + default: + break; + } + rangeBegin = rangeEnd; } #if !defined Q_OS_ANDROID && !defined Q_OS_WIN + auto fileData = KFileMetaData::UserMetaData(localFileName); QString comment = fileData.userComment(); if (!comment.isEmpty()) { trackData.setComment(comment); - } else if (commentProperty != d->mAllProperties.end()) { - trackData.setComment(commentProperty->toString()); } int rating = fileData.rating(); if (rating > 0) { trackData.setRating(rating); - } else if (ratingProperty != d->mAllProperties.end()) { - trackData.setRating(ratingProperty->toInt()); - } else { - trackData.setRating(0); - } -#else - if (ratingProperty != d->mAllProperties.end()) { - trackData.setRating(ratingProperty->toInt()); - } else { - trackData.setRating(0); - } - - if (commentProperty != d->mAllProperties.end()) { - trackData.setComment(commentProperty->toString()); } #endif if (!trackData.duration().isValid()) { return; } trackData.setValid(true); #else Q_UNUSED(localFileName) Q_UNUSED(trackData) #endif } -#if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND -QString FileScannerPrivate::checkForMultipleEntries(KFileMetaData::Property::Property property) -{ - if (mAllProperties.count(property) > 1) { - auto propertyList = mAllProperties.values(property); - return QLocale().createSeparatedList(QVariant(propertyList).toStringList()); - } else { - auto variantResult = mAllProperties.find(property); - if (variantResult != mAllProperties.end()) { - auto value = variantResult.value(); - if (value.type() == QVariant::List || value.type() == QVariant::StringList) { - return QLocale().createSeparatedList(value.toStringList()); - } else { - return value.toString(); - } - } else { - return QString(); - } - } -} -#endif - QUrl FileScanner::searchForCoverFile(const QString &localFileName) { QFileInfo trackFilePath(localFileName); QDir trackFileDir = trackFilePath.absoluteDir(); trackFileDir.setFilter(QDir::Files); trackFileDir.setNameFilters(d->constSearchStrings); QFileInfoList coverFiles = trackFileDir.entryInfoList(); if (coverFiles.isEmpty()) { QString dirNamePattern = QStringLiteral("*") + trackFileDir.dirName() + QStringLiteral("*"); QString dirNameNoSpaces = dirNamePattern.remove(QLatin1Char(' ')); QStringList filters = { dirNamePattern + QStringLiteral(".jpg"), dirNamePattern + QStringLiteral(".png"), dirNameNoSpaces + QStringLiteral(".jpg"), dirNameNoSpaces + QStringLiteral(".png") }; trackFileDir.setNameFilters(filters); coverFiles = trackFileDir.entryInfoList(); } if (coverFiles.isEmpty()) { return QUrl(); } return QUrl::fromLocalFile(coverFiles.first().absoluteFilePath()); } bool FileScanner::checkEmbeddedCoverImage(const QString &localFileName) { #if defined KF5FileMetaData_FOUND && KF5FileMetaData_FOUND auto imageData = d->mImageScanner.imageData(localFileName); if (imageData.contains(KFileMetaData::EmbeddedImageData::FrontCover)) { if (!imageData[KFileMetaData::EmbeddedImageData::FrontCover].isEmpty()) { return true; } } #endif return false; } diff --git a/src/musicaudiotrack.cpp b/src/musicaudiotrack.cpp index 505cb4fb..b377a29d 100644 --- a/src/musicaudiotrack.cpp +++ b/src/musicaudiotrack.cpp @@ -1,605 +1,605 @@ /* * Copyright 2016-2017 Matthieu Gallien * * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "musicaudiotrack.h" #include #include #include #include class MusicAudioTrackPrivate : public QSharedData { public: MusicAudioTrackPrivate() = default; MusicAudioTrackPrivate(bool aValid, QString aId, QString aParentId, QString aTitle, QString aArtist, QString aAlbumName, QString aAlbumArtist, int aTrackNumber, int aDiscNumber, QTime aDuration, QUrl aResourceURI, QDateTime fileModificationTime, QUrl aAlbumCover, int rating, bool aIsSingleDiscAlbum, QString aGenre, QString aComposer, QString aLyricist, bool aHasEmbeddedCover) : QSharedData(), mId(std::move(aId)), mParentId(std::move(aParentId)), mTitle(std::move(aTitle)), mArtist(std::move(aArtist)), mAlbumName(std::move(aAlbumName)), mAlbumArtist(std::move(aAlbumArtist)), mGenre(std::move(aGenre)), mComposer(std::move(aComposer)), mLyricist(std::move(aLyricist)), mLyrics(), mResourceURI(std::move(aResourceURI)), mAlbumCover(std::move(aAlbumCover)), mFileModificationTime(std::move(fileModificationTime)), mDuration(aDuration), mTrackNumber(aTrackNumber), mDiscNumber(aDiscNumber), mRating(rating), mIsValid(aValid), mIsSingleDiscAlbum(aIsSingleDiscAlbum), mHasBooleanCover(aHasEmbeddedCover), mTrackNumberIsValid(true), mDiscNumberIsValid(true) { } QString mId; QString mParentId; QString mTitle; QString mArtist; QString mAlbumName; QString mAlbumArtist; QString mGenre; QString mComposer; QString mLyricist; QString mLyrics; QString mComment; QUrl mResourceURI; QUrl mAlbumCover; qulonglong mDatabaseId = 0; qulonglong mAlbumId = 0; QDateTime mFileModificationTime; QTime mDuration; int mTrackNumber = -1; int mDiscNumber = -1; int mChannels = -1; int mBitRate = -1; int mSampleRate = -1; int mYear = 0; - int mRating = -1; + int mRating = 0; bool mIsValid = false; bool mIsSingleDiscAlbum = true; bool mHasBooleanCover = false; bool mTrackNumberIsValid = false; bool mDiscNumberIsValid = false; bool mChannelsIsValid = false; bool mBitRateIsValid = false; bool mSampleRateIsValid = false; }; MusicAudioTrack::MusicAudioTrack() : d(new MusicAudioTrackPrivate()) { } MusicAudioTrack::MusicAudioTrack(bool aValid, QString aId, QString aParentId, QString aTitle, QString aArtist, QString aAlbumName, QString aAlbumArtist, int aTrackNumber, int aDiscNumber, QTime aDuration, QUrl aResourceURI, const QDateTime &fileModificationTime, QUrl aAlbumCover, int rating, bool aIsSingleDiscAlbum, QString aGenre, QString aComposer, QString aLyricist, bool aHasEmbeddedCover) : d(new MusicAudioTrackPrivate(aValid, std::move(aId), std::move(aParentId), std::move(aTitle), std::move(aArtist), std::move(aAlbumName), std::move(aAlbumArtist), aTrackNumber, aDiscNumber, aDuration, std::move(aResourceURI), fileModificationTime, std::move(aAlbumCover), rating, aIsSingleDiscAlbum, std::move(aGenre), std::move(aComposer), std::move(aLyricist), aHasEmbeddedCover)) { } MusicAudioTrack::MusicAudioTrack(MusicAudioTrack &&other) noexcept = default; MusicAudioTrack::MusicAudioTrack(const MusicAudioTrack &other) = default; MusicAudioTrack::~MusicAudioTrack() = default; MusicAudioTrack& MusicAudioTrack::operator=(MusicAudioTrack &&other) noexcept = default; MusicAudioTrack& MusicAudioTrack::operator=(const MusicAudioTrack &other) = default; bool MusicAudioTrack::operator <(const MusicAudioTrack &other) const { return d->mDiscNumber < other.d->mDiscNumber || (d->mDiscNumber == other.d->mDiscNumber && d->mTrackNumber < other.d->mTrackNumber); } bool MusicAudioTrack::operator ==(const MusicAudioTrack &other) const { return d->mTitle == other.d->mTitle && d->mArtist == other.d->mArtist && d->mAlbumName == other.d->mAlbumName && d->mAlbumArtist == other.d->mAlbumArtist && d->mTrackNumber == other.d->mTrackNumber && d->mDiscNumber == other.d->mDiscNumber && d->mDuration == other.d->mDuration && d->mResourceURI == other.d->mResourceURI && d->mFileModificationTime == other.d->mFileModificationTime && d->mAlbumCover == other.d->mAlbumCover && d->mRating == other.d->mRating && d->mGenre == other.d->mGenre && d->mComposer == other.d->mComposer && d->mLyricist == other.d->mLyricist && d->mLyrics == other.d->mLyrics && d->mComment == other.d->mComment && d->mYear == other.d->mYear && d->mChannels == other.d->mChannels && d->mBitRate == other.d->mBitRate && d->mSampleRate == other.d->mSampleRate; } bool MusicAudioTrack::operator !=(const MusicAudioTrack &other) const { return d->mTitle != other.d->mTitle || d->mArtist != other.d->mArtist || d->mAlbumName != other.d->mAlbumName || d->mAlbumArtist != other.d->mAlbumArtist || d->mTrackNumber != other.d->mTrackNumber || d->mDiscNumber != other.d->mDiscNumber || d->mDuration != other.d->mDuration || d->mResourceURI != other.d->mResourceURI || d->mFileModificationTime != other.d->mFileModificationTime || d->mAlbumCover != other.d->mAlbumCover || d->mRating != other.d->mRating || d->mGenre != other.d->mGenre || d->mComposer != other.d->mComposer || d->mLyricist != other.d->mLyricist || d->mLyrics != other.d->mLyrics || d->mComment != other.d->mComment || d->mYear != other.d->mYear || d->mChannels != other.d->mChannels || d->mBitRate != other.d->mBitRate || d->mSampleRate != other.d->mSampleRate; } MusicAudioTrack MusicAudioTrack::trackFromData(const DatabaseInterface::TrackDataType &data) { auto result = MusicAudioTrack{}; result.setDatabaseId(data.databaseId()); result.setTitle(data.title()); result.setArtist(data.artist()); result.setAlbumName(data.album()); result.setAlbumArtist(data.albumArtist()); result.setGenre(data.genre()); result.setComposer(data.composer()); result.setLyricist(data.lyricist()); result.setLyrics(data.lyrics()); result.setComment(data.comment()); result.setAlbumCover(data.albumCover()); result.setTrackNumber(data.trackNumber()); result.setDiscNumber(data.discNumber()); result.setYear(data.year()); result.setChannels(data.channels()); result.setBitRate(data.bitRate()); result.setSampleRate(data.sampleRate()); result.setResourceURI(data.resourceURI()); result.setRating(data.rating()); result.setDuration(data[MusicAudioTrack::TrackDataType::key_type::DurationRole].toTime()); result.setFileModificationTime(data.fileModificationTime()); return result; } void MusicAudioTrack::setValid(bool value) { d->mIsValid = value; } bool MusicAudioTrack::isValid() const { return d->mIsValid; } void MusicAudioTrack::setDatabaseId(qulonglong value) { d->mDatabaseId = value; } qulonglong MusicAudioTrack::databaseId() const { return d->mDatabaseId; } void MusicAudioTrack::setAlbumId(qulonglong value) { d->mAlbumId = value; } qulonglong MusicAudioTrack::albumId() const { return d->mAlbumId; } void MusicAudioTrack::setId(const QString &value) { d->mId = value; } QString MusicAudioTrack::id() const { return d->mId; } void MusicAudioTrack::setParentId(const QString &value) { d->mParentId = value; } QString MusicAudioTrack::parentId() const { return d->mParentId; } void MusicAudioTrack::setTitle(const QString &value) { d->mTitle = value; } QString MusicAudioTrack::title() const { return d->mTitle; } void MusicAudioTrack::setArtist(const QString &value) { d->mArtist = value; } QString MusicAudioTrack::artist() const { return d->mArtist; } void MusicAudioTrack::setAlbumName(const QString &value) { d->mAlbumName = value; } QString MusicAudioTrack::albumName() const { return d->mAlbumName; } void MusicAudioTrack::setAlbumArtist(const QString &value) { d->mAlbumArtist = value; } QString MusicAudioTrack::albumArtist() const { return (d->mAlbumArtist.isEmpty() ? d->mArtist : d->mAlbumArtist); } bool MusicAudioTrack::isValidAlbumArtist() const { return !d->mAlbumArtist.isEmpty(); } void MusicAudioTrack::setAlbumCover(const QUrl &value) { d->mAlbumCover = value; } QUrl MusicAudioTrack::albumCover() const { if (d->mAlbumCover.isValid() || !hasEmbeddedCover()) { return d->mAlbumCover; } else { return QUrl(QStringLiteral("image://cover/") + d->mResourceURI.toLocalFile()); } } void MusicAudioTrack::setGenre(const QString &value) { d->mGenre = value; } QString MusicAudioTrack::genre() const { return d->mGenre; } void MusicAudioTrack::setComposer(const QString &value) { d->mComposer = value; } QString MusicAudioTrack::composer() const { return d->mComposer; } void MusicAudioTrack::setLyricist(const QString &value) { d->mLyricist = value; } QString MusicAudioTrack::lyricist() const { return d->mLyricist; } void MusicAudioTrack::setLyrics(const QString &value) { d->mLyrics = value; } QString MusicAudioTrack::lyrics() const { return d->mLyrics; } void MusicAudioTrack::setComment(const QString &value) { d->mComment = value; } QString MusicAudioTrack::comment() const { return d->mComment; } void MusicAudioTrack::setTrackNumber(int value) { d->mTrackNumber = value; d->mTrackNumberIsValid = true; } int MusicAudioTrack::trackNumber() const { return d->mTrackNumber; } bool MusicAudioTrack::trackNumberIsValid() const { return d->mTrackNumberIsValid; } void MusicAudioTrack::setDiscNumber(int value) { d->mDiscNumber = value; d->mDiscNumberIsValid = true; } int MusicAudioTrack::discNumber() const { return d->mDiscNumber; } bool MusicAudioTrack::discNumberIsValid() const { return d->mDiscNumberIsValid; } void MusicAudioTrack::setYear(int value) { d->mYear = value; } int MusicAudioTrack::year() const { return d->mYear; } void MusicAudioTrack::setChannels(int value) { d->mChannels = value; d->mChannelsIsValid = true; } int MusicAudioTrack::channels() const { return d->mChannels; } bool MusicAudioTrack::channelsIsValid() const { return d->mChannelsIsValid; } void MusicAudioTrack::setBitRate(int value) { d->mBitRate = value; d->mBitRateIsValid = true; } int MusicAudioTrack::bitRate() const { return d->mBitRate; } bool MusicAudioTrack::bitRateIsValid() const { return d->mBitRateIsValid; } void MusicAudioTrack::setSampleRate(int value) { d->mSampleRate = value; d->mSampleRateIsValid = true; } int MusicAudioTrack::sampleRate() const { return d->mSampleRate; } bool MusicAudioTrack::sampleRateIsValid() const { return d->mSampleRateIsValid; } void MusicAudioTrack::setDuration(QTime value) { d->mDuration = value; } QTime MusicAudioTrack::duration() const { return d->mDuration; } void MusicAudioTrack::setFileModificationTime(const QDateTime &value) { d->mFileModificationTime = value; } const QDateTime &MusicAudioTrack::fileModificationTime() const { return d->mFileModificationTime; } void MusicAudioTrack::setResourceURI(const QUrl &value) { d->mResourceURI = value; } const QUrl &MusicAudioTrack::resourceURI() const { return d->mResourceURI; } void MusicAudioTrack::setRating(int value) { d->mRating = value; } int MusicAudioTrack::rating() const { return d->mRating; } void MusicAudioTrack::setIsSingleDiscAlbum(bool value) { d->mIsSingleDiscAlbum = value; } bool MusicAudioTrack::isSingleDiscAlbum() const { return d->mIsSingleDiscAlbum; } void MusicAudioTrack::setHasEmbeddedCover(bool value) { d->mHasBooleanCover = value; } bool MusicAudioTrack::hasEmbeddedCover() const { return d->mHasBooleanCover; } MusicAudioTrack::TrackDataType MusicAudioTrack::toTrackData() const { auto result = MusicAudioTrack::TrackDataType{}; result[MusicAudioTrack::TrackDataType::key_type::DatabaseIdRole] = databaseId(); if (!title().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::TitleRole] = title(); } if (!artist().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::ArtistRole] = artist(); } if (!albumName().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::AlbumRole] = albumName(); } if (!albumArtist().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::AlbumArtistRole] = albumArtist(); } if (!genre().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::GenreRole] = genre(); } if (!composer().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::ComposerRole] = composer(); } if (!lyricist().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::LyricistRole] = lyricist(); } if (!comment().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::CommentRole] = comment(); } if (!albumCover().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::ImageUrlRole] = albumCover(); } if (trackNumber() != -1) { result[MusicAudioTrack::TrackDataType::key_type::TrackNumberRole] = trackNumber(); } if (discNumber()) { result[MusicAudioTrack::TrackDataType::key_type::DiscNumberRole] = discNumber(); } if (year()) { result[MusicAudioTrack::TrackDataType::key_type::YearRole] = year(); } if (channels()) { result[MusicAudioTrack::TrackDataType::key_type::ChannelsRole] = channels(); } if (bitRate()) { result[MusicAudioTrack::TrackDataType::key_type::BitRateRole] = bitRate(); } if (sampleRate()) { result[MusicAudioTrack::TrackDataType::key_type::SampleRateRole] = sampleRate(); } if (!resourceURI().isEmpty()) { result[MusicAudioTrack::TrackDataType::key_type::ResourceRole] = resourceURI(); } if (rating()) { result[MusicAudioTrack::TrackDataType::key_type::RatingRole] = rating(); } if (duration().isValid()) { result[MusicAudioTrack::TrackDataType::key_type::DurationRole] = duration(); } return result; } ELISALIB_EXPORT QDebug operator<<(QDebug stream, const MusicAudioTrack &data) { stream << data.title() << data.artist() << data.albumName() << data.albumArtist() << data.duration() << data.resourceURI(); return stream; }