ListenBrainz: try to match listens using track MBID if present

This commit is contained in:
emeric
2023-03-03 13:58:52 +01:00
parent 1332287bbf
commit 422458821f
4 changed files with 22 additions and 2 deletions
@@ -31,6 +31,8 @@ namespace Scrobbling::ListenBrainz
os << ", releaseName = '" << listen.releaseName << "'";
if (listen.trackNumber)
os << ", trackNumber = " << *listen.trackNumber;
if (listen.trackMBID)
os << ", trackMBID = '" << listen.trackMBID->getAsString() << "'";
if (listen.recordingMBID)
os << ", recordingMBID = '" << listen.recordingMBID->getAsString() << "'";
@@ -33,6 +33,7 @@ namespace Scrobbling::ListenBrainz
std::string releaseName;
std::string artistName;
std::optional<UUID> recordingMBID;
std::optional<UUID> trackMBID;
std::optional<UUID> releaseMBID;
std::optional<unsigned> trackNumber;
Wt::WDateTime listenedAt;
@@ -51,6 +51,7 @@ namespace
if (metadata.type("additional_info") == Wt::Json::Type::Object)
{
const Wt::Json::Object& additionalInfo = metadata.get("additional_info");
listen.trackMBID = UUID::fromString(additionalInfo.get("track_mbid").orIfNull(""));
listen.recordingMBID = UUID::fromString(additionalInfo.get("recording_mbid").orIfNull(""));
listen.releaseMBID = UUID::fromString(additionalInfo.get("release_mbid").orIfNull(""));
@@ -150,7 +150,23 @@ namespace
auto transaction {session.createSharedTransaction()};
// first try to match using recording MBID, and then fallback on possibly ambiguous info
// first try to match using track MBID, and then fallback on possibly ambiguous info
if (listen.trackMBID)
{
const auto tracks {Track::findByMBID(session, *listen.trackMBID)};
// if duplicated files, do not record it (let the user correct its database)
if (tracks.size() == 1)
{
LOG(DEBUG) << "Matched listen '" << listen << "' using track MBID";
return tracks.front()->getId();
}
else if (tracks.size() > 1)
{
LOG(DEBUG) << "Too many matches for listen '" << listen << "' using track MBID!";
return {};
}
}
if (listen.recordingMBID)
{
const auto tracks {Track::findByRecordingMBID(session, *listen.recordingMBID)};
@@ -282,7 +298,7 @@ namespace Scrobbling::ListenBrainz
using namespace Database;
Session& session {_db.getTLSSession()};
auto transaction {session.createUniqueTransaction()};
auto transaction {session.createUniqueTransaction()}; // TODO: unique only if needed
Database::Listen::pointer dbListen {Database::Listen::find(session, listen.userId, listen.trackId, Database::Scrobbler::ListenBrainz, listen.listenedAt)};
if (!dbListen)