Simplify the covert art resource, step 2
This commit is contained in:
@@ -213,5 +213,21 @@ Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, s
|
|||||||
return *cover;
|
return *cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>
|
||||||
|
Grabber::getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size) const
|
||||||
|
{
|
||||||
|
Image::Image cover = getFromTrack(session, trackId, size);
|
||||||
|
|
||||||
|
return cover.save(Image::Format::JPEG);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t>
|
||||||
|
Grabber::getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size) const
|
||||||
|
{
|
||||||
|
Image::Image cover = getFromRelease(session, releaseId, size);
|
||||||
|
|
||||||
|
return cover.save(Image::Format::JPEG);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace CoverArt
|
} // namespace CoverArt
|
||||||
|
|
||||||
|
|||||||
@@ -35,13 +35,16 @@ class Grabber
|
|||||||
|
|
||||||
static Grabber& instance();
|
static Grabber& instance();
|
||||||
|
|
||||||
Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size) const;
|
std::vector<uint8_t> getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, Image::Format format, std::size_t size) const;
|
||||||
Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size) const;
|
std::vector<uint8_t> getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, Image::Format format, std::size_t size) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Grabber();
|
Grabber();
|
||||||
|
|
||||||
|
Image::Image getFromTrack(Wt::Dbo::Session& session, Database::IdType trackId, std::size_t size) const;
|
||||||
|
Image::Image getFromRelease(Wt::Dbo::Session& session, Database::IdType releaseId, std::size_t size) const;
|
||||||
|
|
||||||
boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const;
|
boost::optional<Image::Image> getFromTrack(const boost::filesystem::path& path) const;
|
||||||
std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const;
|
std::vector<boost::filesystem::path> getCoverPaths(const boost::filesystem::path& directoryPath) const;
|
||||||
boost::optional<Image::Image> getFromDirectory(const boost::filesystem::path& path) const;
|
boost::optional<Image::Image> getFromDirectory(const boost::filesystem::path& path) const;
|
||||||
|
|||||||
+6
-5
@@ -97,13 +97,13 @@ Image::scale(std::size_t size)
|
|||||||
}
|
}
|
||||||
catch (Magick::Exception& e)
|
catch (Magick::Exception& e)
|
||||||
{
|
{
|
||||||
LMS_LOG(COVER, ERROR) << "Caught Magick exception: " << e.what();
|
LMS_LOG(COVER, ERROR) << "Caught Magick exception during scale: " << e.what();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
std::vector<uint8_t>
|
||||||
Image::save(std::vector<unsigned char>& data, Format format) const
|
Image::save(Format format) const
|
||||||
{
|
{
|
||||||
Magick::Image outputImage(_image);
|
Magick::Image outputImage(_image);
|
||||||
|
|
||||||
@@ -112,8 +112,9 @@ Image::save(std::vector<unsigned char>& data, Format format) const
|
|||||||
Magick::Blob blob;
|
Magick::Blob blob;
|
||||||
outputImage.write(&blob);
|
outputImage.write(&blob);
|
||||||
|
|
||||||
unsigned char *charBuf = (unsigned char*)blob.data();
|
auto begin = static_cast<const uint8_t*>(blob.data());
|
||||||
data.assign( charBuf, charBuf + blob.length() );
|
|
||||||
|
return std::vector<uint8_t>(begin, begin + blob.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Image
|
} // namespace Image
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ class Image
|
|||||||
bool scale(std::size_t size);
|
bool scale(std::size_t size);
|
||||||
|
|
||||||
// output
|
// output
|
||||||
void save(std::vector<unsigned char>& rawData, Format format) const;
|
std::vector<uint8_t> save(Format format) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Magick::Image _image;
|
Magick::Image _image;
|
||||||
|
|||||||
@@ -54,29 +54,6 @@ ImageResource::getTrackUrl(Database::IdType trackId, std::size_t size) const
|
|||||||
return url() + "&trackid=" + std::to_string(trackId) + "&size=" + std::to_string(size);
|
return url() + "&trackid=" + std::to_string(trackId) + "&size=" + std::to_string(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
|
||||||
ImageResource::getArtistUrl(Database::IdType artistId, std::size_t size) const
|
|
||||||
{
|
|
||||||
return url() + "&artistid=" + std::to_string(artistId) + "&size=" + std::to_string(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
|
||||||
ImageResource::getUnknownTrackUrl(size_t size) const
|
|
||||||
{
|
|
||||||
return url() + "&size=" + std::to_string(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ImageResource::putImage(Wt::Http::Response& response, Image::Image cover)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
|
|
||||||
cover.save(data, Image::Format::JPEG);
|
|
||||||
|
|
||||||
response.setMimeType( Image::format_to_mimeType(Image::Format::JPEG) );
|
|
||||||
response.out().write(reinterpret_cast<const char *>(&data[0]), data.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ImageResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
ImageResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
||||||
{
|
{
|
||||||
@@ -93,7 +70,7 @@ ImageResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
|
|||||||
if (!size || *size > maxSize)
|
if (!size || *size > maxSize)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Image::Image cover;
|
std::vector<uint8_t> cover;
|
||||||
|
|
||||||
if (trackIdStr)
|
if (trackIdStr)
|
||||||
{
|
{
|
||||||
@@ -104,7 +81,7 @@ ImageResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
|
|||||||
// transactions are not thread safe
|
// transactions are not thread safe
|
||||||
{
|
{
|
||||||
Wt::WApplication::UpdateLock lock(LmsApp);
|
Wt::WApplication::UpdateLock lock(LmsApp);
|
||||||
cover = CoverArt::Grabber::instance().getFromTrack(LmsApp->getDboSession(), *trackId, *size);
|
cover = CoverArt::Grabber::instance().getFromTrack(LmsApp->getDboSession(), *trackId, Image::Format::JPEG, *size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (releaseIdStr)
|
else if (releaseIdStr)
|
||||||
@@ -116,13 +93,14 @@ ImageResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
|
|||||||
// transactions are not thread safe
|
// transactions are not thread safe
|
||||||
{
|
{
|
||||||
Wt::WApplication::UpdateLock lock(LmsApp);
|
Wt::WApplication::UpdateLock lock(LmsApp);
|
||||||
cover = CoverArt::Grabber::instance().getFromRelease(LmsApp->getDboSession(), *releaseId, *size);
|
cover = CoverArt::Grabber::instance().getFromRelease(LmsApp->getDboSession(), *releaseId, Image::Format::JPEG, *size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
putImage(response, cover);
|
response.setMimeType( Image::format_to_mimeType(Image::Format::JPEG) );
|
||||||
|
response.out().write(reinterpret_cast<const char *>(&cover[0]), cover.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace UserInterface
|
} // namespace UserInterface
|
||||||
|
|||||||
@@ -41,16 +41,9 @@ class ImageResource : public Wt::WResource
|
|||||||
|
|
||||||
std::string getReleaseUrl(Database::IdType releaseId, size_t size) const;
|
std::string getReleaseUrl(Database::IdType releaseId, size_t size) const;
|
||||||
std::string getTrackUrl(Database::IdType trackId, size_t size) const;
|
std::string getTrackUrl(Database::IdType trackId, size_t size) const;
|
||||||
std::string getArtistUrl(Database::IdType artistId, size_t size) const;
|
|
||||||
std::string getUnknownTrackUrl(size_t size) const;
|
|
||||||
|
|
||||||
void handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response);
|
void handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response);
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void putImage(Wt::Http::Response& response, Image::Image image);
|
|
||||||
void putCover(Wt::Http::Response& response, std::vector<Image::Image> covers, std::size_t size);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace UserInterface
|
} // namespace UserInterface
|
||||||
|
|||||||
Reference in New Issue
Block a user