diff --git a/src/libs/database/impl/Migration.cpp b/src/libs/database/impl/Migration.cpp index 59d20694..9eb6ec31 100644 --- a/src/libs/database/impl/Migration.cpp +++ b/src/libs/database/impl/Migration.cpp @@ -292,6 +292,13 @@ CREATE TABLE IF NOT EXISTS "track_backup" ( session.getDboSession().execute("UPDATE scan_settings SET scan_version = scan_version + 1"); } + void migrateFromV48(Session& session) + { + // Regression for the extra tags not being parsed + // Just increment the scan version of the settings to make the next scheduled scan rescan everything + session.getDboSession().execute("UPDATE scan_settings SET scan_version = scan_version + 1"); + } + void doDbMigration(Session& session) { static const std::string outdatedMsg{ "Outdated database, please rebuild it (delete the .db file and restart)" }; @@ -318,6 +325,7 @@ CREATE TABLE IF NOT EXISTS "track_backup" ( {45, migrateFromV45}, {46, migrateFromV46}, {47, migrateFromV47}, + {48, migrateFromV48}, }; { diff --git a/src/libs/database/impl/Migration.hpp b/src/libs/database/impl/Migration.hpp index 5717b96d..7156de9d 100644 --- a/src/libs/database/impl/Migration.hpp +++ b/src/libs/database/impl/Migration.hpp @@ -26,7 +26,7 @@ namespace Database class Session; using Version = std::size_t; - static constexpr Version LMS_DATABASE_VERSION{ 48 }; + static constexpr Version LMS_DATABASE_VERSION{ 49 }; class VersionInfo { public: diff --git a/src/libs/image/impl/stb/RawImage.cpp b/src/libs/image/impl/stb/RawImage.cpp index ba7a80b9..1f8a5e68 100644 --- a/src/libs/image/impl/stb/RawImage.cpp +++ b/src/libs/image/impl/stb/RawImage.cpp @@ -25,6 +25,8 @@ #define STBIR_DEFAULT_FILTER_DOWNSAMPLE STBIR_FILTER_MITCHELL #define STBIR_DEFAULT_FILTER_UPSAMPLE STBIR_FILTER_CATMULLROM +#define STBI_FAILURE_USERMSG + #include #include @@ -34,99 +36,92 @@ namespace Image { - std::unique_ptr decodeImage(const std::byte* encodedData, std::size_t encodedDataSize) - { - return std::make_unique(encodedData, encodedDataSize); - } + std::unique_ptr decodeImage(const std::byte* encodedData, std::size_t encodedDataSize) + { + return std::make_unique(encodedData, encodedDataSize); + } - std::unique_ptr decodeImage(const std::filesystem::path& path) - { - return std::make_unique(path); - } + std::unique_ptr decodeImage(const std::filesystem::path& path) + { + return std::make_unique(path); + } - void - init(const std::filesystem::path&) - { - } + void init(const std::filesystem::path&) + { + } } namespace Image::STB { - RawImage::RawImage(const std::byte* encodedData, std::size_t encodedDataSize) - { - int n; - _data = UniquePtrFree {stbi_load_from_memory(reinterpret_cast(encodedData), encodedDataSize, &_width, &_height, &n, 3), std::free}; - if (!_data) - throw ImageException {"Cannot load image from memory"}; - } + RawImage::RawImage(const std::byte* encodedData, std::size_t encodedDataSize) + { + int n; + _data = UniquePtrFree{ ::stbi_load_from_memory(reinterpret_cast(encodedData), encodedDataSize, &_width, &_height, &n, 3), std::free }; + if (!_data) + throw ImageException{ "Cannot load image from memory: " + std::string{ ::stbi_failure_reason() } }; + } - RawImage::RawImage(const std::filesystem::path& p) - { - int n; - _data = UniquePtrFree {stbi_load(p.string().c_str(), &_width, &_height, &n, 3), std::free}; - if (!_data) - throw ImageException {"Cannot load image from memory"}; - } + RawImage::RawImage(const std::filesystem::path& p) + { + int n; + _data = UniquePtrFree{ stbi_load(p.string().c_str(), &_width, &_height, &n, 3), std::free }; + if (!_data) + throw ImageException{ "Cannot load image from file: " + std::string{ ::stbi_failure_reason() } }; + } - void - RawImage::resize(ImageSize width) - { - size_t height; - if (_width == _height) - { - height = width; - } - else if (_width > _height) - { - height = (size_t)((float)width/_width*_height); - } - else - { - height = width; - width = (size_t)((float)height/_height*_width); - } + void RawImage::resize(ImageSize width) + { + size_t height; + if (_width == _height) + { + height = width; + } + else if (_width > _height) + { + height = (size_t)((float)width / _width * _height); + } + else + { + height = width; + width = (size_t)((float)height / _height * _width); + } - UniquePtrFree resizedData {reinterpret_cast(malloc(width*height*3)), std::free}; - if (!resizedData) - throw ImageException {"Cannot allocate memory for resized image!"}; + UniquePtrFree resizedData{ reinterpret_cast(malloc(width * height * 3)), std::free }; + if (!resizedData) + throw ImageException{ "Cannot allocate memory for resized image!" }; - if (stbir_resize_uint8_srgb(reinterpret_cast(_data.get()), _width, _height, 0, - reinterpret_cast(resizedData.get()), width, height, 0, - 3, STBIR_ALPHA_CHANNEL_NONE, 0) == 0) - { - throw ImageException {"Failed to resize image!"}; - } + if (::stbir_resize_uint8_srgb(reinterpret_cast(_data.get()), _width, _height, 0, + reinterpret_cast(resizedData.get()), width, height, 0, + 3, STBIR_ALPHA_CHANNEL_NONE, 0) == 0) + { + throw ImageException{ "Failed to resize image:" + std::string{ ::stbi_failure_reason() } }; + } - _data = std::move(resizedData); - _height = height; - _width = width; - } + _data = std::move(resizedData); + _height = height; + _width = width; + } - std::unique_ptr - RawImage::encodeToJPEG(unsigned quality) const - { - return std::make_unique(*this, quality); - } + std::unique_ptr RawImage::encodeToJPEG(unsigned quality) const + { + return std::make_unique(*this, quality); + } - ImageSize - RawImage::getWidth() const - { - return _width; - } + ImageSize RawImage::getWidth() const + { + return _width; + } - ImageSize - RawImage::getHeight() const - { - return _height; - } + ImageSize RawImage::getHeight() const + { + return _height; + } - const std::byte* - RawImage::getData() const - { - if (!_data) - return nullptr; - - return reinterpret_cast(_data.get()); - } -} + const std::byte* RawImage::getData() const + { + if (!_data) + return nullptr; + return reinterpret_cast(_data.get()); + } +} \ No newline at end of file diff --git a/src/libs/image/impl/stb/RawImage.hpp b/src/libs/image/impl/stb/RawImage.hpp index c7d7921a..60452529 100644 --- a/src/libs/image/impl/stb/RawImage.hpp +++ b/src/libs/image/impl/stb/RawImage.hpp @@ -31,24 +31,24 @@ namespace Image::STB { - class RawImage : public IRawImage - { - public: - RawImage(const std::byte* encodedData, std::size_t encodedDataSize); - RawImage(const std::filesystem::path& path); + class RawImage : public IRawImage + { + public: + RawImage(const std::byte* encodedData, std::size_t encodedDataSize); + RawImage(const std::filesystem::path& path); - void resize(ImageSize width) override; - std::unique_ptr encodeToJPEG(unsigned quality) const override; + void resize(ImageSize width) override; + std::unique_ptr encodeToJPEG(unsigned quality) const override; - ImageSize getWidth() const; - ImageSize getHeight() const; - const std::byte* getData() const; + ImageSize getWidth() const; + ImageSize getHeight() const; + const std::byte* getData() const; - private: - int _width; - int _height; - using UniquePtrFree = std::unique_ptr; - UniquePtrFree _data {nullptr, std::free}; - }; + private: + int _width; + int _height; + using UniquePtrFree = std::unique_ptr; + UniquePtrFree _data{ nullptr, std::free }; + }; } diff --git a/src/libs/services/cover/impl/CoverService.cpp b/src/libs/services/cover/impl/CoverService.cpp index b2202249..516267ca 100644 --- a/src/libs/services/cover/impl/CoverService.cpp +++ b/src/libs/services/cover/impl/CoverService.cpp @@ -429,16 +429,22 @@ namespace Cover std::set parentPaths; { Session& session{ _db.getTLSSession() }; + + Track::FindParameters params; + params.setArtist(artistId, { TrackArtistLinkType::ReleaseArtist }); + auto transaction{ session.createReadTransaction() }; - Track::find(session, Track::FindParameters{}.setArtist(artistId), [&](const Track::pointer& track) + Track::find(session, params, [&](const Track::pointer& track) { parentPaths.insert(track->getPath().parent_path()); }); } if (parentPaths.size() == 1) + { artistImage = getFromDirectory(parentPaths.begin()->parent_path(), width, _artistFileNames, false); + } else if (parentPaths.size() > 1) { const std::filesystem::path longestCommonPath{ PathUtils::getLongestCommonPath(std::cbegin(parentPaths), std::cend(parentPaths)) }; diff --git a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp index 06edef62..ab638865 100644 --- a/src/libs/services/scanner/impl/ScanStepScanFiles.cpp +++ b/src/libs/services/scanner/impl/ScanStepScanFiles.cpp @@ -224,7 +224,11 @@ namespace Scanner void ScanStepScanFiles::process(ScanContext& context) { - _metadataParser->setUserExtraTags(_extraTagsToParse); + { + std::vector tagsToParse{ _extraTagsToParse }; + tagsToParse.insert(std::end(tagsToParse), std::cbegin(_settings.extraTags), std::cend(_settings.extraTags)); + _metadataParser->setUserExtraTags(tagsToParse); + } context.currentStepStats.totalElems = context.stats.filesScanned; diff --git a/src/libs/utils/test/Path.cpp b/src/libs/utils/test/Path.cpp index f36ffa4b..10662fe4 100644 --- a/src/libs/utils/test/Path.cpp +++ b/src/libs/utils/test/Path.cpp @@ -66,6 +66,7 @@ TEST(Path, getLongestCommonPathIterator) {{"/foo", "/bar"}, "/"}, {{"/foo/bar/file1.txt", "/foo/bar/file2.txt"}, "/foo/bar"}, {{"/foo", "/foo/"}, "/foo"}, + {{"/foo", "/foo"}, "/foo"}, {{"/foo/", "/foo/"}, "/foo/"}, {{"/foo/", "/foo/", "/bar"}, "/"}, {{"/foo/", "/foo/", "/foo/bar"}, "/foo"},