From 345e8228aba96d47b62f8ebea15e44e696bac8ab Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 21 Jul 2025 23:55:53 +0200 Subject: [PATCH 1/3] Fixed freebsd build + added some ci basic checks, fixes #717 --- .github/workflows/build-freebsd-basic.yml | 20 +++++++++++++++++++ .../scanner/impl/steps/ScanStepScanFiles.cpp | 6 ++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build-freebsd-basic.yml diff --git a/.github/workflows/build-freebsd-basic.yml b/.github/workflows/build-freebsd-basic.yml new file mode 100644 index 00000000..9e20df03 --- /dev/null +++ b/.github/workflows/build-freebsd-basic.yml @@ -0,0 +1,20 @@ +name: Basic Build (FreeBSD) +on: [pull_request] +jobs: + Build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Build + uses: vmactions/freebsd-vm@v1.2.1 + with: + usesh: true + prepare: | + pkg install -y cmake pkgconf boost-libs ffmpeg stb libconfig taglib libarchive xxhash wt googletest + + run: | + mkdir build + cd build + cmake .. -DCMAKE_UNITY_BUILD=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DBUILD_BENCHMARKS=OFF + make -j$(nproc) + make test diff --git a/src/libs/services/scanner/impl/steps/ScanStepScanFiles.cpp b/src/libs/services/scanner/impl/steps/ScanStepScanFiles.cpp index 85af7f8c..3953a318 100644 --- a/src/libs/services/scanner/impl/steps/ScanStepScanFiles.cpp +++ b/src/libs/services/scanner/impl/steps/ScanStepScanFiles.cpp @@ -127,10 +127,12 @@ namespace lms::scanner continue; FileToScan fileToScan; - fileToScan.filePath = file.path(); fileToScan.mediaLibrary = _mediaLibrary; - fileToScan.lastWriteTime.setTime_t(Wt::WDateTime{ std::chrono::file_clock::to_sys(file.last_write_time()) }.toTime_t()); // sec resolution, as stored in the database + { + const std::chrono::system_clock::time_point lastWriteTime{ std::chrono::time_point_cast(std::chrono::file_clock::to_sys(file.last_write_time())) }; + fileToScan.lastWriteTime.setTime_t(std::chrono::system_clock::to_time_t(lastWriteTime)); // sec resolution, as stored in the database + } fileToScan.fileSize = file.file_size(); if (_fullScan || scanner->needsScan(fileToScan)) From 7592f04972e1b0918fae02a72c76b73f5a42425a Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 22 Jul 2025 13:48:40 +0200 Subject: [PATCH 2/3] Fixed m4a covers not detected, consider the first embedded one is the front cover, fixes #718 --- src/libs/metadata/impl/taglib/TagLibImageReader.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libs/metadata/impl/taglib/TagLibImageReader.cpp b/src/libs/metadata/impl/taglib/TagLibImageReader.cpp index a5d7f940..927da6c4 100644 --- a/src/libs/metadata/impl/taglib/TagLibImageReader.cpp +++ b/src/libs/metadata/impl/taglib/TagLibImageReader.cpp @@ -46,7 +46,7 @@ namespace lms::metadata::taglib { namespace { - Image::Type imageTypeFromfromIDv2(TagLib::ID3v2::AttachedPictureFrame::Type type) + Image::Type imageTypeFromfromID3v2(TagLib::ID3v2::AttachedPictureFrame::Type type) { switch (type) { @@ -244,7 +244,7 @@ namespace lms::metadata::taglib std::span pictureData{ reinterpret_cast(picture.data()), picture.size() }; Image image; - image.type = imageTypeFromfromIDv2(attachedPictureFrame->type()); + image.type = imageTypeFromfromID3v2(attachedPictureFrame->type()); image.description = attachedPictureFrame->description().to8Bit(true); image.mimeType = attachedPictureFrame->mimeType().to8Bit(true); image.data = pictureData; @@ -284,6 +284,8 @@ namespace lms::metadata::taglib return; #endif TagLib::MP4::CoverArtList coverArtList{ coverItem.toCoverArtList() }; + + bool firstCover{ true }; for (TagLib::MP4::CoverArt& coverArt : coverArtList) { TagLib::ByteVector picture{ coverArt.data() }; @@ -293,6 +295,10 @@ namespace lms::metadata::taglib image.mimeType = mp4ImageFormatToMimeType(coverArt.format()); image.data = pictureData; + // By convention, consider the first cover art as the front cover + image.type = firstCover ? Image::Type::FrontCover : Image::Type::Unknown; + firstCover = false; + visitor(image); } } From 3c3e551676db7522a04fc6076b964e3c89785666 Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 22 Jul 2025 21:11:38 +0200 Subject: [PATCH 3/3] Subsonic API: perfer original date for year also for songs --- src/libs/subsonic/impl/responses/Song.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libs/subsonic/impl/responses/Song.cpp b/src/libs/subsonic/impl/responses/Song.cpp index 5462bb9c..40fe482c 100644 --- a/src/libs/subsonic/impl/responses/Song.cpp +++ b/src/libs/subsonic/impl/responses/Song.cpp @@ -93,8 +93,10 @@ namespace lms::api::subsonic trackResponse.setAttribute("track", *track->getTrackNumber()); if (track->getDiscNumber()) trackResponse.setAttribute("discNumber", *track->getDiscNumber()); - if (track->getYear()) - trackResponse.setAttribute("year", *track->getYear()); + if (const auto originalYear{ track->getOriginalYear() }) + trackResponse.setAttribute("year", *originalYear); + else if (const auto year{ track->getYear() }) + trackResponse.setAttribute("year", *year); trackResponse.setAttribute("playCount", core::Service::get()->getCount(context.user->getId(), track->getId())); // maybe not available if user just removed the library without rescanning