Cover art handling: significantly reduce memory usage. fixes #93
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)>;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user