ListenBrainz: try to match listens using track MBID if present
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user