Centralized artwork lookup logic
This commit is contained in:
@@ -28,9 +28,9 @@
|
||||
#include "database/Image.hpp"
|
||||
#include "database/Release.hpp"
|
||||
#include "database/Track.hpp"
|
||||
#include "database/TrackEmbeddedImage.hpp"
|
||||
#include "database/Types.hpp"
|
||||
#include "database/User.hpp"
|
||||
#include "services/artwork/IArtworkService.hpp"
|
||||
#include "services/feedback/IFeedbackService.hpp"
|
||||
#include "services/scrobbling/IScrobblingService.hpp"
|
||||
|
||||
@@ -87,23 +87,19 @@ namespace lms::api::subsonic
|
||||
}
|
||||
|
||||
albumNode.setAttribute("created", core::stringUtils::toISO8601String(release->getAddedTime()));
|
||||
if (const auto image{ release->getImage() })
|
||||
{
|
||||
const CoverArtId coverArtId{ image->getId(), image->getLastWriteTime().toTime_t() };
|
||||
albumNode.setAttribute("coverArt", idToString(coverArtId));
|
||||
}
|
||||
else
|
||||
{
|
||||
db::TrackEmbeddedImage::FindParameters params;
|
||||
params.setRelease(release->getId());
|
||||
params.setIsPreferred(true);
|
||||
params.setSortMethod(db::TrackEmbeddedImageSortMethod::FrontCoverAndSize);
|
||||
params.setRange(db::Range{ 0, 1 });
|
||||
|
||||
db::TrackEmbeddedImage::find(context.dbSession, params, [&](const db::TrackEmbeddedImage::pointer& image) {
|
||||
const CoverArtId coverArtId{ image->getId() };
|
||||
albumNode.setAttribute("coverArt", idToString(coverArtId));
|
||||
});
|
||||
{
|
||||
const auto imageResult{ core::Service<cover::IArtworkService>::get()->findReleaseImage(release->getId()) };
|
||||
if (const db::ImageId * imageId{ std::get_if<db::ImageId>(&imageResult) })
|
||||
{
|
||||
if (const db::Image::pointer image{ db::Image::find(context.dbSession, *imageId) })
|
||||
{
|
||||
const CoverArtId coverArtId{ *imageId, image->getLastWriteTime().toTime_t() };
|
||||
albumNode.setAttribute("coverArt", idToString(coverArtId));
|
||||
}
|
||||
}
|
||||
else if (const db::TrackEmbeddedImageId * embeddedImageId{ std::get_if<db::TrackEmbeddedImageId>(&imageResult) })
|
||||
albumNode.setAttribute("coverArt", idToString(*embeddedImageId));
|
||||
}
|
||||
if (const auto originalYear{ release->getOriginalYear() })
|
||||
albumNode.setAttribute("year", *originalYear);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "database/Release.hpp"
|
||||
#include "database/TrackArtistLink.hpp"
|
||||
#include "database/User.hpp"
|
||||
#include "services/artwork/IArtworkService.hpp"
|
||||
#include "services/feedback/IFeedbackService.hpp"
|
||||
|
||||
#include "CoverArtId.hpp"
|
||||
@@ -95,10 +96,18 @@ namespace lms::api::subsonic
|
||||
|
||||
artistNode.setAttribute("id", idToString(artist->getId()));
|
||||
artistNode.setAttribute("name", artist->getName());
|
||||
if (const auto image{ artist->getImage() })
|
||||
{
|
||||
const CoverArtId coverArtId{ image->getId(), image->getLastWriteTime().toTime_t() };
|
||||
artistNode.setAttribute("coverArt", idToString(coverArtId));
|
||||
const auto imageResult{ core::Service<cover::IArtworkService>::get()->findArtistImage(artist->getId()) };
|
||||
if (const db::ImageId * imageId{ std::get_if<db::ImageId>(&imageResult) })
|
||||
{
|
||||
if (const db::Image::pointer image{ db::Image::find(context.dbSession, *imageId) })
|
||||
{
|
||||
const CoverArtId coverArtId{ *imageId, image->getLastWriteTime().toTime_t() };
|
||||
artistNode.setAttribute("coverArt", idToString(coverArtId));
|
||||
}
|
||||
}
|
||||
else if (const db::TrackEmbeddedImageId * embeddedImageId{ std::get_if<db::TrackEmbeddedImageId>(&imageResult) })
|
||||
artistNode.setAttribute("coverArt", idToString(*embeddedImageId));
|
||||
}
|
||||
|
||||
const std::size_t count{ Release::getCount(context.dbSession, Release::FindParameters{}.setArtist(artist->getId())) };
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
#include "database/Release.hpp"
|
||||
#include "database/Track.hpp"
|
||||
#include "database/TrackArtistLink.hpp"
|
||||
#include "database/TrackEmbeddedImage.hpp"
|
||||
#include "database/Types.hpp"
|
||||
#include "database/User.hpp"
|
||||
#include "services/artwork/IArtworkService.hpp"
|
||||
#include "services/feedback/IFeedbackService.hpp"
|
||||
#include "services/scrobbling/IScrobblingService.hpp"
|
||||
|
||||
@@ -111,28 +111,18 @@ namespace lms::api::subsonic
|
||||
trackResponse.setAttribute("transcodedContentType", core::getMimeType(std::filesystem::path{ "." + fileSuffix }));
|
||||
}
|
||||
|
||||
const Release::pointer release{ track->getRelease() };
|
||||
|
||||
{
|
||||
TrackEmbeddedImage::FindParameters params;
|
||||
params.setTrack(track->getId());
|
||||
params.setIsPreferred(true);
|
||||
params.setRange(Range{ .offset = 0, .size = 1 });
|
||||
|
||||
bool hasEmbeddedImage{};
|
||||
TrackEmbeddedImage::find(context.dbSession, params, [&](const TrackEmbeddedImage::pointer& image) {
|
||||
const CoverArtId coverArtId{ image->getId() };
|
||||
trackResponse.setAttribute("coverArt", idToString(coverArtId));
|
||||
});
|
||||
|
||||
if (!hasEmbeddedImage && release)
|
||||
const auto imageResult{ core::Service<cover::IArtworkService>::get()->findPreferredTrackImage(track->getId()) };
|
||||
if (const db::ImageId * imageId{ std::get_if<db::ImageId>(&imageResult) })
|
||||
{
|
||||
if (const db::Image::pointer image{ release->getImage() })
|
||||
if (const db::Image::pointer image{ db::Image::find(context.dbSession, *imageId) })
|
||||
{
|
||||
const CoverArtId coverArtId{ image->getId(), image->getLastWriteTime().toTime_t() };
|
||||
const CoverArtId coverArtId{ *imageId, image->getLastWriteTime().toTime_t() };
|
||||
trackResponse.setAttribute("coverArt", idToString(coverArtId));
|
||||
}
|
||||
}
|
||||
else if (const db::TrackEmbeddedImageId * embeddedImageId{ std::get_if<db::TrackEmbeddedImageId>(&imageResult) })
|
||||
trackResponse.setAttribute("coverArt", idToString(*embeddedImageId));
|
||||
}
|
||||
|
||||
const std::vector<Artist::pointer>& artists{ track->getArtists({ TrackArtistLinkType::Artist }) };
|
||||
@@ -147,6 +137,7 @@ namespace lms::api::subsonic
|
||||
trackResponse.setAttribute("artistId", idToString(artists.front()->getId()));
|
||||
}
|
||||
|
||||
const Release::pointer release{ track->getRelease() };
|
||||
if (release)
|
||||
{
|
||||
trackResponse.setAttribute("album", release->getName());
|
||||
|
||||
Reference in New Issue
Block a user