diff --git a/src/albummodel.h b/src/albummodel.h --- a/src/albummodel.h +++ b/src/albummodel.h @@ -69,20 +69,27 @@ TitleRole = Qt::UserRole + 1, DurationRole, MilliSecondsDurationRole, - CreatorRole, ArtistRole, AlbumRole, AlbumArtistRole, TrackNumberRole, DiscNumberRole, RatingRole, + GenreRole, + LyricistRole, + ComposerRole, + CommentRole, + YearRole, + ChannelsRole, + BitRateRole, + SampleRateRole, ImageRole, ResourceRole, IdRole, DatabaseIdRole, DiscFirstTrackRole, IsSingleDiscAlbumRole, - TrackDataRole, + ContainerDataRole, SecondaryTextRole, ImageUrlRole, ShadowForImageRole, diff --git a/src/albummodel.cpp b/src/albummodel.cpp --- a/src/albummodel.cpp +++ b/src/albummodel.cpp @@ -66,11 +66,19 @@ roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; + roles[static_cast(ColumnsRoles::GenreRole)] = "genre"; + roles[static_cast(ColumnsRoles::LyricistRole)] = "lyricist"; + roles[static_cast(ColumnsRoles::ComposerRole)] = "composer"; + roles[static_cast(ColumnsRoles::CommentRole)] = "comment"; + roles[static_cast(ColumnsRoles::YearRole)] = "year"; + roles[static_cast(ColumnsRoles::ChannelsRole)] = "channels"; + roles[static_cast(ColumnsRoles::BitRateRole)] = "bitRate"; + roles[static_cast(ColumnsRoles::SampleRateRole)] = "sampleRate"; roles[static_cast(ColumnsRoles::ImageRole)] = "image"; roles[static_cast(ColumnsRoles::DatabaseIdRole)] = "databaseId"; roles[static_cast(ColumnsRoles::DiscFirstTrackRole)] = "isFirstTrackOfDisc"; roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; - roles[static_cast(ColumnsRoles::TrackDataRole)] = "trackData"; + roles[static_cast(ColumnsRoles::ContainerDataRole)] = "containerData"; roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; @@ -145,9 +153,6 @@ } break; } - case ColumnsRoles::CreatorRole: - result = track.artist(); - break; case ColumnsRoles::ArtistRole: result = track.artist(); break; @@ -161,9 +166,7 @@ result = track.trackNumber(); break; case ColumnsRoles::DiscNumberRole: - if (track.discNumber() > 0) { - result = track.discNumber(); - } + result = track.discNumber(); break; case ColumnsRoles::DiscFirstTrackRole: if (rowIndex == 0) { @@ -179,6 +182,24 @@ case ColumnsRoles::RatingRole: result = track.rating(); break; + case ColumnsRoles::GenreRole: + result = track.genre(); + break; + case ColumnsRoles::LyricistRole: + result = track.lyricist(); + break; + case ColumnsRoles::ComposerRole: + result = track.composer(); + break; + case ColumnsRoles::YearRole: + result = track.year(); + break; + case ColumnsRoles::ChannelsRole: + result = track.channels(); + break; + case ColumnsRoles::BitRateRole: + result = track.bitRate(); + break; case ColumnsRoles::ImageRole: { if (d->mCurrentAlbum.albumArtURI().isValid()) { @@ -195,7 +216,7 @@ case ColumnsRoles::DatabaseIdRole: result = track.databaseId(); break; - case ColumnsRoles::TrackDataRole: + case ColumnsRoles::ContainerDataRole: result = QVariant::fromValue(track); break; case Qt::DisplayRole: diff --git a/src/allalbumsmodel.h b/src/allalbumsmodel.h --- a/src/allalbumsmodel.h +++ b/src/allalbumsmodel.h @@ -58,13 +58,12 @@ CountRole, IdRole, IsSingleDiscAlbumRole, - AlbumDataRole, + ContainerDataRole, HighestTrackRating, AlbumDatabaseIdRole, SecondaryTextRole, ImageUrlRole, ShadowForImageRole, - ContainerDataRole, ChildModelRole, IsTracksContainerRole, }; diff --git a/src/allalbumsmodel.cpp b/src/allalbumsmodel.cpp --- a/src/allalbumsmodel.cpp +++ b/src/allalbumsmodel.cpp @@ -82,13 +82,12 @@ roles[static_cast(ColumnsRoles::ImageRole)] = "image"; roles[static_cast(ColumnsRoles::CountRole)] = "count"; roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; - roles[static_cast(ColumnsRoles::AlbumDataRole)] = "albumData"; + roles[static_cast(ColumnsRoles::ContainerDataRole)] = "containerData"; roles[static_cast(ColumnsRoles::HighestTrackRating)] = "highestTrackRating"; roles[static_cast(ColumnsRoles::AlbumDatabaseIdRole)] = "databaseId"; roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; roles[static_cast(ColumnsRoles::ShadowForImageRole)] = "shadowForImage"; - roles[static_cast(ColumnsRoles::ContainerDataRole)] = "containerData"; roles[static_cast(ColumnsRoles::ChildModelRole)] = "childModel"; roles[static_cast(ColumnsRoles::IsTracksContainerRole)] = "isTracksContainer"; @@ -173,7 +172,7 @@ case ColumnsRoles::IsSingleDiscAlbumRole: result = d->mAllAlbums[albumIndex].isSingleDiscAlbum(); break; - case ColumnsRoles::AlbumDataRole: + case ColumnsRoles::ContainerDataRole: result = QVariant::fromValue(d->mAllAlbums[albumIndex]); break; case ColumnsRoles::AlbumDatabaseIdRole: @@ -201,9 +200,6 @@ case ColumnsRoles::ShadowForImageRole: result = d->mAllAlbums[albumIndex].albumArtURI().isValid(); break; - case ColumnsRoles::ContainerDataRole: - result = QVariant::fromValue(d->mAllAlbums[albumIndex]); - break; case ColumnsRoles::ChildModelRole: { auto newModel = new AlbumModel(); diff --git a/src/alltracksmodel.h b/src/alltracksmodel.h --- a/src/alltracksmodel.h +++ b/src/alltracksmodel.h @@ -38,19 +38,26 @@ TitleRole = Qt::UserRole + 1, DurationRole, MilliSecondsDurationRole, - CreatorRole, ArtistRole, AlbumRole, AlbumArtistRole, TrackNumberRole, DiscNumberRole, RatingRole, + GenreRole, + LyricistRole, + ComposerRole, + CommentRole, + YearRole, + ChannelsRole, + BitRateRole, + SampleRateRole, ImageRole, ResourceRole, IdRole, DatabaseIdRole, IsSingleDiscAlbumRole, - TrackDataRole, + ContainerDataRole, SecondaryTextRole, ImageUrlRole, ShadowForImageRole, diff --git a/src/alltracksmodel.cpp b/src/alltracksmodel.cpp --- a/src/alltracksmodel.cpp +++ b/src/alltracksmodel.cpp @@ -65,10 +65,18 @@ roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; + roles[static_cast(ColumnsRoles::GenreRole)] = "genre"; + roles[static_cast(ColumnsRoles::LyricistRole)] = "lyricist"; + roles[static_cast(ColumnsRoles::ComposerRole)] = "composer"; + roles[static_cast(ColumnsRoles::CommentRole)] = "comment"; + roles[static_cast(ColumnsRoles::YearRole)] = "year"; + roles[static_cast(ColumnsRoles::ChannelsRole)] = "channels"; + roles[static_cast(ColumnsRoles::BitRateRole)] = "bitRate"; + roles[static_cast(ColumnsRoles::SampleRateRole)] = "sampleRate"; roles[static_cast(ColumnsRoles::ImageRole)] = "image"; roles[static_cast(ColumnsRoles::DatabaseIdRole)] = "databaseId"; roles[static_cast(ColumnsRoles::IsSingleDiscAlbumRole)] = "isSingleDiscAlbum"; - roles[static_cast(ColumnsRoles::TrackDataRole)] = "trackData"; + roles[static_cast(ColumnsRoles::ContainerDataRole)] = "containerData"; roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; @@ -139,9 +147,6 @@ } break; } - case ColumnsRoles::CreatorRole: - result = d->mAllTracks[d->mIds[index.row()]].artist(); - break; case ColumnsRoles::ArtistRole: result = d->mAllTracks[d->mIds[index.row()]].artist(); break; @@ -155,19 +160,38 @@ result = d->mAllTracks[d->mIds[index.row()]].trackNumber(); break; case ColumnsRoles::DiscNumberRole: - { - const auto discNumber = d->mAllTracks[d->mIds[index.row()]].discNumber(); - if (discNumber > 0) { - result = discNumber; - } + result = d->mAllTracks[d->mIds[index.row()]].discNumber(); break; - } case ColumnsRoles::IsSingleDiscAlbumRole: result = d->mAllTracks[d->mIds[index.row()]].isSingleDiscAlbum(); break; case ColumnsRoles::RatingRole: result = d->mAllTracks[d->mIds[index.row()]].rating(); break; + case ColumnsRoles::GenreRole: + result = d->mAllTracks[d->mIds[index.row()]].genre(); + break; + case ColumnsRoles::LyricistRole: + result = d->mAllTracks[d->mIds[index.row()]].lyricist(); + break; + case ColumnsRoles::ComposerRole: + result = d->mAllTracks[d->mIds[index.row()]].composer(); + break; + case ColumnsRoles::CommentRole: + result = d->mAllTracks[d->mIds[index.row()]].comment(); + break; + case ColumnsRoles::YearRole: + result = d->mAllTracks[d->mIds[index.row()]].year(); + break; + case ColumnsRoles::ChannelsRole: + result = d->mAllTracks[d->mIds[index.row()]].channels(); + break; + case ColumnsRoles::BitRateRole: + result = d->mAllTracks[d->mIds[index.row()]].bitRate(); + break; + case ColumnsRoles::SampleRateRole: + result = d->mAllTracks[d->mIds[index.row()]].sampleRate(); + break; case ColumnsRoles::ImageRole: { const auto &imageUrl = d->mAllTracks[d->mIds[index.row()]].albumCover(); @@ -185,7 +209,7 @@ case ColumnsRoles::DatabaseIdRole: result = d->mAllTracks[d->mIds[index.row()]].databaseId(); break; - case ColumnsRoles::TrackDataRole: + case ColumnsRoles::ContainerDataRole: result = QVariant::fromValue(d->mAllTracks[d->mIds[index.row()]]); break; case Qt::DisplayRole: diff --git a/src/baloo/localbaloofilelisting.cpp b/src/baloo/localbaloofilelisting.cpp --- a/src/baloo/localbaloofilelisting.cpp +++ b/src/baloo/localbaloofilelisting.cpp @@ -304,6 +304,14 @@ auto albumArtistProperty = allProperties.find(KFileMetaData::Property::AlbumArtist); auto trackNumberProperty = allProperties.find(KFileMetaData::Property::TrackNumber); auto discNumberProperty = allProperties.find(KFileMetaData::Property::DiscNumber); + auto genreProperty = allProperties.find(KFileMetaData::Property::Genre); + auto yearProperty = allProperties.find(KFileMetaData::Property::ReleaseYear); + auto composerProperty = allProperties.find(KFileMetaData::Property::Composer); + auto lyricistProperty = allProperties.find(KFileMetaData::Property::Lyricist); + auto channelsProperty = allProperties.find(KFileMetaData::Property::Channels); + auto bitRateProperty = allProperties.find(KFileMetaData::Property::BitRate); + auto sampleRateProperty = allProperties.find(KFileMetaData::Property::SampleRate); + auto commentProperty = allProperties.find(KFileMetaData::Property::Comment); auto fileData = KFileMetaData::UserMetaData(fileName); if (albumProperty != allProperties.end()) { @@ -346,6 +354,38 @@ newTrack.setArtist(newTrack.albumArtist()); } + if (yearProperty != allProperties.end()) { + newTrack.setYear(yearProperty->toInt()); + } + + if (channelsProperty != allProperties.end()) { + newTrack.setChannels(channelsProperty->toInt()); + } + + if (bitRateProperty != allProperties.end()) { + newTrack.setBitRate(bitRateProperty->toInt()); + } + + if (sampleRateProperty != allProperties.end()) { + newTrack.setSampleRate(sampleRateProperty->toInt()); + } + + if (genreProperty != allProperties.end()) { + newTrack.setGenre(genreProperty->toString()); + } + + if (composerProperty != allProperties.end()) { + newTrack.setComposer(composerProperty->toString()); + } + + if (lyricistProperty != allProperties.end()) { + newTrack.setLyricist(lyricistProperty->toString()); + } + + if (commentProperty != allProperties.end()) { + newTrack.setComment(commentProperty->toString()); + } + newTrack.setRating(fileData.rating()); newTrack.setResourceURI(scanFile); diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp --- a/src/databaseinterface.cpp +++ b/src/databaseinterface.cpp @@ -985,7 +985,7 @@ auto listTables = d->mTracksDatabase.tables(); - if (!listTables.contains(QStringLiteral("DatabaseVersionV1"))) { + if (!listTables.contains(QStringLiteral("DatabaseVersionV2"))) { for (const auto &oneTable : listTables) { QSqlQuery createSchemaQuery(d->mTracksDatabase); @@ -1000,10 +1000,10 @@ listTables = d->mTracksDatabase.tables(); } - if (!listTables.contains(QStringLiteral("DatabaseVersionV1"))) { + if (!listTables.contains(QStringLiteral("DatabaseVersionV2"))) { QSqlQuery createSchemaQuery(d->mTracksDatabase); - const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV1` (`Version` INTEGER PRIMARY KEY NOT NULL)")); + const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV2` (`Version` INTEGER PRIMARY KEY NOT NULL)")); if (!result) { qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); @@ -1083,6 +1083,14 @@ "`DiscNumber` INTEGER DEFAULT -1, " "`Duration` INTEGER NOT NULL, " "`Rating` INTEGER NOT NULL DEFAULT 0, " + "`Genre` VARCHAR(85) DEFAULT '', " + "`Composer` VARCHAR(85) DEFAULT '', " + "`Lyricist` VARCHAR(85) DEFAULT '', " + "`Comment` VARCHAR(85) DEFAULT '', " + "`Year` INTEGER DEFAULT 0, " + "`Channels` INTEGER DEFAULT -1, " + "`BitRate` INTEGER DEFAULT -1, " + "`SampleRate` INTEGER DEFAULT -1, " "UNIQUE (`Title`, `AlbumID`, `TrackNumber`, `DiscNumber`), " "CONSTRAINT fk_tracks_album FOREIGN KEY (`AlbumID`) REFERENCES `Albums`(`ID`))")); @@ -1306,7 +1314,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " "`Albums` album, `TracksMapping` tracksMapping " @@ -1341,7 +1357,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " "`Albums` album, `TracksMapping` tracksMapping, `DiscoverSource` source " @@ -1378,7 +1402,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " "`Albums` album, `TracksMapping` tracksMapping, `DiscoverSource` source " @@ -1442,7 +1474,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " "`Albums` album, `TracksMapping` tracksMapping " @@ -1479,7 +1519,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " "`Albums` album, `TracksMapping` tracksMapping " @@ -1685,7 +1733,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM " "`Tracks` tracks, " "`Artists` artist, " @@ -1837,8 +1893,8 @@ qDebug() << "DatabaseInterface::initRequest" << d->mSelectTrackIdFromTitleAlbumIdArtistQuery.lastError(); } - auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` (`ID`, `Title`, `AlbumID`, `TrackNumber`, `DiscNumber`, `Duration`, `Rating`) " - "VALUES (:trackId, :title, :album, :trackNumber, :discNumber, :trackDuration, :trackRating)"); + auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` (`ID`, `Title`, `AlbumID`, `Genre`, `Composer`, `Lyricist`, `Comment`, `TrackNumber`, `DiscNumber`, `Channels`, `BitRate`, `SampleRate`, `Year`, `Duration`, `Rating` ) " + "VALUES (:trackId, :title, :album, :genre, :composer, :lyricist, :comment, :trackNumber, :discNumber, :channels, :bitRate, :sampleRate, :year, :trackDuration, :trackRating)"); result = d->mInsertTrackQuery.prepare(insertTrackQueryText); @@ -1980,7 +2036,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM `Tracks` tracks, `Albums` album, `Artists` artist, `TracksArtists` trackArtist, " "`TracksMapping` tracksMapping " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " @@ -2052,7 +2116,15 @@ "album.`Title`, " "tracks.`Rating`, " "album.`CoverFileName`, " - "album.`IsSingleDiscAlbum` " + "album.`IsSingleDiscAlbum`, " + "tracks.`Genre`, " + "tracks.`Composer`, " + "tracks.`Lyricist`, " + "tracks.`Comment`, " + "tracks.`Year`, " + "tracks.`Channels`, " + "tracks.`BitRate`, " + "tracks.`SampleRate` " "FROM `Tracks` tracks, `Artists` artist, `Albums` album, `TracksArtists` trackArtist, " "`TracksMapping` tracksMapping " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " @@ -2570,6 +2642,15 @@ isSameTrack = isSameTrack && (oldTrack.duration() == oneTrack.duration()); isSameTrack = isSameTrack && (oldTrack.rating() == oneTrack.rating()); isSameTrack = isSameTrack && (oldTrack.resourceURI() == oneTrack.resourceURI()); + isSameTrack = isSameTrack && (oldTrack.genre() == oneTrack.genre()); + isSameTrack = isSameTrack && (oldTrack.composer() == oneTrack.composer()); + isSameTrack = isSameTrack && (oldTrack.lyricist() == oneTrack.lyricist()); + isSameTrack = isSameTrack && (oldTrack.comment() == oneTrack.comment()); + isSameTrack = isSameTrack && (oldTrack.year() == oneTrack.year()); + isSameTrack = isSameTrack && (oldTrack.channels() == oneTrack.channels()); + isSameTrack = isSameTrack && (oldTrack.bitRate() == oneTrack.bitRate()); + isSameTrack = isSameTrack && (oldTrack.sampleRate() == oneTrack.sampleRate()); + oldAlbumId = internalAlbumIdFromTitleAndArtist(oldTrack.albumName(), oldTrack.albumArtist()); @@ -2590,6 +2671,14 @@ d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), oneTrack.discNumber()); d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), QVariant::fromValue(oneTrack.duration().msecsSinceStartOfDay())); d->mInsertTrackQuery.bindValue(QStringLiteral(":trackRating"), oneTrack.rating()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":genre"), oneTrack.genre()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":composer"), oneTrack.composer()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":lyricist"), oneTrack.lyricist()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":comment"), oneTrack.comment()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":year"), oneTrack.year()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":channels"), oneTrack.channels()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":bitRate"), oneTrack.bitRate()); + d->mInsertTrackQuery.bindValue(QStringLiteral(":sampleRate"), oneTrack.sampleRate()); auto result = d->mInsertTrackQuery.exec(); @@ -2675,6 +2764,15 @@ result.setRating(trackRecord.value(10).toInt()); result.setAlbumCover(trackRecord.value(11).toUrl()); result.setIsSingleDiscAlbum(trackRecord.value(12).toBool()); + result.setGenre(trackRecord.value(13).toString()); + result.setComposer(trackRecord.value(14).toString()); + result.setLyricist(trackRecord.value(15).toString()); + result.setComment(trackRecord.value(16).toString()); + result.setYear(trackRecord.value(17).toInt()); + result.setChannels(trackRecord.value(18).toInt()); + result.setBitRate(trackRecord.value(19).toInt()); + result.setSampleRate(trackRecord.value(20).toInt()); + result.setValid(true); return result; diff --git a/src/elisautils.cpp b/src/elisautils.cpp --- a/src/elisautils.cpp +++ b/src/elisautils.cpp @@ -58,6 +58,14 @@ auto albumArtistProperty = allProperties.find(KFileMetaData::Property::AlbumArtist); auto trackNumberProperty = allProperties.find(KFileMetaData::Property::TrackNumber); auto discNumberProperty = allProperties.find(KFileMetaData::Property::DiscNumber); + auto genreProperty = allProperties.find(KFileMetaData::Property::Genre); + auto yearProperty = allProperties.find(KFileMetaData::Property::ReleaseYear); + auto composerProperty = allProperties.find(KFileMetaData::Property::Composer); + auto lyricistProperty = allProperties.find(KFileMetaData::Property::Lyricist); + auto channelsProperty = allProperties.find(KFileMetaData::Property::Channels); + auto bitRateProperty = allProperties.find(KFileMetaData::Property::BitRate); + auto sampleRateProperty = allProperties.find(KFileMetaData::Property::SampleRate); + auto commentProperty = allProperties.find(KFileMetaData::Property::Comment); #if defined Q_OS_LINUX && !defined Q_OS_ANDROID auto fileData = KFileMetaData::UserMetaData(scanFile.toLocalFile()); #endif @@ -97,6 +105,38 @@ } } + if (yearProperty != allProperties.end()) { + newTrack.setYear(yearProperty->toInt()); + } + + if (channelsProperty != allProperties.end()) { + newTrack.setChannels(channelsProperty->toInt()); + } + + if (bitRateProperty != allProperties.end()) { + newTrack.setBitRate(bitRateProperty->toInt()); + } + + if (sampleRateProperty != allProperties.end()) { + newTrack.setSampleRate(sampleRateProperty->toInt()); + } + + if (genreProperty != allProperties.end()) { + newTrack.setGenre(genreProperty->toString()); + } + + if (composerProperty != allProperties.end()) { + newTrack.setComposer(composerProperty->toString()); + } + + if (lyricistProperty != allProperties.end()) { + newTrack.setLyricist(lyricistProperty->toString()); + } + + if (commentProperty != allProperties.end()) { + newTrack.setComment(commentProperty->toString()); + } + if (newTrack.artist().isEmpty()) { newTrack.setArtist(newTrack.albumArtist()); } diff --git a/src/mediaplaylist.h b/src/mediaplaylist.h --- a/src/mediaplaylist.h +++ b/src/mediaplaylist.h @@ -78,13 +78,21 @@ TitleRole, DurationRole, MilliSecondsDurationRole, - CreatorRole, + TrackDataRole, ArtistRole, AlbumArtistRole, AlbumRole, TrackNumberRole, DiscNumberRole, RatingRole, + GenreRole, + LyricistRole, + ComposerRole, + CommentRole, + YearRole, + ChannelsRole, + BitRateRole, + SampleRateRole, ImageRole, ResourceRole, CountRole, diff --git a/src/mediaplaylist.cpp b/src/mediaplaylist.cpp --- a/src/mediaplaylist.cpp +++ b/src/mediaplaylist.cpp @@ -73,6 +73,41 @@ return d->mData.size(); } +QHash MediaPlayList::roleNames() const +{ + auto roles = QAbstractItemModel::roleNames(); + + roles[static_cast(ColumnsRoles::IsValidRole)] = "isValid"; + roles[static_cast(ColumnsRoles::TitleRole)] = "title"; + roles[static_cast(ColumnsRoles::DurationRole)] = "duration"; + roles[static_cast(ColumnsRoles::ArtistRole)] = "artist"; + roles[static_cast(ColumnsRoles::AlbumArtistRole)] = "albumArtist"; + roles[static_cast(ColumnsRoles::AlbumRole)] = "album"; + roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; + roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; + roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; + roles[static_cast(ColumnsRoles::GenreRole)] = "genre"; + roles[static_cast(ColumnsRoles::LyricistRole)] = "lyricist"; + roles[static_cast(ColumnsRoles::ComposerRole)] = "composer"; + roles[static_cast(ColumnsRoles::CommentRole)] = "comment"; + roles[static_cast(ColumnsRoles::YearRole)] = "year"; + roles[static_cast(ColumnsRoles::ChannelsRole)] = "channels"; + roles[static_cast(ColumnsRoles::BitRateRole)] = "bitRate"; + roles[static_cast(ColumnsRoles::SampleRateRole)] = "sampleRate"; + roles[static_cast(ColumnsRoles::ImageRole)] = "image"; + roles[static_cast(ColumnsRoles::CountRole)] = "count"; + roles[static_cast(ColumnsRoles::IsPlayingRole)] = "isPlaying"; + roles[static_cast(ColumnsRoles::HasAlbumHeader)] = "hasAlbumHeader"; + roles[static_cast(ColumnsRoles::IsSingleDiscAlbumHeader)] = "isSingleDiscAlbum"; + roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; + roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; + roles[static_cast(ColumnsRoles::ShadowForImageRole)] = "shadowForImage"; + roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; + roles[static_cast(ColumnsRoles::TrackDataRole)] = "trackData"; + + return roles; +} + QVariant MediaPlayList::data(const QModelIndex &index, int role) const { auto result = QVariant(); @@ -129,9 +164,7 @@ result = d->mTrackData[index.row()].trackNumber(); break; case ColumnsRoles::DiscNumberRole: - if (d->mTrackData[index.row()].discNumber() > 0) { - result = d->mTrackData[index.row()].discNumber(); - } + result = d->mTrackData[index.row()].discNumber(); break; case ColumnsRoles::IsSingleDiscAlbumHeader: result = d->mTrackData[index.row()].isSingleDiscAlbum(); @@ -157,9 +190,31 @@ case ColumnsRoles::RatingRole: result = d->mTrackData[index.row()].rating(); break; - case ColumnsRoles::CountRole: + case ColumnsRoles::GenreRole: + result = d->mTrackData[index.row()].genre(); + break; + case ColumnsRoles::LyricistRole: + result = d->mTrackData[index.row()].lyricist(); + break; + case ColumnsRoles::ComposerRole: + result = d->mTrackData[index.row()].composer(); + break; + case ColumnsRoles::CommentRole: + result = d->mTrackData[index.row()].comment(); + break; + case ColumnsRoles::YearRole: + result = d->mTrackData[index.row()].year(); + break; + case ColumnsRoles::ChannelsRole: + result = d->mTrackData[index.row()].channels(); break; - case ColumnsRoles::CreatorRole: + case ColumnsRoles::BitRateRole: + result = d->mTrackData[index.row()].bitRate(); + break; + case ColumnsRoles::SampleRateRole: + result = d->mTrackData[index.row()].sampleRate(); + break; + case ColumnsRoles::CountRole: break; case ColumnsRoles::IsPlayingRole: result = d->mData[index.row()].mIsPlaying; @@ -198,7 +253,11 @@ case ColumnsRoles::ShadowForImageRole: result = d->mTrackData[index.row()].albumCover().isValid(); break; + case ColumnsRoles::TrackDataRole: + result = QVariant::fromValue(d->mTrackData[index.row()]); + break; } + } else { switch(role) { @@ -249,8 +308,6 @@ break; case ColumnsRoles::CountRole: break; - case ColumnsRoles::CreatorRole: - break; case ColumnsRoles::ImageRole: result = QStringLiteral(""); break; @@ -312,32 +369,6 @@ return modelModified; } -QHash MediaPlayList::roleNames() const -{ - auto roles = QAbstractItemModel::roleNames(); - - roles[static_cast(ColumnsRoles::IsValidRole)] = "isValid"; - roles[static_cast(ColumnsRoles::TitleRole)] = "title"; - roles[static_cast(ColumnsRoles::DurationRole)] = "duration"; - roles[static_cast(ColumnsRoles::ArtistRole)] = "artist"; - roles[static_cast(ColumnsRoles::AlbumArtistRole)] = "albumArtist"; - roles[static_cast(ColumnsRoles::AlbumRole)] = "album"; - roles[static_cast(ColumnsRoles::TrackNumberRole)] = "trackNumber"; - roles[static_cast(ColumnsRoles::DiscNumberRole)] = "discNumber"; - roles[static_cast(ColumnsRoles::RatingRole)] = "rating"; - roles[static_cast(ColumnsRoles::ImageRole)] = "image"; - roles[static_cast(ColumnsRoles::CountRole)] = "count"; - roles[static_cast(ColumnsRoles::IsPlayingRole)] = "isPlaying"; - roles[static_cast(ColumnsRoles::HasAlbumHeader)] = "hasAlbumHeader"; - roles[static_cast(ColumnsRoles::IsSingleDiscAlbumHeader)] = "isSingleDiscAlbum"; - roles[static_cast(ColumnsRoles::SecondaryTextRole)] = "secondaryText"; - roles[static_cast(ColumnsRoles::ImageUrlRole)] = "imageUrl"; - roles[static_cast(ColumnsRoles::ShadowForImageRole)] = "shadowForImage"; - roles[static_cast(ColumnsRoles::ResourceRole)] = "trackResource"; - - return roles; -} - bool MediaPlayList::removeRows(int row, int count, const QModelIndex &parent) { beginRemoveRows(parent, row, row + count - 1); diff --git a/src/musicaudiotrack.h b/src/musicaudiotrack.h --- a/src/musicaudiotrack.h +++ b/src/musicaudiotrack.h @@ -37,10 +37,6 @@ MusicAudioTrack(); - MusicAudioTrack(bool aValid, const QString &aId, const QString &aParentId, const QString &aTitle, const QString &aArtist, const QString &aAlbumName, - const QString &aAlbumArtist, int aTrackNumber, QTime aDuration, const QUrl &aResourceURI, const QUrl &aAlbumCover, int rating, - bool aIsSingleDiscAlbum); - MusicAudioTrack(bool aValid, const QString &aId, const QString &aParentId, const QString &aTitle, const QString &aArtist, const QString &aAlbumName, const QString &aAlbumArtist, int aTrackNumber, int aDiscNumber, QTime aDuration, const QUrl &aResourceURI, const QUrl &aAlbumCover, int rating, bool aIsSingleDiscAlbum); @@ -93,6 +89,22 @@ QString albumArtist() const; + void setGenre(const QString &value) const; + + QString genre() const; + + void setComposer(const QString &value) const; + + QString composer() const; + + void setLyricist(const QString &value) const; + + QString lyricist() const; + + void setComment(const QString &value) const; + + QString comment() const; + bool isValidAlbumArtist() const; void setAlbumCover(const QUrl &value) const; @@ -107,6 +119,22 @@ int discNumber() const; + void setYear(int value); + + int year() const; + + void setChannels(int value); + + int channels() const; + + void setBitRate(int value); + + int bitRate() const; + + void setSampleRate(int value); + + int sampleRate() const; + void setDuration(QTime value); QTime duration() const; diff --git a/src/musicaudiotrack.cpp b/src/musicaudiotrack.cpp --- a/src/musicaudiotrack.cpp +++ b/src/musicaudiotrack.cpp @@ -30,17 +30,6 @@ { } - MusicAudioTrackPrivate(bool aValid, QString aId, QString aParentId, - QString aTitle, QString aArtist, QString aAlbumName, - QString aAlbumArtist, int aTrackNumber, QTime aDuration, - QUrl aResourceURI, QUrl aAlbumCover, int rating, bool aIsSingleDiscAlbum) - : mId(std::move(aId)), mParentId(std::move(aParentId)), mTitle(std::move(aTitle)), mArtist(std::move(aArtist)), - mAlbumName(std::move(aAlbumName)), mAlbumArtist(std::move(aAlbumArtist)), mTrackNumber(aTrackNumber), - mDuration(aDuration), mResourceURI(std::move(aResourceURI)), mAlbumCover(std::move(aAlbumCover)), - mRating(rating), mIsValid(aValid), mIsSingleDiscAlbum(aIsSingleDiscAlbum) - { - } - MusicAudioTrackPrivate(bool aValid, QString aId, QString aParentId, QString aTitle, QString aArtist, QString aAlbumName, QString aAlbumArtist, int aTrackNumber, int aDiscNumber, QTime aDuration, QUrl aResourceURI, @@ -66,10 +55,26 @@ QString mAlbumArtist; + QString mGenre; + + QString mComposer; + + QString mLyricist; + + QString mComment; + int mTrackNumber = -1; int mDiscNumber = -1; + int mChannels = -1; + + int mBitRate = -1; + + int mSampleRate = -1; + + int mYear = 0; + QTime mDuration; QUrl mResourceURI; @@ -88,16 +93,6 @@ { } -MusicAudioTrack::MusicAudioTrack(bool aValid, const QString &aId, const QString &aParentId, - const QString &aTitle, const QString &aArtist, const QString &aAlbumName, const QString &aAlbumArtist, - int aTrackNumber, QTime aDuration, const QUrl &aResourceURI, const QUrl &aAlbumCover, int rating, - bool aIsSingleDiscAlbum) - : d(std::make_unique(aValid, aId, aParentId, aTitle, aArtist, aAlbumName, - aAlbumArtist, aTrackNumber, aDuration, aResourceURI, aAlbumCover, - rating, aIsSingleDiscAlbum)) -{ -} - MusicAudioTrack::MusicAudioTrack(bool aValid, const QString &aId, const QString &aParentId, const QString &aTitle, const QString &aArtist, const QString &aAlbumName, const QString &aAlbumArtist, int aTrackNumber, int aDiscNumber, @@ -152,16 +147,26 @@ 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->mAlbumCover == other.d->mAlbumCover && d->mRating == other.d->mRating; + 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->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->mAlbumCover != other.d->mAlbumCover || d->mRating != other.d->mRating;} + 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->mComment != other.d->mComment || + d->mYear != other.d->mYear || d->mChannels != other.d->mChannels || + d->mBitRate != other.d->mBitRate || d->mSampleRate != other.d->mSampleRate; +} void MusicAudioTrack::setValid(bool value) { @@ -258,6 +263,46 @@ return d->mAlbumCover; } +void MusicAudioTrack::setGenre(const QString &value) const +{ + d->mGenre = value; +} + +QString MusicAudioTrack::genre() const +{ + return d->mGenre; +} + +void MusicAudioTrack::setComposer(const QString &value) const +{ + d->mComposer = value; +} + +QString MusicAudioTrack::composer() const +{ + return d->mComposer; +} + +void MusicAudioTrack::setLyricist(const QString &value) const +{ + d->mLyricist = value; +} + +QString MusicAudioTrack::lyricist() const +{ + return d->mLyricist; +} + +void MusicAudioTrack::setComment(const QString &value) const +{ + d->mComment = value; +} + +QString MusicAudioTrack::comment() const +{ + return d->mComment; +} + void MusicAudioTrack::setTrackNumber(int value) { d->mTrackNumber = value; @@ -278,6 +323,46 @@ return d->mDiscNumber; } +void MusicAudioTrack::setYear(int value) +{ + d->mYear = value; +} + +int MusicAudioTrack::year() const +{ + return d->mYear; +} + +void MusicAudioTrack::setChannels(int value) +{ + d->mChannels = value; +} + +int MusicAudioTrack::channels() const +{ + return d->mChannels; +} + +void MusicAudioTrack::setBitRate(int value) +{ + d->mBitRate = value; +} + +int MusicAudioTrack::bitRate() const +{ + return d->mBitRate; +} + +void MusicAudioTrack::setSampleRate(int value) +{ + d->mSampleRate = value; +} + +int MusicAudioTrack::sampleRate() const +{ + return d->mSampleRate; +} + void MusicAudioTrack::setDuration(QTime value) { d->mDuration = value; diff --git a/src/qml/MediaAlbumView.qml b/src/qml/MediaAlbumView.qml --- a/src/qml/MediaAlbumView.qml +++ b/src/qml/MediaAlbumView.qml @@ -137,8 +137,8 @@ model.rating else 0 - mediaTrack.trackData: if (model != undefined && model.trackData !== undefined) - model.trackData + mediaTrack.trackData: if (model != undefined && model.containerData !== undefined) + model.containerData else '' mediaTrack.isFirstTrackOfDisc: if (model != undefined && model.isFirstTrackOfDisc !== undefined) diff --git a/src/qml/MediaAllTracksView.qml b/src/qml/MediaAllTracksView.qml --- a/src/qml/MediaAllTracksView.qml +++ b/src/qml/MediaAllTracksView.qml @@ -133,8 +133,8 @@ model.rating else 0 - trackData: if (model != undefined && model.trackData !== undefined) - model.trackData + trackData: if (model != undefined && model.containerData !== undefined) + model.containerData else '' coverImage: if (model != undefined && model.image !== undefined)