From 89295075867591bee2780e09fd9ced9b427b7957 Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 19 May 2021 18:39:56 +0200 Subject: [PATCH] Fixed bad access since some tracks may be duplicated in the database --- src/libs/database/impl/Track.cpp | 6 ++++-- src/libs/database/include/database/Track.hpp | 2 +- .../scrobbling/impl/listenbrainz/ListensSynchronizer.cpp | 7 ++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libs/database/impl/Track.cpp b/src/libs/database/impl/Track.cpp index 64dcd4f2..9e1ef2a0 100644 --- a/src/libs/database/impl/Track.cpp +++ b/src/libs/database/impl/Track.cpp @@ -152,13 +152,15 @@ Track::getById(Session& session, IdType id) .where("id = ?").bind(id); } -Track::pointer +std::vector Track::getByRecordingMBID(Session& session, const UUID& mbid) { session.checkSharedLocked(); - return session.getDboSession().find() + Wt::Dbo::collection res = session.getDboSession().find() .where("recording_mbid = ?").bind(std::string {mbid.getAsString()}); + + return std::vector(res.begin(), res.end()); } Track::pointer diff --git a/src/libs/database/include/database/Track.hpp b/src/libs/database/include/database/Track.hpp index 7165c7a7..7fee6355 100644 --- a/src/libs/database/include/database/Track.hpp +++ b/src/libs/database/include/database/Track.hpp @@ -62,7 +62,7 @@ class Track : public Wt::Dbo::Dbo static std::size_t getCount(Session& session); static pointer getByPath(Session& session, const std::filesystem::path& p); static pointer getById(Session& session, IdType id); - static pointer getByRecordingMBID(Session& session, const UUID& MBID); + static std::vector getByRecordingMBID(Session& session, const UUID& MBID); static std::vector getSimilarTracks(Session& session, const std::unordered_set& trackIds, std::optional offset = {}, diff --git a/src/libs/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp b/src/libs/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp index 6d788e08..a6db9b37 100644 --- a/src/libs/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp +++ b/src/libs/scrobbling/impl/listenbrainz/ListensSynchronizer.cpp @@ -130,7 +130,12 @@ namespace { const Wt::Json::Object& additionalInfo = metadata.get("additional_info"); if (std::optional recordingMBID {UUID::fromString(additionalInfo.get("recording_mbid").orIfNull(""))}) - track = Database::Track::getByRecordingMBID(session, *recordingMBID); + { + const auto tracks {Database::Track::getByRecordingMBID(session, *recordingMBID)}; + // if duplicated files, do not record it (let the user correct its database) + if (tracks.size() == 1) + track = tracks.front(); + } } if (track)