diff --git a/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.cpp b/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.cpp index a817417f..6c846e71 100644 --- a/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.cpp +++ b/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.cpp @@ -48,10 +48,10 @@ namespace lms::recommendation session.checkReadTransaction(); const db::TrackMusicNNEmbeddings::pointer embeddings{ db::TrackMusicNNEmbeddings::find(session, trackId) }; - if (embeddings) + if (embeddings && !embeddings->getData().empty()) readEmbeddings(embeddings, vec); - return embeddings; + return embeddings && !embeddings->getData().empty(); } void MusicNNEmbeddingProvider::visitVectors(db::Session& session, const std::function& visitor) @@ -60,6 +60,8 @@ namespace lms::recommendation Vector vec; db::TrackMusicNNEmbeddings::find(session, [&](const db::TrackMusicNNEmbeddings::pointer& embeddings) { + if (embeddings->getData().empty()) + return; readEmbeddings(embeddings, vec); visitor(embeddings->getTrackId(), vec); }); diff --git a/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.hpp b/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.hpp index 33d6d521..cc355603 100644 --- a/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.hpp +++ b/src/libs/services/recommendation/impl/audio-similarity/musicnn/MusicNNEmbeddingProvider.hpp @@ -40,7 +40,6 @@ namespace lms::recommendation static constexpr std::size_t DimCount{ 200 }; using Vector = math::Vector; - static std::size_t getCount(db::Session& session); static bool getVector(db::Session& session, db::TrackId trackId, Vector& vec); static void visitVectors(db::Session& session, const std::function& visitor); }; diff --git a/src/libs/services/scanner/impl/steps/ScanStepExtractMusicNNEmbeddings.cpp b/src/libs/services/scanner/impl/steps/ScanStepExtractMusicNNEmbeddings.cpp index e4499be4..1b55561d 100644 --- a/src/libs/services/scanner/impl/steps/ScanStepExtractMusicNNEmbeddings.cpp +++ b/src/libs/services/scanner/impl/steps/ScanStepExtractMusicNNEmbeddings.cpp @@ -92,6 +92,7 @@ namespace lms::scanner ExtractMusicNNEmbeddingsJob& operator=(const ExtractMusicNNEmbeddingsJob&) = delete; const TrackLocation& getTrackLocation() const { return _trackLocation; } + bool isSuccess() const { return _success; } const audio::TrackMusicNNEmbeddings* getEmbeddings() const { return _embeddings ? &_embeddings.value() : nullptr; } std::string_view getErrorMessage() const { return _errorMessage; } @@ -107,6 +108,8 @@ namespace lms::scanner if (result.patchCount > 0) _embeddings.emplace(result.embeddings); LMS_LOG(DBUPDATER, DEBUG, "MusicNN extraction complete for " << _trackLocation.trackPath << " (" << result.patchCount << " patches)"); + + _success = true; } catch (const audio::Exception& e) { @@ -116,6 +119,7 @@ namespace lms::scanner const audio::IMusicNNEmbeddingExtractor& _extractor; const TrackLocation _trackLocation; + bool _success{}; std::optional _embeddings; std::string _errorMessage; }; @@ -125,10 +129,13 @@ namespace lms::scanner db::Track::pointer track{ db::Track::find(session, assoc.trackId) }; assert(track); - std::vector blob(sizeof(audio::TrackMusicNNEmbeddings)); - audio::trackMusicNNEmbeddingsToBlob(*assoc.embeddings, blob); db::TrackMusicNNEmbeddings::pointer entry{ session.create(track) }; - entry.modify()->setData(blob); + if (assoc.embeddings) + { + std::vector blob(sizeof(audio::TrackMusicNNEmbeddings)); + audio::trackMusicNNEmbeddingsToBlob(*assoc.embeddings, blob); + entry.modify()->setData(blob); + } } void writeEmbeddings(ScanContext& context, db::Session& session, TrackEmbeddingAssociationContainer& pendingAssocs, bool forceFullBatch) @@ -202,10 +209,22 @@ namespace lms::scanner { const auto& extractJob{ static_cast(*job) }; - if (const audio::TrackMusicNNEmbeddings * embeddings{ extractJob.getEmbeddings() }) - pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = *embeddings }); + if (extractJob.isSuccess()) + { + if (const audio::TrackMusicNNEmbeddings * embeddings{ extractJob.getEmbeddings() }) + { + pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = *embeddings }); + } + else + { + LMS_LOG(DBUPDATER, INFO, "No patch extracted from " << extractJob.getTrackLocation().trackPath); + pendingAssocs.push_back(TrackEmbeddingAssociation{ .trackId = extractJob.getTrackLocation().track, .embeddings = std::nullopt }); + } + } else + { addError(context, extractJob.getTrackLocation().trackPath, extractJob.getErrorMessage()); + } } context.currentStepStats.processedElems += jobs.size();