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 << "'";
|
os << ", releaseName = '" << listen.releaseName << "'";
|
||||||
if (listen.trackNumber)
|
if (listen.trackNumber)
|
||||||
os << ", trackNumber = " << *listen.trackNumber;
|
os << ", trackNumber = " << *listen.trackNumber;
|
||||||
|
if (listen.trackMBID)
|
||||||
|
os << ", trackMBID = '" << listen.trackMBID->getAsString() << "'";
|
||||||
if (listen.recordingMBID)
|
if (listen.recordingMBID)
|
||||||
os << ", recordingMBID = '" << listen.recordingMBID->getAsString() << "'";
|
os << ", recordingMBID = '" << listen.recordingMBID->getAsString() << "'";
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ namespace Scrobbling::ListenBrainz
|
|||||||
std::string releaseName;
|
std::string releaseName;
|
||||||
std::string artistName;
|
std::string artistName;
|
||||||
std::optional<UUID> recordingMBID;
|
std::optional<UUID> recordingMBID;
|
||||||
|
std::optional<UUID> trackMBID;
|
||||||
std::optional<UUID> releaseMBID;
|
std::optional<UUID> releaseMBID;
|
||||||
std::optional<unsigned> trackNumber;
|
std::optional<unsigned> trackNumber;
|
||||||
Wt::WDateTime listenedAt;
|
Wt::WDateTime listenedAt;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ namespace
|
|||||||
if (metadata.type("additional_info") == Wt::Json::Type::Object)
|
if (metadata.type("additional_info") == Wt::Json::Type::Object)
|
||||||
{
|
{
|
||||||
const Wt::Json::Object& additionalInfo = metadata.get("additional_info");
|
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.recordingMBID = UUID::fromString(additionalInfo.get("recording_mbid").orIfNull(""));
|
||||||
listen.releaseMBID = UUID::fromString(additionalInfo.get("release_mbid").orIfNull(""));
|
listen.releaseMBID = UUID::fromString(additionalInfo.get("release_mbid").orIfNull(""));
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,23 @@ namespace
|
|||||||
|
|
||||||
auto transaction {session.createSharedTransaction()};
|
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)
|
if (listen.recordingMBID)
|
||||||
{
|
{
|
||||||
const auto tracks {Track::findByRecordingMBID(session, *listen.recordingMBID)};
|
const auto tracks {Track::findByRecordingMBID(session, *listen.recordingMBID)};
|
||||||
@@ -282,7 +298,7 @@ namespace Scrobbling::ListenBrainz
|
|||||||
using namespace Database;
|
using namespace Database;
|
||||||
|
|
||||||
Session& session {_db.getTLSSession()};
|
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)};
|
Database::Listen::pointer dbListen {Database::Listen::find(session, listen.userId, listen.trackId, Database::Scrobbler::ListenBrainz, listen.listenedAt)};
|
||||||
if (!dbListen)
|
if (!dbListen)
|
||||||
|
|||||||
Reference in New Issue
Block a user