Extend article sorting to artist and album artist (#210)

This commit is contained in:
Gavin D. Howard 2019-07-11 08:51:25 -06:00 committed by Jonas Kvinge
parent dcf0d6f72d
commit 3a86a93154
3 changed files with 22 additions and 14 deletions

View File

@ -167,7 +167,9 @@ struct Song::Private : public QSharedData {
QString album_;
QString album_sortable_;
QString artist_;
QString artist_sortable_;
QString albumartist_;
QString albumartist_sortable_;
int track_;
int disc_;
int year_;
@ -288,9 +290,12 @@ const QString &Song::album_sortable() const { return d->album_sortable_; }
// This value is useful for singles, which are one-track albums on their own.
const QString &Song::effective_album() const { return d->album_.isEmpty() ? d->title_ : d->album_; }
const QString &Song::artist() const { return d->artist_; }
const QString &Song::artist_sortable() const { return d->artist_sortable_; }
const QString &Song::albumartist() const { return d->albumartist_; }
const QString &Song::albumartist_sortable() const { return d->albumartist_sortable_; }
const QString &Song::effective_albumartist() const { return d->albumartist_.isEmpty() ? d->artist_ : d->albumartist_; }
const QString &Song::playlist_albumartist() const { return is_compilation() ? d->albumartist_ : effective_albumartist(); }
const QString &Song::effective_albumartist_sortable() const { return d->albumartist_.isEmpty() ? d->artist_sortable_ : d->albumartist_sortable_; }
const QString &Song::playlist_albumartist() const { return is_compilation() ? d->albumartist_sortable_ : effective_albumartist_sortable(); }
int Song::track() const { return d->track_; }
int Song::disc() const { return d->disc_; }
int Song::year() const { return d->year_; }
@ -387,8 +392,8 @@ QString Song::sortable(const QString &v) const {
void Song::set_title(const QString &v) { d->title_sortable_ = sortable(v); d->title_ = v; }
void Song::set_album(const QString &v) { d->album_sortable_ = sortable(v); d->album_ = v; }
void Song::set_artist(const QString &v) { d->artist_ = v; }
void Song::set_albumartist(const QString &v) { d->albumartist_ = v; }
void Song::set_artist(const QString &v) { d->artist_sortable_ = sortable(v); d->artist_ = v; }
void Song::set_albumartist(const QString &v) { d->albumartist_sortable_ = sortable(v); d->albumartist_ = v; }
void Song::set_track(int v) { d->track_ = v; }
void Song::set_disc(int v) { d->disc_ = v; }
void Song::set_year(int v) { d->year_ = v; }
@ -625,7 +630,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
d->valid_ = true;
set_title(title);
d->artist_ = artist;
set_artist(artist);
set_album(album);
set_length_nanosec(length_nanosec);
@ -637,7 +642,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
d->valid_ = true;
set_title(title);
d->artist_ = artist;
set_artist(artist);
set_album(album);
d->beginning_ = beginning;
@ -665,8 +670,8 @@ void Song::InitFromProtobuf(const pb::tagreader::SongMetadata &pb) {
d->valid_ = pb.valid();
set_title(QStringFromStdString(pb.title()));
set_album(QStringFromStdString(pb.album()));
d->artist_ = QStringFromStdString(pb.artist());
d->albumartist_ = QStringFromStdString(pb.albumartist());
set_artist(QStringFromStdString(pb.artist()));
set_albumartist(QStringFromStdString(pb.albumartist()));
d->track_ = pb.track();
d->disc_ = pb.disc();
d->year_ = pb.year();
@ -772,10 +777,10 @@ void Song::InitFromQuery(const SqlRow &q, bool reliable_metadata, int col) {
set_album(tostr(x));
}
else if (Song::kColumns.value(i) == "artist") {
d->artist_ = tostr(x);
set_artist(tostr(x));
}
else if (Song::kColumns.value(i) == "albumartist") {
d->albumartist_ = tostr(x);
set_albumartist(tostr(x));
}
else if (Song::kColumns.value(i) == "track") {
d->track_ = toint(x);
@ -973,8 +978,8 @@ void Song::InitFromItdb(const Itdb_Track *track, const QString &prefix) {
set_title(QString::fromUtf8(track->title));
set_album(QString::fromUtf8(track->album));
d->artist_ = QString::fromUtf8(track->artist);
d->albumartist_ = QString::fromUtf8(track->albumartist);
set_artist(QString::fromUtf8(track->artist));
set_albumartist(QString::fromUtf8(track->albumartist));
d->track_ = track->track_nr;
d->disc_ = track->cd_nr;
d->year_ = track->year;
@ -1052,7 +1057,7 @@ void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) {
d->valid_ = true;
set_title(QString::fromUtf8(track->title));
d->artist_ = QString::fromUtf8(track->artist);
set_artist(QString::fromUtf8(track->artist));
set_album(QString::fromUtf8(track->album));
d->genre_ = QString::fromUtf8(track->genre);
d->composer_ = QString::fromUtf8(track->composer);
@ -1142,7 +1147,7 @@ void Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) {
d->valid_ = true;
if (!bundle.title.isEmpty()) set_title(bundle.title);
if (!bundle.artist.isEmpty()) d->artist_ = bundle.artist;
if (!bundle.artist.isEmpty()) set_artist(bundle.artist);
if (!bundle.album.isEmpty()) set_album(bundle.album);
if (!bundle.comment.isEmpty()) d->comment_ = bundle.comment;
if (!bundle.genre.isEmpty()) d->genre_ = bundle.genre;

View File

@ -190,7 +190,9 @@ class Song {
const QString &album() const;
const QString &album_sortable() const;
const QString &artist() const;
const QString &artist_sortable() const;
const QString &albumartist() const;
const QString &albumartist_sortable() const;
int track() const;
int disc() const;
int year() const;
@ -237,6 +239,7 @@ class Song {
const QString &effective_album() const;
int effective_originalyear() const;
const QString &effective_albumartist() const;
const QString &effective_albumartist_sortable() const;
bool is_collection_song() const;
bool is_stream() const;

View File

@ -1103,7 +1103,7 @@ bool Playlist::CompareItems(int column, Qt::SortOrder order, shared_ptr<Playlist
switch (column) {
case Column_Title: strcmp(title_sortable);
case Column_Artist: strcmp(artist);
case Column_Artist: strcmp(artist_sortable);
case Column_Album: strcmp(album_sortable);
case Column_Length: cmp(length_nanosec);
case Column_Track: cmp(track);