Add BPM, mood and initial key support

This commit is contained in:
Jonas Kvinge
2025-08-10 01:34:44 +02:00
parent c4646531b0
commit da9e9840b8
8 changed files with 116 additions and 7 deletions

View File

@@ -132,6 +132,9 @@ const QStringList Song::kColumns = QStringList() << u"title"_s
<< u"cue_path"_s
<< u"rating"_s
<< u"bpm"_s
<< u"mood"_s
<< u"initial_key"_s
<< u"acoustid_id"_s
<< u"acoustid_fingerprint"_s
@@ -328,6 +331,9 @@ struct Song::Private : public QSharedData {
QString cue_path_; // If the song has a CUE, this contains it's path.
float rating_; // Database rating, initial rating read from tag.
float bpm_;
QString mood_;
QString initial_key_;
QString acoustid_id_;
QString acoustid_fingerprint_;
@@ -391,6 +397,7 @@ Song::Private::Private(const Source source)
art_unset_(false),
rating_(-1),
bpm_(-1),
init_from_file_(false),
suspicious_tags_(false)
@@ -481,6 +488,9 @@ bool Song::art_unset() const { return d->art_unset_; }
const QString &Song::cue_path() const { return d->cue_path_; }
float Song::rating() const { return d->rating_; }
float Song::bpm() const { return d->bpm_; }
const QString &Song::mood() const { return d->mood_; }
const QString &Song::initial_key() const { return d->initial_key_; }
const QString &Song::acoustid_id() const { return d->acoustid_id_; }
const QString &Song::acoustid_fingerprint() const { return d->acoustid_fingerprint_; }
@@ -592,6 +602,9 @@ void Song::set_art_unset(const bool v) { d->art_unset_ = v; }
void Song::set_cue_path(const QString &v) { d->cue_path_ = v; }
void Song::set_rating(const float v) { d->rating_ = v; }
void Song::set_bpm(const float v) { d->bpm_ = v; }
void Song::set_mood(const QString &v) { d->mood_ = v; }
void Song::set_initial_key(const QString &v) { d->initial_key_ = v; }
void Song::set_acoustid_id(const QString &v) { d->acoustid_id_ = v; }
void Song::set_acoustid_fingerprint(const QString &v) { d->acoustid_fingerprint_ = v; }
@@ -645,6 +658,8 @@ void Song::set_musicbrainz_track_id(const TagLib::String &v) { d->musicbrainz_tr
void Song::set_musicbrainz_disc_id(const TagLib::String &v) { d->musicbrainz_disc_id_ = TagLibStringToQString(v).remove(u' ').replace(u';', u'/'); }
void Song::set_musicbrainz_release_group_id(const TagLib::String &v) { d->musicbrainz_release_group_id_ = TagLibStringToQString(v).remove(u' ').replace(u';', u'/'); }
void Song::set_musicbrainz_work_id(const TagLib::String &v) { d->musicbrainz_work_id_ = TagLibStringToQString(v).remove(u' ').replace(u';', u'/'); }
void Song::set_mood(const TagLib::String &v) { d->mood_ = TagLibStringToQString(v); }
void Song::set_initial_key(const TagLib::String &v) { d->initial_key_ = TagLibStringToQString(v); }
const QUrl &Song::effective_url() const { return !d->stream_url_.isEmpty() && d->stream_url_.isValid() ? d->stream_url_ : d->url_; }
const QString &Song::effective_titlesort() const { return d->titlesort_.isEmpty() ? d->title_ : d->titlesort_; }
@@ -977,6 +992,9 @@ bool Song::IsMetadataEqual(const Song &other) const {
d->bitrate_ == other.d->bitrate_ &&
d->samplerate_ == other.d->samplerate_ &&
d->bitdepth_ == other.d->bitdepth_ &&
d->bpm_ == other.d->bpm_ &&
d->mood_ == other.d->mood_ &&
d->initial_key_ == other.d->initial_key_ &&
d->cue_path_ == other.d->cue_path_;
}
@@ -1570,7 +1588,11 @@ void Song::InitFromQuery(const QSqlRecord &r, const bool reliable_metadata, cons
d->art_unset_ = SqlHelper::ValueToBool(r, ColumnIndex(u"art_unset"_s) + col);
d->cue_path_ = SqlHelper::ValueToString(r, ColumnIndex(u"cue_path"_s) + col);
d->rating_ = SqlHelper::ValueToFloat(r, ColumnIndex(u"rating"_s) + col);
d->bpm_ = SqlHelper::ValueToFloat(r, ColumnIndex(u"bpm"_s) + col);
d->mood_ = SqlHelper::ValueToString(r, ColumnIndex(u"mood"_s) + col);
d->initial_key_ = SqlHelper::ValueToString(r, ColumnIndex(u"initial_key"_s) + col);
d->acoustid_id_ = SqlHelper::ValueToString(r, ColumnIndex(u"acoustid_id"_s) + col);
d->acoustid_fingerprint_ = SqlHelper::ValueToString(r, ColumnIndex(u"acoustid_fingerprint"_s) + col);
@@ -1900,6 +1922,9 @@ void Song::BindToQuery(SqlQuery *query) const {
query->BindValue(u":cue_path"_s, d->cue_path_);
query->BindFloatValue(u":rating"_s, d->rating_);
query->BindFloatValue(u":bpm"_s, d->bpm_);
query->BindStringValue(u":mood"_s, d->mood_);
query->BindStringValue(u":initial_key"_s, d->initial_key_);
query->BindStringValue(u":acoustid_id"_s, d->acoustid_id_);
query->BindStringValue(u":acoustid_fingerprint"_s, d->acoustid_fingerprint_);

View File

@@ -213,6 +213,9 @@ class Song {
const QString &cue_path() const;
float rating() const;
float bpm() const;
const QString &mood() const;
const QString &initial_key() const;
const QString &acoustid_id() const;
const QString &acoustid_fingerprint() const;
@@ -325,6 +328,9 @@ class Song {
void set_cue_path(const QString &v);
void set_rating(const float v);
void set_bpm(const float v);
void set_mood(const QString &v);
void set_initial_key(const QString &v);
void set_acoustid_id(const QString &v);
void set_acoustid_fingerprint(const QString &v);
@@ -378,6 +384,8 @@ class Song {
void set_musicbrainz_disc_id(const TagLib::String &v);
void set_musicbrainz_release_group_id(const TagLib::String &v);
void set_musicbrainz_work_id(const TagLib::String &v);
void set_mood(const TagLib::String &v);
void set_initial_key(const TagLib::String &v);
const QUrl &effective_url() const;
const QString &effective_titlesort() const;