diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.cpp b/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.cpp index 53ff4564..88f7d40d 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.cpp @@ -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() << "'"; diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.hpp b/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.hpp index d5a17c9e..10f21477 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.hpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListenTypes.hpp @@ -33,6 +33,7 @@ namespace Scrobbling::ListenBrainz std::string releaseName; std::string artistName; std::optional recordingMBID; + std::optional trackMBID; std::optional releaseMBID; std::optional trackNumber; Wt::WDateTime listenedAt; diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListensParser.cpp b/src/libs/services/scrobbling/impl/listenbrainz/ListensParser.cpp index 495ac101..765b5b5c 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListensParser.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListensParser.cpp @@ -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("")); diff --git a/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp b/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp index f1a79df0..caf42117 100644 --- a/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp +++ b/src/libs/services/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp @@ -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)