Merge branch 'develop' for release v3.68.1
This commit is contained in:
@@ -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
|
||||||
@@ -46,7 +46,7 @@ namespace lms::metadata::taglib
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
Image::Type imageTypeFromfromIDv2(TagLib::ID3v2::AttachedPictureFrame::Type type)
|
Image::Type imageTypeFromfromID3v2(TagLib::ID3v2::AttachedPictureFrame::Type type)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@@ -244,7 +244,7 @@ namespace lms::metadata::taglib
|
|||||||
std::span<const std::byte> pictureData{ reinterpret_cast<const std::byte*>(picture.data()), picture.size() };
|
std::span<const std::byte> pictureData{ reinterpret_cast<const std::byte*>(picture.data()), picture.size() };
|
||||||
|
|
||||||
Image image;
|
Image image;
|
||||||
image.type = imageTypeFromfromIDv2(attachedPictureFrame->type());
|
image.type = imageTypeFromfromID3v2(attachedPictureFrame->type());
|
||||||
image.description = attachedPictureFrame->description().to8Bit(true);
|
image.description = attachedPictureFrame->description().to8Bit(true);
|
||||||
image.mimeType = attachedPictureFrame->mimeType().to8Bit(true);
|
image.mimeType = attachedPictureFrame->mimeType().to8Bit(true);
|
||||||
image.data = pictureData;
|
image.data = pictureData;
|
||||||
@@ -284,6 +284,8 @@ namespace lms::metadata::taglib
|
|||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
TagLib::MP4::CoverArtList coverArtList{ coverItem.toCoverArtList() };
|
TagLib::MP4::CoverArtList coverArtList{ coverItem.toCoverArtList() };
|
||||||
|
|
||||||
|
bool firstCover{ true };
|
||||||
for (TagLib::MP4::CoverArt& coverArt : coverArtList)
|
for (TagLib::MP4::CoverArt& coverArt : coverArtList)
|
||||||
{
|
{
|
||||||
TagLib::ByteVector picture{ coverArt.data() };
|
TagLib::ByteVector picture{ coverArt.data() };
|
||||||
@@ -293,6 +295,10 @@ namespace lms::metadata::taglib
|
|||||||
image.mimeType = mp4ImageFormatToMimeType(coverArt.format());
|
image.mimeType = mp4ImageFormatToMimeType(coverArt.format());
|
||||||
image.data = pictureData;
|
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);
|
visitor(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,10 +127,12 @@ namespace lms::scanner
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
FileToScan fileToScan;
|
FileToScan fileToScan;
|
||||||
|
|
||||||
fileToScan.filePath = file.path();
|
fileToScan.filePath = file.path();
|
||||||
fileToScan.mediaLibrary = _mediaLibrary;
|
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::system_clock::duration>(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();
|
fileToScan.fileSize = file.file_size();
|
||||||
|
|
||||||
if (_fullScan || scanner->needsScan(fileToScan))
|
if (_fullScan || scanner->needsScan(fileToScan))
|
||||||
|
|||||||
@@ -93,8 +93,10 @@ namespace lms::api::subsonic
|
|||||||
trackResponse.setAttribute("track", *track->getTrackNumber());
|
trackResponse.setAttribute("track", *track->getTrackNumber());
|
||||||
if (track->getDiscNumber())
|
if (track->getDiscNumber())
|
||||||
trackResponse.setAttribute("discNumber", *track->getDiscNumber());
|
trackResponse.setAttribute("discNumber", *track->getDiscNumber());
|
||||||
if (track->getYear())
|
if (const auto originalYear{ track->getOriginalYear() })
|
||||||
trackResponse.setAttribute("year", *track->getYear());
|
trackResponse.setAttribute("year", *originalYear);
|
||||||
|
else if (const auto year{ track->getYear() })
|
||||||
|
trackResponse.setAttribute("year", *year);
|
||||||
trackResponse.setAttribute("playCount", core::Service<scrobbling::IScrobblingService>::get()->getCount(context.user->getId(), track->getId()));
|
trackResponse.setAttribute("playCount", core::Service<scrobbling::IScrobblingService>::get()->getCount(context.user->getId(), track->getId()));
|
||||||
|
|
||||||
// maybe not available if user just removed the library without rescanning
|
// maybe not available if user just removed the library without rescanning
|
||||||
|
|||||||
Reference in New Issue
Block a user