Removed UUID constraint on listenbrainz token, fixes #825

This commit is contained in:
emeric
2026-03-10 17:07:12 +01:00
parent 82468be9cc
commit 086cbea03e
10 changed files with 49 additions and 42 deletions
@@ -118,13 +118,13 @@ namespace lms::feedback::listenBrainz
return;
}
const std::optional<core::UUID> listenBrainzToken{ starredTrack->getUser()->getListenBrainzToken() };
if (!listenBrainzToken)
const std::string listenBrainzToken{ starredTrack->getUser()->getListenBrainzToken() };
if (listenBrainzToken.empty())
return;
core::http::ClientPOSTRequestParameters request;
request.relativeUrl = "/1/feedback/recording-feedback";
request.message.addHeader("Authorization", "Token " + std::string{ listenBrainzToken->getAsString() });
request.message.addHeader("Authorization", "Token " + listenBrainzToken);
Wt::Json::Object root;
root["recording_mbid"] = Wt::Json::Value{ std::string{ recordingMBID->getAsString() } };
@@ -310,8 +310,8 @@ namespace lms::feedback::listenBrainz
{
assert(context.listenBrainzUserName.empty());
const std::optional<core::UUID> listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), context.userId) };
if (!listenBrainzToken)
const std::string listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), context.userId) };
if (listenBrainzToken.empty())
{
onSyncEnded(context);
return;
@@ -320,7 +320,7 @@ namespace lms::feedback::listenBrainz
core::http::ClientGETRequestParameters request;
request.priority = core::http::ClientRequestParameters::Priority::Low;
request.relativeUrl = "/1/validate-token";
request.headers = { { "Authorization", "Token " + std::string{ listenBrainzToken->getAsString() } } };
request.headers = { { "Authorization", "Token " + listenBrainzToken } };
request.onSuccessFunc = [this, &context](const Wt::Http::Message& msg) {
context.listenBrainzUserName = utils::parseValidateToken(msg.body());
if (context.listenBrainzUserName.empty())
@@ -27,15 +27,18 @@
namespace lms::feedback::listenBrainz::utils
{
std::optional<core::UUID> getListenBrainzToken(db::Session& session, db::UserId userId)
std::string getListenBrainzToken(db::Session& session, db::UserId userId)
{
auto transaction{ session.createReadTransaction() };
std::string res;
const db::User::pointer user{ db::User::find(session, userId) };
if (!user)
return std::nullopt;
{
auto transaction{ session.createReadTransaction() };
return user->getListenBrainzToken();
if (const db::User::pointer user{ db::User::find(session, userId) })
res = std::string{ user->getListenBrainzToken() };
}
return res;
}
std::string parseValidateToken(std::string_view msgBody)
@@ -20,7 +20,7 @@
#pragma once
#include "core/ILogger.hpp"
#include "core/UUID.hpp"
#include "database/objects/UserId.hpp"
#define LOG(sev, message) LMS_LOG(FEEDBACK, sev, "[listenbrainz] " << message)
@@ -32,6 +32,6 @@ namespace lms::db
namespace lms::feedback::listenBrainz::utils
{
std::optional<core::UUID> getListenBrainzToken(db::Session& session, db::UserId userId);
std::string getListenBrainzToken(db::Session& session, db::UserId userId);
std::string parseValidateToken(std::string_view msgBody);
} // namespace lms::feedback::listenBrainz::utils
@@ -291,34 +291,32 @@ namespace lms::scrobbling::listenBrainz
return;
}
const std::optional<core::UUID> listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), listen.userId) };
if (!listenBrainzToken)
const std::string listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), listen.userId) };
if (listenBrainzToken.empty())
{
LOG(DEBUG, "No listenbrainz token found: skipping");
return;
}
request.message.addBodyText(bodyText);
request.message.addHeader("Authorization", "Token " + std::string{ listenBrainzToken->getAsString() });
request.message.addHeader("Authorization", "Token " + listenBrainzToken);
request.message.addHeader("Content-Type", "application/json");
_client.sendPOSTRequest(std::move(request));
}
bool ListensSynchronizer::saveListen(const TimedListen& listen, db::SyncState scrobblingState)
{
using namespace db;
Session& session{ _db.getTLSSession() };
db::Session& session{ _db.getTLSSession() };
auto transaction{ session.createWriteTransaction() }; // TODO: unique only if needed
db::Listen::pointer dbListen{ db::Listen::find(session, listen.userId, listen.trackId, db::ScrobblingBackend::ListenBrainz, listen.listenedAt) };
if (!dbListen)
{
const User::pointer user{ User::find(session, listen.userId) };
const db::User::pointer user{ db::User::find(session, listen.userId) };
if (!user)
return false;
const Track::pointer track{ Track::find(session, listen.trackId) };
const db::Track::pointer track{ db::Track::find(session, listen.trackId) };
if (!track)
return false;
@@ -464,8 +462,8 @@ namespace lms::scrobbling::listenBrainz
{
assert(context.listenBrainzUserName.empty());
const std::optional<core::UUID> listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), context.userId) };
if (!listenBrainzToken)
const std::string listenBrainzToken{ utils::getListenBrainzToken(_db.getTLSSession(), context.userId) };
if (listenBrainzToken.empty())
{
onSyncEnded(context);
return;
@@ -474,7 +472,7 @@ namespace lms::scrobbling::listenBrainz
core::http::ClientGETRequestParameters request;
request.priority = core::http::ClientRequestParameters::Priority::Low;
request.relativeUrl = "/1/validate-token";
request.headers = { { "Authorization", "Token " + std::string{ listenBrainzToken->getAsString() } } };
request.headers = { { "Authorization", "Token " + listenBrainzToken } };
request.onSuccessFunc = [this, &context](const Wt::Http::Message& msg) {
context.listenBrainzUserName = utils::parseValidateToken(msg.body());
if (context.listenBrainzUserName.empty())
@@ -55,7 +55,7 @@ namespace lms::scrobbling::listenBrainz
private:
void enqueListen(const Listen& listen, const Wt::WDateTime& timePoint);
bool saveListen(const TimedListen& listen, db::SyncState scrobblinState);
bool saveListen(const TimedListen& listen, db::SyncState scrobblingState);
void enquePendingListens();
@@ -27,15 +27,18 @@
namespace lms::scrobbling::listenBrainz::utils
{
std::optional<core::UUID> getListenBrainzToken(db::Session& session, db::UserId userId)
std::string getListenBrainzToken(db::Session& session, db::UserId userId)
{
auto transaction{ session.createReadTransaction() };
std::string res;
const db::User::pointer user{ db::User::find(session, userId) };
if (!user)
return std::nullopt;
{
auto transaction{ session.createReadTransaction() };
return user->getListenBrainzToken();
if (const db::User::pointer user{ db::User::find(session, userId) })
res = user->getListenBrainzToken();
}
return res;
}
std::string parseValidateToken(std::string_view msgBody)
@@ -20,7 +20,7 @@
#pragma once
#include "core/ILogger.hpp"
#include "core/UUID.hpp"
#include "database/objects/UserId.hpp"
#define LOG(sev, message) LMS_LOG(SCROBBLING, sev, "[listenbrainz] " << message)
@@ -32,6 +32,6 @@ namespace lms::db
namespace lms::scrobbling::listenBrainz::utils
{
std::optional<core::UUID> getListenBrainzToken(db::Session& session, db::UserId userId);
std::string getListenBrainzToken(db::Session& session, db::UserId userId);
std::string parseValidateToken(std::string_view msgBody);
} // namespace lms::scrobbling::listenBrainz::utils