Cover art handling: significantly reduce memory usage. fixes #93

This commit is contained in:
emeric
2020-10-12 13:30:34 +02:00
parent f6736bb919
commit e79dae48d1
21 changed files with 440 additions and 273 deletions
+2 -2
View File
@@ -55,7 +55,7 @@ namespace API::Subsonic
{
std::vector<T> res {getMultiParametersAs<T>(parameterMap, param)};
if (res.empty())
throw RequiredParameterMissingError {};
throw RequiredParameterMissingError {param};
return res;
}
@@ -78,7 +78,7 @@ namespace API::Subsonic
{
auto res {getParameterAs<T>(parameterMap, param)};
if (!res)
throw RequiredParameterMissingError {};
throw RequiredParameterMissingError {param};
return *res;
}
+7 -7
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Emeric Poupon
* copyright (c) 2019 emeric poupon
*
* This file is part of LMS.
*
@@ -546,7 +546,7 @@ handleCreatePlaylistRequest(RequestContext& context)
throw BadParameterGenericError {"songId"};
if (!name && !id)
throw RequiredParameterMissingError {};
throw RequiredParameterMissingError {"name or id"};
auto transaction {context.dbSession.createUniqueTransaction()};
@@ -1746,21 +1746,21 @@ handleGetCoverArt(RequestContext& context, const Wt::Http::Request& /*request*/,
std::size_t size {getParameterAs<std::size_t>(context.parameters, "size").value_or(256)};
size = clamp(size, std::size_t {32}, std::size_t {1024});
std::vector<unsigned char> data;
std::unique_ptr<CoverArt::ICoverArt> cover;
switch (id.type)
{
case Id::Type::Track:
data = Service<CoverArt::IGrabber>::get()->getFromTrack(context.dbSession, id.value, CoverArt::Format::JPEG, size);
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(context.dbSession, id.value, size);
break;
case Id::Type::Release:
data = Service<CoverArt::IGrabber>::get()->getFromRelease(context.dbSession, id.value, CoverArt::Format::JPEG, size);
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(context.dbSession, id.value, size);
break;
default:
throw BadParameterGenericError {"id"};
}
response.out().write(reinterpret_cast<const char*>(&data[0]), data.size());
response.setMimeType(CoverArt::formatToMimeType(CoverArt::Format::JPEG));
response.out().write(reinterpret_cast<const char*>(cover->getData()), cover->getDataSize());
response.setMimeType(std::string {cover->getMimeType()});
}
using RequestHandlerFunc = std::function<Response(RequestContext& context)>;
+7 -2
View File
@@ -73,9 +73,14 @@ class GenericError : public Error
class RequiredParameterMissingError : public Error
{
public:
RequiredParameterMissingError() : Error {Code::RequiredParameterMissing} {}
RequiredParameterMissingError(std::string_view param)
: Error {Code::RequiredParameterMissing}
, _param {param}
{}
private:
std::string getMessage() const override { return "Required parameter is missing."; }
std::string getMessage() const override { return "Required parameter '" + _param + "' is missing."; }
std::string _param;
};
class ClientMustUpgradeError : public Error