Now using new artwork table everywhere in app and subsonic API to refer to artworks

This commit is contained in:
emeric
2025-06-22 16:49:54 +02:00
parent 93b446e124
commit c251c2a924
34 changed files with 475 additions and 478 deletions
@@ -60,14 +60,14 @@ namespace lms::scanner
return false;
}
struct ReleaseImageAssociation
struct ReleaseArtworkAssociation
{
db::ReleaseId releaseId;
db::Release::pointer release;
ReleaseArtwork preferredArtwork;
};
using ReleaseImageAssociationContainer = std::deque<ReleaseImageAssociation>;
using ReleaseArtworkAssociationContainer = std::deque<ReleaseArtworkAssociation>;
struct SearchReleaseImageContext
struct SearchReleaseArtworkContext
{
db::Session& session;
db::ReleaseId lastRetrievedReleaseId;
@@ -75,7 +75,7 @@ namespace lms::scanner
const std::vector<std::string>& releaseImageFileNames;
};
db::Image::pointer findImageInDirectory(SearchReleaseImageContext& searchContext, const std::filesystem::path& directoryPath)
db::Image::pointer findImageInDirectory(SearchReleaseArtworkContext& searchContext, const std::filesystem::path& directoryPath)
{
db::Image::pointer image;
@@ -101,7 +101,7 @@ namespace lms::scanner
return image;
}
db::Image::pointer computePreferredReleaseImage(SearchReleaseImageContext& searchContext, const db::Release::pointer& release)
db::Image::pointer computePreferredReleaseImage(SearchReleaseArtworkContext& searchContext, const db::Release::pointer& release)
{
db::Image::pointer image;
@@ -149,7 +149,7 @@ namespace lms::scanner
return image;
}
ReleaseArtwork computePreferredReleaseArtwork(SearchReleaseImageContext& searchContext, const db::Release::pointer& release)
ReleaseArtwork computePreferredReleaseArtwork(SearchReleaseArtworkContext& searchContext, const db::Release::pointer& release)
{
const db::Image::pointer image{ computePreferredReleaseImage(searchContext, release) };
if (image)
@@ -187,7 +187,7 @@ namespace lms::scanner
return ReleaseArtwork{};
}
bool fetchNextReleaseArtworksToUpdate(SearchReleaseImageContext& searchContext, ReleaseImageAssociationContainer& releaseImageAssociations)
bool fetchNextReleaseArtworksToUpdate(SearchReleaseArtworkContext& searchContext, ReleaseArtworkAssociationContainer& ReleaseArtworkAssociations)
{
const db::ReleaseId releaseId{ searchContext.lastRetrievedReleaseId };
@@ -201,7 +201,7 @@ namespace lms::scanner
const db::Artwork::pointer currentPreferredArtwork{ release->getPreferredArtwork() };
if (!isSameArtwork(preferredArtwork, currentPreferredArtwork))
releaseImageAssociations.push_back(ReleaseImageAssociation{ release->getId(), preferredArtwork });
ReleaseArtworkAssociations.push_back(ReleaseArtworkAssociation{ release, preferredArtwork });
searchContext.processedReleaseCount++;
});
}
@@ -209,16 +209,14 @@ namespace lms::scanner
return releaseId != searchContext.lastRetrievedReleaseId;
}
void updateReleaseArtwork(db::Session& session, const ReleaseImageAssociation& releaseImageAssociation)
void updateReleaseArtwork(db::Session& session, const ReleaseArtworkAssociation& ReleaseArtworkAssociation)
{
db::Release::pointer release{ db::Release::find(session, releaseImageAssociation.releaseId) };
assert(release);
db::Release::pointer release{ ReleaseArtworkAssociation.release };
db::Artwork::pointer artwork;
if (const db::TrackEmbeddedImageId * trackEmbeddedImageId{ std::get_if<db::TrackEmbeddedImageId>(&releaseImageAssociation.preferredArtwork) })
if (const db::TrackEmbeddedImageId * trackEmbeddedImageId{ std::get_if<db::TrackEmbeddedImageId>(&ReleaseArtworkAssociation.preferredArtwork) })
artwork = utils::getOrCreateArtworkFromTrackEmbeddedImage(session, *trackEmbeddedImageId);
else if (const db::ImageId * imageId{ std::get_if<db::ImageId>(&releaseImageAssociation.preferredArtwork) })
else if (const db::ImageId * imageId{ std::get_if<db::ImageId>(&ReleaseArtworkAssociation.preferredArtwork) })
artwork = utils::getOrCreateArtworkFromImage(session, *imageId);
release.modify()->setPreferredArtwork(artwork);
@@ -229,7 +227,7 @@ namespace lms::scanner
LMS_LOG(DBUPDATER, DEBUG, "Removed preferred artwork from release '" << release->getName() << "'");
}
void updateReleaseImages(db::Session& session, ReleaseImageAssociationContainer& imageAssociations)
void updateReleaseArtworks(db::Session& session, ReleaseArtworkAssociationContainer& imageAssociations)
{
constexpr std::size_t writeBatchSize{ 50 };
@@ -280,19 +278,19 @@ namespace lms::scanner
context.currentStepStats.totalElems = db::Release::getCount(session);
}
SearchReleaseImageContext searchContext{
SearchReleaseArtworkContext searchContext{
.session = session,
.lastRetrievedReleaseId = {},
.releaseImageFileNames = _releaseImageFileNames,
};
ReleaseImageAssociationContainer releaseImageAssociations;
while (fetchNextReleaseArtworksToUpdate(searchContext, releaseImageAssociations))
ReleaseArtworkAssociationContainer ReleaseArtworkAssociations;
while (fetchNextReleaseArtworksToUpdate(searchContext, ReleaseArtworkAssociations))
{
if (_abortScan)
return;
updateReleaseImages(session, releaseImageAssociations);
updateReleaseArtworks(session, ReleaseArtworkAssociations);
context.currentStepStats.processedElems = searchContext.processedReleaseCount;
_progressCallback(context.currentStepStats);
}
@@ -62,22 +62,22 @@ namespace lms::scanner
return !std::holds_alternative<std::monostate>(res);
}
struct TrackImageAssociation
struct TrackArtworksAssociation
{
db::Track::pointer track;
TrackArtwork preferredArtwork;
TrackArtwork preferredMediaArtwork;
};
using TrackImageAssociationContainer = std::deque<TrackImageAssociation>;
using TrackArtworksAssociationContainer = std::deque<TrackArtworksAssociation>;
struct SearchTrackImageContext
struct SearchTrackArtworkContext
{
db::Session& session;
db::TrackId lastRetrievedTrackId;
std::size_t processedTrackCount{};
};
TrackArtwork computePreferredTrackArtwork(SearchTrackImageContext& searchContext, const db::Track::pointer& track)
TrackArtwork computePreferredTrackArtwork(SearchTrackArtworkContext& searchContext, const db::Track::pointer& track)
{
// Try to get a media image
TrackArtwork res;
@@ -135,7 +135,7 @@ namespace lms::scanner
return res;
}
TrackArtwork computePreferredTrackMediaArtwork(SearchTrackImageContext& searchContext, const db::Track::pointer& track)
TrackArtwork computePreferredTrackMediaArtwork(SearchTrackArtworkContext& searchContext, const db::Track::pointer& track)
{
TrackArtwork res;
{
@@ -165,7 +165,7 @@ namespace lms::scanner
return res;
}
bool fetchNextTrackArtworksToUpdate(SearchTrackImageContext& searchContext, TrackImageAssociationContainer& trackImageAssociations)
bool fetchNextTrackArtworksToUpdate(SearchTrackArtworkContext& searchContext, TrackArtworksAssociationContainer& TrackArtworksAssociations)
{
const db::TrackId trackId{ searchContext.lastRetrievedTrackId };
@@ -184,7 +184,7 @@ namespace lms::scanner
if (!isSameArtwork(preferredArtwork, currentPreferredArtwork)
|| !isSameArtwork(preferredMediaArtwork, currentPreferredMediaArtwork))
{
trackImageAssociations.push_back(TrackImageAssociation{ track, preferredArtwork, preferredMediaArtwork });
TrackArtworksAssociations.push_back(TrackArtworksAssociation{ track, preferredArtwork, preferredMediaArtwork });
}
searchContext.processedTrackCount++;
@@ -226,24 +226,24 @@ namespace lms::scanner
LMS_LOG(DBUPDATER, DEBUG, "Removed preferred media artwork from track '" << track->getAbsoluteFilePath() << "'");
}
void updateTrackPreferredArtworks(db::Session& session, const TrackImageAssociation& trackImageAssociation)
void updateTrackPreferredArtworks(db::Session& session, const TrackArtworksAssociation& TrackArtworksAssociation)
{
db::Track::pointer track{ trackImageAssociation.track };
db::Track::pointer track{ TrackArtworksAssociation.track };
{
const db::Artwork::pointer currentPreferredArtwork{ track->getPreferredArtwork() };
if (!isSameArtwork(trackImageAssociation.preferredArtwork, currentPreferredArtwork))
updateTrackPreferredArtwork(session, track, trackImageAssociation.preferredArtwork);
if (!isSameArtwork(TrackArtworksAssociation.preferredArtwork, currentPreferredArtwork))
updateTrackPreferredArtwork(session, track, TrackArtworksAssociation.preferredArtwork);
}
{
const db::Artwork::pointer currentPreferredMediaArtwork{ track->getPreferredMediaArtwork() };
if (!isSameArtwork(trackImageAssociation.preferredMediaArtwork, currentPreferredMediaArtwork))
updateTrackPreferredMediaArtwork(session, track, trackImageAssociation.preferredMediaArtwork);
if (!isSameArtwork(TrackArtworksAssociation.preferredMediaArtwork, currentPreferredMediaArtwork))
updateTrackPreferredMediaArtwork(session, track, TrackArtworksAssociation.preferredMediaArtwork);
}
}
void updateTrackPreferredArtworks(db::Session& session, TrackImageAssociationContainer& imageAssociations)
void updateTrackPreferredArtworks(db::Session& session, TrackArtworksAssociationContainer& imageAssociations)
{
constexpr std::size_t writeBatchSize{ 50 };
@@ -279,18 +279,18 @@ namespace lms::scanner
context.currentStepStats.totalElems = db::Track::getCount(session);
}
SearchTrackImageContext searchContext{
SearchTrackArtworkContext searchContext{
.session = session,
.lastRetrievedTrackId = {},
};
TrackImageAssociationContainer trackImageAssociations;
while (fetchNextTrackArtworksToUpdate(searchContext, trackImageAssociations))
TrackArtworksAssociationContainer TrackArtworksAssociations;
while (fetchNextTrackArtworksToUpdate(searchContext, TrackArtworksAssociations))
{
if (_abortScan)
return;
updateTrackPreferredArtworks(session, trackImageAssociations);
updateTrackPreferredArtworks(session, TrackArtworksAssociations);
context.currentStepStats.processedElems = searchContext.processedTrackCount;
_progressCallback(context.currentStepStats);
}