Renamed CoverArtGrabber to CoverService

This commit is contained in:
emeric
2021-10-15 20:58:14 +02:00
parent 11f8a9e38b
commit 0dcef2e94c
16 changed files with 70 additions and 70 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
add_library(lmscover SHARED add_library(lmscover SHARED
impl/CoverArtGrabber.cpp impl/CoverService.cpp
) )
target_include_directories(lmscover INTERFACE target_include_directories(lmscover INTERFACE
@@ -17,7 +17,7 @@
* along with LMS. If not, see <http://www.gnu.org/licenses/>. * along with LMS. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "CoverArtGrabber.hpp" #include "CoverService.hpp"
#include "av/IAudioFile.hpp" #include "av/IAudioFile.hpp"
@@ -28,10 +28,10 @@
#if LMS_SUPPORT_IMAGE_STB #if LMS_SUPPORT_IMAGE_STB
#include "stb/RawImage.hpp" #include "stb/RawImage.hpp"
using RawImage = CoverArt::STB::RawImage; using RawImage = Cover::STB::RawImage;
#elif LMS_SUPPORT_IMAGE_GM #elif LMS_SUPPORT_IMAGE_GM
#include "graphicsmagick/RawImage.hpp" #include "graphicsmagick/RawImage.hpp"
using RawImage = CoverArt::GraphicsMagick::RawImage; using RawImage = Cover::GraphicsMagick::RawImage;
#endif #endif
#include "utils/IConfig.hpp" #include "utils/IConfig.hpp"
@@ -77,7 +77,7 @@ namespace
} }
} }
namespace CoverArt { namespace Cover {
static static
bool bool
@@ -86,13 +86,13 @@ isFileSupported(const std::filesystem::path& file, const std::vector<std::filesy
return (std::find(std::cbegin(extensions), std::cend(extensions), file.extension()) != std::cend(extensions)); return (std::find(std::cbegin(extensions), std::cend(extensions), file.extension()) != std::cend(extensions));
} }
std::unique_ptr<IGrabber> std::unique_ptr<ICoverService>
createGrabber(Database::Db& db, const std::filesystem::path& execPath, const std::filesystem::path& defaultCoverPath) createCoverService(Database::Db& db, const std::filesystem::path& execPath, const std::filesystem::path& defaultCoverPath)
{ {
return std::make_unique<Grabber>(db, execPath, defaultCoverPath); return std::make_unique<CoverService>(db, execPath, defaultCoverPath);
} }
Grabber::Grabber(Database::Db& db, CoverService::CoverService(Database::Db& db,
const std::filesystem::path& execPath, const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath) const std::filesystem::path& defaultCoverPath)
: _db {db} : _db {db}
@@ -124,7 +124,7 @@ Grabber::Grabber(Database::Db& db,
} }
std::unique_ptr<IEncodedImage> std::unique_ptr<IEncodedImage>
Grabber::getFromAvMediaFile(const Av::IAudioFile& input, ImageSize width) const CoverService::getFromAvMediaFile(const Av::IAudioFile& input, ImageSize width) const
{ {
std::unique_ptr<IEncodedImage> image; std::unique_ptr<IEncodedImage> image;
@@ -149,7 +149,7 @@ Grabber::getFromAvMediaFile(const Av::IAudioFile& input, ImageSize width) const
} }
std::unique_ptr<IEncodedImage> std::unique_ptr<IEncodedImage>
Grabber::getFromCoverFile(const std::filesystem::path& p, ImageSize width) const CoverService::getFromCoverFile(const std::filesystem::path& p, ImageSize width) const
{ {
std::unique_ptr<IEncodedImage> image; std::unique_ptr<IEncodedImage> image;
@@ -168,7 +168,7 @@ Grabber::getFromCoverFile(const std::filesystem::path& p, ImageSize width) const
} }
std::shared_ptr<IEncodedImage> std::shared_ptr<IEncodedImage>
Grabber::getDefault(ImageSize width) CoverService::getDefault(ImageSize width)
{ {
{ {
std::shared_lock lock {_cacheMutex}; std::shared_lock lock {_cacheMutex};
@@ -192,7 +192,7 @@ Grabber::getDefault(ImageSize width)
} }
std::unique_ptr<IEncodedImage> std::unique_ptr<IEncodedImage>
Grabber::getFromDirectory(const std::filesystem::path& directory, ImageSize width) const CoverService::getFromDirectory(const std::filesystem::path& directory, ImageSize width) const
{ {
const std::multimap<std::string, std::filesystem::path> coverPaths {getCoverPaths(directory)}; const std::multimap<std::string, std::filesystem::path> coverPaths {getCoverPaths(directory)};
@@ -231,7 +231,7 @@ Grabber::getFromDirectory(const std::filesystem::path& directory, ImageSize widt
} }
std::unique_ptr<IEncodedImage> std::unique_ptr<IEncodedImage>
Grabber::getFromSameNamedFile(const std::filesystem::path& filePath, ImageSize width) const CoverService::getFromSameNamedFile(const std::filesystem::path& filePath, ImageSize width) const
{ {
std::unique_ptr<IEncodedImage> res; std::unique_ptr<IEncodedImage> res;
@@ -252,7 +252,7 @@ Grabber::getFromSameNamedFile(const std::filesystem::path& filePath, ImageSize w
} }
bool bool
Grabber::checkCoverFile(const std::filesystem::path& filePath) const CoverService::checkCoverFile(const std::filesystem::path& filePath) const
{ {
std::error_code ec; std::error_code ec;
@@ -275,7 +275,7 @@ Grabber::checkCoverFile(const std::filesystem::path& filePath) const
} }
std::multimap<std::string, std::filesystem::path> std::multimap<std::string, std::filesystem::path>
Grabber::getCoverPaths(const std::filesystem::path& directoryPath) const CoverService::getCoverPaths(const std::filesystem::path& directoryPath) const
{ {
std::multimap<std::string, std::filesystem::path> res; std::multimap<std::string, std::filesystem::path> res;
std::error_code ec; std::error_code ec;
@@ -296,7 +296,7 @@ Grabber::getCoverPaths(const std::filesystem::path& directoryPath) const
} }
std::unique_ptr<IEncodedImage> std::unique_ptr<IEncodedImage>
Grabber::getFromTrack(const std::filesystem::path& p, ImageSize width) const CoverService::getFromTrack(const std::filesystem::path& p, ImageSize width) const
{ {
std::unique_ptr<IEncodedImage> image; std::unique_ptr<IEncodedImage> image;
@@ -313,13 +313,13 @@ Grabber::getFromTrack(const std::filesystem::path& p, ImageSize width) const
} }
std::shared_ptr<IEncodedImage> std::shared_ptr<IEncodedImage>
Grabber::getFromTrack(Database::TrackId trackId, ImageSize width) CoverService::getFromTrack(Database::TrackId trackId, ImageSize width)
{ {
return getFromTrack(_db.getTLSSession(), trackId, width, true /* allow release fallback*/); return getFromTrack(_db.getTLSSession(), trackId, width, true /* allow release fallback*/);
} }
std::shared_ptr<IEncodedImage> std::shared_ptr<IEncodedImage>
Grabber::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width, bool allowReleaseFallback) CoverService::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, ImageSize width, bool allowReleaseFallback)
{ {
using namespace Database; using namespace Database;
@@ -357,7 +357,7 @@ Grabber::getFromTrack(Database::Session& dbSession, Database::TrackId trackId, I
} }
std::shared_ptr<IEncodedImage> std::shared_ptr<IEncodedImage>
Grabber::getFromRelease(Database::ReleaseId releaseId, ImageSize width) CoverService::getFromRelease(Database::ReleaseId releaseId, ImageSize width)
{ {
const CacheEntryDesc cacheEntryDesc {releaseId, width}; const CacheEntryDesc cacheEntryDesc {releaseId, width};
@@ -409,7 +409,7 @@ Grabber::getFromRelease(Database::ReleaseId releaseId, ImageSize width)
} }
void void
Grabber::flushCache() CoverService::flushCache()
{ {
std::unique_lock lock {_cacheMutex}; std::unique_lock lock {_cacheMutex};
@@ -421,7 +421,7 @@ Grabber::flushCache()
} }
void void
Grabber::setJpegQuality(unsigned quality) CoverService::setJpegQuality(unsigned quality)
{ {
_jpegQuality = Utils::clamp<unsigned>(quality, 1, 100); _jpegQuality = Utils::clamp<unsigned>(quality, 1, 100);
@@ -429,7 +429,7 @@ Grabber::setJpegQuality(unsigned quality)
} }
void void
Grabber::saveToCache(const CacheEntryDesc& entryDesc, std::shared_ptr<IEncodedImage> image) CoverService::saveToCache(const CacheEntryDesc& entryDesc, std::shared_ptr<IEncodedImage> image)
{ {
std::unique_lock lock {_cacheMutex}; std::unique_lock lock {_cacheMutex};
@@ -445,7 +445,7 @@ Grabber::saveToCache(const CacheEntryDesc& entryDesc, std::shared_ptr<IEncodedIm
} }
std::shared_ptr<IEncodedImage> std::shared_ptr<IEncodedImage>
Grabber::loadFromCache(const CacheEntryDesc& entryDesc) CoverService::loadFromCache(const CacheEntryDesc& entryDesc)
{ {
std::shared_lock lock {_cacheMutex}; std::shared_lock lock {_cacheMutex};
@@ -460,5 +460,5 @@ Grabber::loadFromCache(const CacheEntryDesc& entryDesc)
return it->second; return it->second;
} }
} // namespace CoverArt } // namespace Cover
@@ -29,7 +29,7 @@
#include <variant> #include <variant>
#include <vector> #include <vector>
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "cover/IEncodedImage.hpp" #include "cover/IEncodedImage.hpp"
#include "database/Types.hpp" #include "database/Types.hpp"
@@ -43,7 +43,7 @@ namespace Av
class IAudioFile; class IAudioFile;
} }
namespace CoverArt namespace Cover
{ {
struct CacheEntryDesc struct CacheEntryDesc
{ {
@@ -57,16 +57,16 @@ namespace CoverArt
} }
}; };
} // ns CoverArt } // ns Cover
namespace std namespace std
{ {
template<> template<>
class hash<CoverArt::CacheEntryDesc> class hash<Cover::CacheEntryDesc>
{ {
public: public:
size_t operator()(const CoverArt::CacheEntryDesc& e) const size_t operator()(const Cover::CacheEntryDesc& e) const
{ {
size_t h {}; size_t h {};
std::visit([&](auto id) std::visit([&](auto id)
@@ -81,19 +81,19 @@ namespace std
} // ns std } // ns std
namespace CoverArt namespace Cover
{ {
class Grabber : public IGrabber class CoverService : public ICoverService
{ {
public: public:
Grabber(Database::Db& db, CoverService(Database::Db& db,
const std::filesystem::path& execPath, const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath); const std::filesystem::path& defaultCoverPath);
Grabber(const Grabber&) = delete; CoverService(const CoverService&) = delete;
Grabber& operator=(const Grabber&) = delete; CoverService& operator=(const CoverService&) = delete;
Grabber(Grabber&&) = delete; CoverService(CoverService&&) = delete;
Grabber& operator=(Grabber&&) = delete; CoverService& operator=(CoverService&&) = delete;
private: private:
std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) override; std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) override;
@@ -133,5 +133,5 @@ namespace CoverArt
unsigned _jpegQuality; unsigned _jpegQuality;
}; };
} // namespace CoverArt } // namespace Cover
+2 -2
View File
@@ -21,7 +21,7 @@
#include "utils/Exception.hpp" #include "utils/Exception.hpp"
namespace CoverArt namespace Cover
{ {
// internal use only // internal use only
class ImageException : public LmsException class ImageException : public LmsException
@@ -30,5 +30,5 @@ namespace CoverArt
using LmsException::LmsException; using LmsException::LmsException;
}; };
} // namespace CoverArt } // namespace Cover
+1 -1
View File
@@ -23,7 +23,7 @@
#include "cover/IEncodedImage.hpp" #include "cover/IEncodedImage.hpp"
namespace CoverArt namespace Cover
{ {
class IRawImage class IRawImage
{ {
+1 -1
View File
@@ -25,7 +25,7 @@
#include "RawImage.hpp" #include "RawImage.hpp"
#include "Exception.hpp" #include "Exception.hpp"
namespace CoverArt::STB namespace Cover::STB
{ {
JPEGImage::JPEGImage(const RawImage& rawImage, unsigned quality) JPEGImage::JPEGImage(const RawImage& rawImage, unsigned quality)
{ {
+1 -1
View File
@@ -23,7 +23,7 @@
#include "cover/IEncodedImage.hpp" #include "cover/IEncodedImage.hpp"
namespace CoverArt::STB namespace Cover::STB
{ {
class RawImage; class RawImage;
class JPEGImage : public IEncodedImage class JPEGImage : public IEncodedImage
+1 -1
View File
@@ -32,7 +32,7 @@
#include "Exception.hpp" #include "Exception.hpp"
namespace CoverArt::STB namespace Cover::STB
{ {
RawImage::RawImage(const std::byte* encodedData, std::size_t encodedDataSize) RawImage::RawImage(const std::byte* encodedData, std::size_t encodedDataSize)
{ {
+1 -1
View File
@@ -29,7 +29,7 @@
#include "cover/IEncodedImage.hpp" #include "cover/IEncodedImage.hpp"
#include "IRawImage.hpp" #include "IRawImage.hpp"
namespace CoverArt::STB namespace Cover::STB
{ {
class RawImage : public IRawImage class RawImage : public IRawImage
{ {
@@ -30,12 +30,12 @@ namespace Database
class Db; class Db;
} }
namespace CoverArt namespace Cover
{ {
class IGrabber class ICoverService
{ {
public: public:
virtual ~IGrabber() = default; virtual ~ICoverService() = default;
virtual std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) = 0; virtual std::shared_ptr<IEncodedImage> getFromTrack(Database::TrackId trackId, ImageSize width) = 0;
virtual std::shared_ptr<IEncodedImage> getFromRelease(Database::ReleaseId releaseId, ImageSize width) = 0; virtual std::shared_ptr<IEncodedImage> getFromRelease(Database::ReleaseId releaseId, ImageSize width) = 0;
@@ -45,9 +45,9 @@ namespace CoverArt
virtual void setJpegQuality(unsigned quality) = 0; // from 1 to 100 virtual void setJpegQuality(unsigned quality) = 0; // from 1 to 100
}; };
std::unique_ptr<IGrabber> createGrabber(Database::Db& db, std::unique_ptr<ICoverService> createCoverService(Database::Db& db,
const std::filesystem::path& execPath, const std::filesystem::path& execPath,
const std::filesystem::path& defaultCoverPath); const std::filesystem::path& defaultCoverPath);
} // namespace CoverArt } // namespace CoverArt
@@ -22,7 +22,7 @@
#include <cstddef> #include <cstddef>
#include <string_view> #include <string_view>
namespace CoverArt namespace Cover
{ {
using ImageSize = std::size_t; using ImageSize = std::size_t;
@@ -36,5 +36,5 @@ namespace CoverArt
virtual std::string_view getMimeType() const = 0; virtual std::string_view getMimeType() const = 0;
}; };
} // namespace CoverArt } // namespace Cover
+4 -4
View File
@@ -28,7 +28,7 @@
#include "auth/IPasswordService.hpp" #include "auth/IPasswordService.hpp"
#include "auth/IEnvService.hpp" #include "auth/IEnvService.hpp"
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "database/Artist.hpp" #include "database/Artist.hpp"
#include "database/Cluster.hpp" #include "database/Cluster.hpp"
#include "database/Db.hpp" #include "database/Db.hpp"
@@ -1802,11 +1802,11 @@ handleGetCoverArt(RequestContext& context, const Wt::Http::Request& /*request*/,
std::size_t size {getParameterAs<std::size_t>(context.parameters, "size").value_or(256)}; std::size_t size {getParameterAs<std::size_t>(context.parameters, "size").value_or(256)};
size = Utils::clamp(size, std::size_t {32}, std::size_t {1024}); size = Utils::clamp(size, std::size_t {32}, std::size_t {1024});
std::shared_ptr<CoverArt::IEncodedImage> cover; std::shared_ptr<Cover::IEncodedImage> cover;
if (trackId) if (trackId)
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(*trackId, size); cover = Service<Cover::ICoverService>::get()->getFromTrack(*trackId, size);
else if (releaseId) else if (releaseId)
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(*releaseId, size); cover = Service<Cover::ICoverService>::get()->getFromRelease(*releaseId, size);
response.out().write(reinterpret_cast<const char*>(cover->getData()), cover->getDataSize()); response.out().write(reinterpret_cast<const char*>(cover->getData()), cover->getDataSize());
response.setMimeType(std::string {cover->getMimeType()}); response.setMimeType(std::string {cover->getMimeType()});
+4 -4
View File
@@ -28,7 +28,7 @@
#include "auth/IAuthTokenService.hpp" #include "auth/IAuthTokenService.hpp"
#include "auth/IPasswordService.hpp" #include "auth/IPasswordService.hpp"
#include "auth/IEnvService.hpp" #include "auth/IEnvService.hpp"
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "database/Db.hpp" #include "database/Db.hpp"
#include "database/Session.hpp" #include "database/Session.hpp"
#include "scanner/IScanner.hpp" #include "scanner/IScanner.hpp"
@@ -224,7 +224,7 @@ int main(int argc, char* argv[])
Wt::WServer server {argv[0]}; Wt::WServer server {argv[0]};
server.setServerConfiguration(wtServerArgs.size(), const_cast<char**>(&wtArgv[0])); server.setServerConfiguration(wtServerArgs.size(), const_cast<char**>(&wtArgv[0]));
IOContextRunner ioContextRunner {ioContext, std::max<unsigned long>(2, std::thread::hardware_concurrency())}; IOContextRunner ioContextRunner {ioContext, getThreadCount()};
// Initializing a connection pool to the database that will be shared along services // Initializing a connection pool to the database that will be shared along services
Database::Db database {config->getPath("working-dir") / "lms.db", getThreadCount()}; Database::Db database {config->getPath("working-dir") / "lms.db", getThreadCount()};
@@ -257,7 +257,7 @@ int main(int argc, char* argv[])
throw LmsException {"Bad value '" + authenticationBackend + "' for 'authentication-backend'"}; throw LmsException {"Bad value '" + authenticationBackend + "' for 'authentication-backend'"};
Service<Http::IClient> httpClient {Http::createClient(ioContext)}; Service<Http::IClient> httpClient {Http::createClient(ioContext)};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(database, argv[0], server.appRoot() + "/images/unknown-cover.jpg")}; Service<Cover::ICoverService> coverService {Cover::createCoverService(database, argv[0], server.appRoot() + "/images/unknown-cover.jpg")};
Service<Recommendation::IEngine> recommendationEngineService {Recommendation::createEngine(database)}; Service<Recommendation::IEngine> recommendationEngineService {Recommendation::createEngine(database)};
Service<Scanner::IScanner> scannerService {Scanner::createScanner(database, *recommendationEngineService)}; Service<Scanner::IScanner> scannerService {Scanner::createScanner(database, *recommendationEngineService)};
@@ -265,7 +265,7 @@ int main(int argc, char* argv[])
{ {
// Flush cover cache even if no changes: // Flush cover cache even if no changes:
// covers may be external files that changed and we don't keep track of them // covers may be external files that changed and we don't keep track of them
coverArtService->flushCache(); coverService->flushCache();
}); });
Service<Scrobbling::IScrobbling> scrobblingService {Scrobbling::createScrobbling(ioContext, database)}; Service<Scrobbling::IScrobbling> scrobblingService {Scrobbling::createScrobbling(ioContext, database)};
+1 -1
View File
@@ -30,7 +30,7 @@
#include "auth/IEnvService.hpp" #include "auth/IEnvService.hpp"
#include "auth/IPasswordService.hpp" #include "auth/IPasswordService.hpp"
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "database/Artist.hpp" #include "database/Artist.hpp"
#include "database/Cluster.hpp" #include "database/Cluster.hpp"
#include "database/Db.hpp" #include "database/Db.hpp"
+4 -4
View File
@@ -22,7 +22,7 @@
#include <Wt/WApplication.h> #include <Wt/WApplication.h>
#include <Wt/Http/Response.h> #include <Wt/Http/Response.h>
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "database/Track.hpp" #include "database/Track.hpp"
#include "utils/Exception.hpp" #include "utils/Exception.hpp"
#include "utils/Logger.hpp" #include "utils/Logger.hpp"
@@ -83,7 +83,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
return; return;
} }
std::shared_ptr<CoverArt::IEncodedImage> cover; std::shared_ptr<Cover::IEncodedImage> cover;
if (trackIdStr) if (trackIdStr)
{ {
@@ -96,7 +96,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
return; return;
} }
cover = Service<CoverArt::IGrabber>::get()->getFromTrack(*trackId, *size); cover = Service<Cover::ICoverService>::get()->getFromTrack(*trackId, *size);
} }
else if (releaseIdStr) else if (releaseIdStr)
{ {
@@ -106,7 +106,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
if (!releaseId) if (!releaseId)
return; return;
cover = Service<CoverArt::IGrabber>::get()->getFromRelease(*releaseId, *size); cover = Service<Cover::ICoverService>::get()->getFromRelease(*releaseId, *size);
} }
else else
{ {
+4 -4
View File
@@ -24,7 +24,7 @@
#include <boost/program_options.hpp> #include <boost/program_options.hpp>
#include "cover/ICoverArtGrabber.hpp" #include "cover/ICoverService.hpp"
#include "database/Db.hpp" #include "database/Db.hpp"
#include "database/Release.hpp" #include "database/Release.hpp"
#include "database/Session.hpp" #include "database/Session.hpp"
@@ -36,7 +36,7 @@
static static
void void
dumpTrackCovers(Database::Session& session, CoverArt::ImageSize width) dumpTrackCovers(Database::Session& session, Cover::ImageSize width)
{ {
std::vector<Database::TrackId> trackIds; std::vector<Database::TrackId> trackIds;
{ {
@@ -47,7 +47,7 @@ dumpTrackCovers(Database::Session& session, CoverArt::ImageSize width)
for (const Database::TrackId trackId : trackIds) for (const Database::TrackId trackId : trackIds)
{ {
std::cout << "Getting cover for track id " << trackId.toString() << std::endl; std::cout << "Getting cover for track id " << trackId.toString() << std::endl;
Service<CoverArt::IGrabber>::get()->getFromTrack(trackId, width); Service<Cover::ICoverService>::get()->getFromTrack(trackId, width);
} }
} }
@@ -83,7 +83,7 @@ int main(int argc, char *argv[])
Service<IConfig> config {createConfig(vm["conf"].as<std::string>())}; Service<IConfig> config {createConfig(vm["conf"].as<std::string>())};
Database::Db db {config->getPath("working-dir") / "lms.db"}; Database::Db db {config->getPath("working-dir") / "lms.db"};
Service<CoverArt::IGrabber> coverArtService {CoverArt::createGrabber(db, argv[0], vm["default-cover"].as<std::string>())}; Service<Cover::ICoverService> coverArtService {Cover::createCoverService(db, argv[0], vm["default-cover"].as<std::string>())};
coverArtService->setJpegQuality(config->getULong("cover-jpeg-quality", vm["quality"].as<unsigned>())); coverArtService->setJpegQuality(config->getULong("cover-jpeg-quality", vm["quality"].as<unsigned>()));