Song: Add Acoustid fingerprint and MusicBrainz tags

This commit is contained in:
Jonas Kvinge 2023-03-24 20:57:46 +01:00
parent b766ae3498
commit 17c960ecd4
2 changed files with 157 additions and 3 deletions

View File

@ -119,6 +119,19 @@ const QStringList Song::kColumns = QStringList() << "title"
<< "rating"
<< "acoustid_fingerprint"
<< "musicbrainz_album_artist_id"
<< "musicbrainz_artist_id"
<< "musicbrainz_original_artist_id"
<< "musicbrainz_album_id"
<< "musicbrainz_original_album_id"
<< "musicbrainz_recording_id"
<< "musicbrainz_track_id"
<< "musicbrainz_disc_id"
<< "musicbrainz_release_group_id"
<< "musicbrainz_work_id"
;
const QString Song::kColumnSpec = Song::kColumns.join(", ");
@ -220,6 +233,19 @@ struct Song::Private : public QSharedData {
float rating_; // Database rating, initial rating read from tag.
QString acoustid_fingerprint_;
QString musicbrainz_album_artist_id_;
QString musicbrainz_artist_id_;
QString musicbrainz_original_artist_id_;
QString musicbrainz_album_id_;
QString musicbrainz_original_album_id_;
QString musicbrainz_recording_id_;
QString musicbrainz_track_id_;
QString musicbrainz_disc_id_;
QString musicbrainz_release_group_id_;
QString musicbrainz_work_id_;
QUrl stream_url_; // Temporary stream url set by url handler.
bool init_from_file_; // Whether this song was loaded from a file using taglib.
bool suspicious_tags_; // Whether our encoding guesser thinks these tags might be incorrectly encoded.
@ -435,6 +461,19 @@ bool Song::has_cue() const { return !d->cue_path_.isEmpty(); }
float Song::rating() const { return d->rating_; }
const QString &Song::acoustid_fingerprint() const { return d->acoustid_fingerprint_; }
const QString &Song::musicbrainz_album_artist_id() const { return d->musicbrainz_album_artist_id_; }
const QString &Song::musicbrainz_artist_id() const { return d->musicbrainz_artist_id_; }
const QString &Song::musicbrainz_original_artist_id() const { return d->musicbrainz_original_artist_id_; }
const QString &Song::musicbrainz_album_id() const { return d->musicbrainz_album_id_; }
const QString &Song::musicbrainz_original_album_id() const { return d->musicbrainz_original_album_id_; }
const QString &Song::musicbrainz_recording_id() const { return d->musicbrainz_recording_id_; }
const QString &Song::musicbrainz_track_id() const { return d->musicbrainz_track_id_; }
const QString &Song::musicbrainz_disc_id() const { return d->musicbrainz_disc_id_; }
const QString &Song::musicbrainz_release_group_id() const { return d->musicbrainz_release_group_id_; }
const QString &Song::musicbrainz_work_id() const { return d->musicbrainz_work_id_; }
bool Song::is_collection_song() const { return d->source_ == Source::Collection; }
bool Song::is_metadata_good() const { return !d->url_.isEmpty() && !d->artist_.isEmpty() && !d->title_.isEmpty(); }
bool Song::is_stream() const { return is_radio() || d->source_ == Source::Tidal || d->source_ == Source::Subsonic || d->source_ == Source::Qobuz; }
@ -540,6 +579,19 @@ 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_acoustid_fingerprint(const QString &v) { d->acoustid_fingerprint_ = v; }
void Song::set_musicbrainz_album_artist_id(const QString &v) { d->musicbrainz_album_artist_id_ = v; }
void Song::set_musicbrainz_artist_id(const QString &v) { d->musicbrainz_artist_id_ = v; }
void Song::set_musicbrainz_original_artist_id(const QString &v) { d->musicbrainz_original_artist_id_ = v; }
void Song::set_musicbrainz_album_id(const QString &v) { d->musicbrainz_album_id_ = v; }
void Song::set_musicbrainz_original_album_id(const QString &v) { d->musicbrainz_original_album_id_ = v; }
void Song::set_musicbrainz_recording_id(const QString &v) { d->musicbrainz_recording_id_ = v; }
void Song::set_musicbrainz_track_id(const QString &v) { d->musicbrainz_track_id_ = v; }
void Song::set_musicbrainz_disc_id(const QString &v) { d->musicbrainz_disc_id_ = v; }
void Song::set_musicbrainz_release_group_id(const QString &v) { d->musicbrainz_release_group_id_ = v; }
void Song::set_musicbrainz_work_id(const QString &v) { d->musicbrainz_work_id_ = v; }
void Song::set_stream_url(const QUrl &v) { d->stream_url_ = v; }
QString Song::JoinSpec(const QString &table) {
@ -941,6 +993,19 @@ void Song::InitFromProtobuf(const spb::tagreader::SongMetadata &pb) {
if (!art_automatic.isEmpty()) set_art_automatic(QUrl::fromLocalFile(art_automatic));
}
d->acoustid_fingerprint_ = QString::fromUtf8(pb.acoustid_fingerprint().data(), pb.acoustid_fingerprint().size());
d->musicbrainz_album_artist_id_ = QString::fromUtf8(pb.musicbrainz_album_artist_id().data(), pb.musicbrainz_album_artist_id().size());
d->musicbrainz_artist_id_ = QString::fromUtf8(pb.musicbrainz_artist_id().data(), pb.musicbrainz_artist_id().size());
d->musicbrainz_original_artist_id_ = QString::fromUtf8(pb.musicbrainz_original_artist_id().data(), pb.musicbrainz_original_artist_id().size());
d->musicbrainz_album_id_ = QString::fromUtf8(pb.musicbrainz_album_id().data(), pb.musicbrainz_album_id().size());
d->musicbrainz_original_album_id_ = QString::fromUtf8(pb.musicbrainz_original_album_id().data(), pb.musicbrainz_original_album_id().size());
d->musicbrainz_recording_id_ = QString::fromUtf8(pb.musicbrainz_recording_id().data(), pb.musicbrainz_recording_id().size());
d->musicbrainz_track_id_ = QString::fromUtf8(pb.musicbrainz_track_id().data(), pb.musicbrainz_track_id().size());
d->musicbrainz_disc_id_ = QString::fromUtf8(pb.musicbrainz_disc_id().data(), pb.musicbrainz_disc_id().size());
d->musicbrainz_release_group_id_ = QString::fromUtf8(pb.musicbrainz_release_group_id().data(), pb.musicbrainz_release_group_id().size());
d->musicbrainz_work_id_ = QString::fromUtf8(pb.musicbrainz_work_id().data(), pb.musicbrainz_work_id().size());
d->suspicious_tags_ = pb.suspicious_tags();
InitArtManual();
@ -984,6 +1049,20 @@ void Song::ToProtobuf(spb::tagreader::SongMetadata *pb) const {
pb->set_lastseen(d->lastseen_);
pb->set_art_automatic(art_automatic.constData(), art_automatic.size());
pb->set_rating(d->rating_);
pb->set_acoustid_fingerprint(d->acoustid_fingerprint_.toStdString());
pb->set_musicbrainz_album_artist_id(d->musicbrainz_album_artist_id_.toStdString());
pb->set_musicbrainz_artist_id(d->musicbrainz_artist_id_.toStdString());
pb->set_musicbrainz_original_artist_id(d->musicbrainz_original_artist_id_.toStdString());
pb->set_musicbrainz_album_id(d->musicbrainz_album_id_.toStdString());
pb->set_musicbrainz_original_album_id(d->musicbrainz_original_album_id_.toStdString());
pb->set_musicbrainz_recording_id(d->musicbrainz_recording_id_.toStdString());
pb->set_musicbrainz_track_id(d->musicbrainz_track_id_.toStdString());
pb->set_musicbrainz_disc_id(d->musicbrainz_disc_id_.toStdString());
pb->set_musicbrainz_release_group_id(d->musicbrainz_release_group_id_.toStdString());
pb->set_musicbrainz_work_id(d->musicbrainz_work_id_.toStdString());
pb->set_suspicious_tags(d->suspicious_tags_);
}
@ -1054,6 +1133,19 @@ void Song::InitFromQuery(const SqlRow &q, const bool reliable_metadata) {
d->cue_path_ = q.ValueToString("cue_path");
d->rating_ = q.ValueToFloat("rating");
d->acoustid_fingerprint_ = q.ValueToString("acoustid_fingerprint");
d->musicbrainz_album_artist_id_ = q.ValueToString("musicbrainz_album_artist_id");
d->musicbrainz_artist_id_ = q.ValueToString("musicbrainz_artist_id");
d->musicbrainz_original_artist_id_ = q.ValueToString("musicbrainz_original_artist_id");
d->musicbrainz_album_id_ = q.ValueToString("musicbrainz_album_id");
d->musicbrainz_original_album_id_ = q.ValueToString("musicbrainz_original_album_id");
d->musicbrainz_recording_id_ = q.ValueToString("musicbrainz_recording_id");
d->musicbrainz_track_id_ = q.ValueToString("musicbrainz_track_id");
d->musicbrainz_disc_id_ = q.ValueToString("musicbrainz_disc_id");
d->musicbrainz_release_group_id_ = q.ValueToString("musicbrainz_release_group_id");
d->musicbrainz_work_id_ = q.ValueToString("musicbrainz_work_id");
d->valid_ = true;
d->init_from_file_ = reliable_metadata;
@ -1403,6 +1495,19 @@ void Song::BindToQuery(SqlQuery *query) const {
query->BindFloatValue(":rating", d->rating_);
query->BindStringValue("acoustid_fingerprint", d->acoustid_fingerprint_);
query->BindStringValue("musicbrainz_album_artist_id", d->musicbrainz_album_artist_id_);
query->BindStringValue(":musicbrainz_artist_id", d->musicbrainz_artist_id_);
query->BindStringValue(":musicbrainz_original_artist_id", d->musicbrainz_original_artist_id_);
query->BindStringValue(":musicbrainz_album_id", d->musicbrainz_album_id_);
query->BindStringValue(":musicbrainz_original_album_id", d->musicbrainz_original_album_id_);
query->BindStringValue(":musicbrainz_recording_id", d->musicbrainz_recording_id_);
query->BindStringValue(":musicbrainz_track_id", d->musicbrainz_track_id_);
query->BindStringValue(":musicbrainz_disc_id", d->musicbrainz_disc_id_);
query->BindStringValue(":musicbrainz_release_group_id", d->musicbrainz_release_group_id_);
query->BindStringValue(":musicbrainz_work_id", d->musicbrainz_work_id_);
}
void Song::BindToFtsQuery(SqlQuery *query) const {
@ -1543,10 +1648,30 @@ bool Song::IsFingerprintEqual(const Song &other) const {
}
bool Song::IsAcoustidFingerprintEqual(const Song &other) const {
return d->acoustid_fingerprint_ == other.d->acoustid_fingerprint_;
}
bool Song::IsMusicBrainzEqual(const Song &other) const {
return d->musicbrainz_album_artist_id_ == other.d->musicbrainz_album_artist_id_ &&
d->musicbrainz_artist_id_ == other.d->musicbrainz_artist_id_ &&
d->musicbrainz_original_artist_id_ == other.d->musicbrainz_original_artist_id_ &&
d->musicbrainz_album_id_ == other.d->musicbrainz_album_id_ &&
d->musicbrainz_original_album_id_ == other.d->musicbrainz_original_album_id_ &&
d->musicbrainz_recording_id_ == other.d->musicbrainz_recording_id_ &&
d->musicbrainz_track_id_ == other.d->musicbrainz_track_id_ &&
d->musicbrainz_disc_id_ == other.d->musicbrainz_disc_id_ &&
d->musicbrainz_release_group_id_ == other.d->musicbrainz_release_group_id_ &&
d->musicbrainz_work_id_ == other.d->musicbrainz_work_id_;
}
bool Song::IsArtEqual(const Song &other) const {
return d->art_automatic_ == other.d->art_automatic_ &&
d->art_manual_ == other.d->art_manual_;
return d->art_automatic_ == other.d->art_automatic_ && d->art_manual_ == other.d->art_manual_;
}
@ -1555,7 +1680,8 @@ bool Song::IsAllMetadataEqual(const Song &other) const {
return IsMetadataEqual(other) &&
IsPlayStatisticsEqual(other) &&
IsRatingEqual(other) &&
IsFingerprintEqual(other) &&
IsAcoustidFingerprintEqual(other) &&
IsMusicBrainzEqual(other) &&
IsArtEqual(other);
}

View File

@ -259,6 +259,19 @@ class Song {
float rating() const;
const QString &acoustid_fingerprint() const;
const QString &musicbrainz_album_artist_id() const;
const QString &musicbrainz_artist_id() const;
const QString &musicbrainz_original_artist_id() const;
const QString &musicbrainz_album_id() const;
const QString &musicbrainz_original_album_id() const;
const QString &musicbrainz_recording_id() const;
const QString &musicbrainz_track_id() const;
const QString &musicbrainz_disc_id() const;
const QString &musicbrainz_release_group_id() const;
const QString &musicbrainz_work_id() const;
const QString &effective_album() const;
int effective_originalyear() const;
const QString &effective_albumartist() const;
@ -386,6 +399,19 @@ class Song {
void set_rating(const float v);
void set_acoustid_fingerprint(const QString &v);
void set_musicbrainz_album_artist_id(const QString &v);
void set_musicbrainz_artist_id(const QString &v);
void set_musicbrainz_original_artist_id(const QString &v);
void set_musicbrainz_album_id(const QString &v);
void set_musicbrainz_original_album_id(const QString &v);
void set_musicbrainz_recording_id(const QString &v);
void set_musicbrainz_track_id(const QString &v);
void set_musicbrainz_disc_id(const QString &v);
void set_musicbrainz_release_group_id(const QString &v);
void set_musicbrainz_work_id(const QString &v);
void set_stream_url(const QUrl &v);
// Comparison functions
@ -393,6 +419,8 @@ class Song {
bool IsPlayStatisticsEqual(const Song &other) const;
bool IsRatingEqual(const Song &other) const;
bool IsFingerprintEqual(const Song &other) const;
bool IsAcoustidFingerprintEqual(const Song &other) const;
bool IsMusicBrainzEqual(const Song &other) const;
bool IsArtEqual(const Song &other) const;
bool IsAllMetadataEqual(const Song &other) const;