Made compilation work with unity builds
This commit is contained in:
@@ -26,11 +26,17 @@ if (${LMS_IMAGE_BACKEND} STREQUAL "stb")
|
||||
|
||||
target_sources(lmsimage PRIVATE
|
||||
impl/stb/Image.cpp
|
||||
impl/stb/Exception.cpp
|
||||
impl/stb/RawImage.cpp
|
||||
impl/stb/StbImage.cpp
|
||||
impl/stb/StbImageResize.cpp
|
||||
impl/stb/StbImageWrite.cpp
|
||||
)
|
||||
|
||||
set_property(SOURCE impl/stb/StbImage.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON)
|
||||
set_property(SOURCE impl/stb/StbImageResize.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON)
|
||||
set_property(SOURCE impl/stb/StbImageWrite.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON)
|
||||
|
||||
target_compile_options(lmsimage PRIVATE "-DSTB_IMAGE_RESIZE_VERSION=${STB_IMAGE_RESIZE_VERSION}")
|
||||
target_include_directories(lmsimage PRIVATE ${STB_IMAGE_INCLUDE_DIR})
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Exception.hpp"
|
||||
|
||||
#include "StbImage.hpp"
|
||||
|
||||
namespace lms::image
|
||||
{
|
||||
StbiException::StbiException(std::string_view desc)
|
||||
: Exception{ std::string{ desc } + ": " + getLastFailureReason() }
|
||||
{
|
||||
}
|
||||
|
||||
std::string StbiException::getLastFailureReason()
|
||||
{
|
||||
const char* failureReason{ ::stbi_failure_reason() };
|
||||
return failureReason ? failureReason : "unknown reason";
|
||||
}
|
||||
} // namespace lms::image
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Emeric Poupon
|
||||
*
|
||||
* This file is part of LMS.
|
||||
*
|
||||
* LMS is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LMS is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string_view>
|
||||
|
||||
#include "image/Exception.hpp"
|
||||
|
||||
namespace lms::image
|
||||
{
|
||||
class StbiException : public Exception
|
||||
{
|
||||
public:
|
||||
StbiException(std::string_view desc);
|
||||
|
||||
private:
|
||||
static std::string getLastFailureReason();
|
||||
};
|
||||
} // namespace lms::image
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "Exception.hpp"
|
||||
#include "StbImage.hpp"
|
||||
#include "StbImageWrite.hpp"
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "RawImage.hpp"
|
||||
|
||||
#include "Exception.hpp"
|
||||
#include "StbImage.hpp"
|
||||
#include "StbImageResize.hpp"
|
||||
|
||||
|
||||
@@ -19,17 +19,3 @@
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "StbImage.hpp"
|
||||
|
||||
namespace lms::image
|
||||
{
|
||||
StbiException::StbiException(std::string_view desc)
|
||||
: Exception{ std::string{ desc } + ": " + getLastFailureReason() }
|
||||
{
|
||||
}
|
||||
|
||||
std::string StbiException::getLastFailureReason()
|
||||
{
|
||||
const char* failureReason{ ::stbi_failure_reason() };
|
||||
return failureReason ? failureReason : "unknown reason";
|
||||
}
|
||||
} // namespace lms::image
|
||||
@@ -16,6 +16,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define STBI_ONLY_JPEG
|
||||
@@ -24,19 +25,3 @@
|
||||
#define STBI_FAILURE_USERMSG
|
||||
|
||||
#include <stb_image.h>
|
||||
|
||||
#include <string_view>
|
||||
|
||||
#include "image/Exception.hpp"
|
||||
|
||||
namespace lms::image
|
||||
{
|
||||
class StbiException : public Exception
|
||||
{
|
||||
public:
|
||||
StbiException(std::string_view desc);
|
||||
|
||||
private:
|
||||
static std::string getLastFailureReason();
|
||||
};
|
||||
} // namespace lms::image
|
||||
@@ -30,7 +30,7 @@ namespace lms::metadata
|
||||
namespace
|
||||
{
|
||||
// Mapping to internal avformat names and/or common alternative custom names
|
||||
static const std::unordered_map<TagType, std::vector<std::string>> tagMapping{
|
||||
static const std::unordered_map<TagType, std::vector<std::string>> avFormatTagMapping{
|
||||
{ TagType::AcoustID, { "ACOUSTID_ID", "ACOUSTID ID" } },
|
||||
{ TagType::Advisory, { "ITUNESADVISORY" } },
|
||||
{ TagType::Album, { "ALBUM", "TALB", "WM/ALBUMTITLE" } },
|
||||
@@ -171,8 +171,8 @@ namespace lms::metadata
|
||||
|
||||
void AvFormatTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const
|
||||
{
|
||||
auto itTagNames{ tagMapping.find(tag) };
|
||||
if (itTagNames == std::cend(tagMapping))
|
||||
auto itTagNames{ avFormatTagMapping.find(tag) };
|
||||
if (itTagNames == std::cend(avFormatTagMapping))
|
||||
return;
|
||||
|
||||
for (const std::string& tagName : itTagNames->second)
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace lms::metadata
|
||||
{
|
||||
namespace
|
||||
{
|
||||
class ParsingFailedException : public Exception
|
||||
class ImageParsingFailedException : public Exception
|
||||
{
|
||||
};
|
||||
|
||||
@@ -362,7 +362,7 @@ namespace lms::metadata
|
||||
if (_file.isNull())
|
||||
{
|
||||
LMS_LOG(METADATA, ERROR, "File " << p << ": parsing failed");
|
||||
throw ParsingFailedException{};
|
||||
throw ImageParsingFailedException{};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,12 +55,12 @@ namespace lms::metadata
|
||||
{
|
||||
namespace
|
||||
{
|
||||
class ParsingFailedException : public Exception
|
||||
class TagParsingFailedException : public Exception
|
||||
{
|
||||
};
|
||||
|
||||
// Mapping to internal taglib names and/or common alternative custom names
|
||||
const std::unordered_map<TagType, std::vector<std::string>> tagMapping{
|
||||
const std::unordered_map<TagType, std::vector<std::string>> tagLibTagMapping{
|
||||
{ TagType::AcoustID, { "ACOUSTID_ID", "ACOUSTID ID" } },
|
||||
{ TagType::Advisory, { "ITUNESADVISORY" } },
|
||||
{ TagType::Album, { "ALBUM" } },
|
||||
@@ -228,13 +228,13 @@ namespace lms::metadata
|
||||
if (_file.isNull())
|
||||
{
|
||||
LMS_LOG(METADATA, ERROR, "File " << p << ": parsing failed");
|
||||
throw ParsingFailedException{};
|
||||
throw TagParsingFailedException{};
|
||||
}
|
||||
|
||||
if (!_file.audioProperties())
|
||||
{
|
||||
LMS_LOG(METADATA, ERROR, "File " << p << ": no audio properties");
|
||||
throw ParsingFailedException{};
|
||||
throw TagParsingFailedException{};
|
||||
}
|
||||
|
||||
computeAudioProperties();
|
||||
@@ -465,8 +465,8 @@ namespace lms::metadata
|
||||
|
||||
void TagLibTagReader::visitTagValues(TagType tag, TagValueVisitor visitor) const
|
||||
{
|
||||
auto itTagNames{ tagMapping.find(tag) };
|
||||
if (itTagNames == std::cend(tagMapping))
|
||||
auto itTagNames{ tagLibTagMapping.find(tag) };
|
||||
if (itTagNames == std::cend(tagLibTagMapping))
|
||||
return;
|
||||
|
||||
for (const std::string& tagName : itTagNames->second)
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace lms::scanner
|
||||
};
|
||||
using ArtistImageAssociationContainer = std::deque<ArtistImageAssociation>;
|
||||
|
||||
struct SearchImageContext
|
||||
struct SearchArtistImageContext
|
||||
{
|
||||
db::Session& session;
|
||||
db::ArtistId lastRetrievedArtistId;
|
||||
@@ -59,7 +59,7 @@ namespace lms::scanner
|
||||
std::span<const std::string> artistFileNames;
|
||||
};
|
||||
|
||||
db::Image::pointer findImageInDirectory(SearchImageContext& searchContext, const std::filesystem::path& directoryPath, std::span<const std::string> fileStemsToSearch)
|
||||
db::Image::pointer findImageInDirectory(SearchArtistImageContext& searchContext, const std::filesystem::path& directoryPath, std::span<const std::string> fileStemsToSearch)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -85,7 +85,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
db::Image::pointer getImageFromMbid(SearchImageContext& searchContext, const core::UUID& mbid)
|
||||
db::Image::pointer getImageFromMbid(SearchArtistImageContext& searchContext, const core::UUID& mbid)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -98,7 +98,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
db::Image::pointer searchImageInArtistInfoDirectory(SearchImageContext& searchContext, db::ArtistId artistId)
|
||||
db::Image::pointer searchImageInArtistInfoDirectory(SearchArtistImageContext& searchContext, db::ArtistId artistId)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
db::Image::pointer searchImageInDirectories(SearchImageContext& searchContext, db::ArtistId artistId)
|
||||
db::Image::pointer searchImageInDirectories(SearchArtistImageContext& searchContext, db::ArtistId artistId)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -169,7 +169,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
db::Image::pointer computeBestArtistImage(SearchImageContext& searchContext, const db::Artist::pointer& artist)
|
||||
db::Image::pointer computeBestArtistImage(SearchArtistImageContext& searchContext, const db::Artist::pointer& artist)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -185,7 +185,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
bool fetchNextArtistImagesToUpdate(SearchImageContext& searchContext, ArtistImageAssociationContainer& artistImageAssociations)
|
||||
bool fetchNextArtistImagesToUpdate(SearchArtistImageContext& searchContext, ArtistImageAssociationContainer& artistImageAssociations)
|
||||
{
|
||||
const db::ArtistId artistId{ searchContext.lastRetrievedArtistId };
|
||||
|
||||
@@ -271,7 +271,7 @@ namespace lms::scanner
|
||||
context.currentStepStats.totalElems = db::Artist::getCount(session);
|
||||
}
|
||||
|
||||
SearchImageContext searchContext{
|
||||
SearchArtistImageContext searchContext{
|
||||
.session = session,
|
||||
.lastRetrievedArtistId = {},
|
||||
.artistFileNames = _artistFileNames,
|
||||
|
||||
@@ -32,9 +32,6 @@ namespace lms::scanner
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 100 };
|
||||
constexpr std::size_t writeBatchSize{ 20 };
|
||||
|
||||
struct TrackLyricsAssociation
|
||||
{
|
||||
db::TrackLyricsId trackLyricsId;
|
||||
@@ -83,6 +80,8 @@ namespace lms::scanner
|
||||
|
||||
bool fetchNextTrackLyricsToUpdate(SearchTrackLyricsContext& searchContext, TrackLyricsAssociationContainer& trackLyricsAssociations)
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 100 };
|
||||
|
||||
const db::TrackLyricsId trackLyricsId{ searchContext.lastRetrievedTrackLyricsId };
|
||||
|
||||
{
|
||||
@@ -125,6 +124,8 @@ namespace lms::scanner
|
||||
|
||||
void updateTrackLyrics(db::Session& session, TrackLyricsAssociationContainer& lyricsAssociations)
|
||||
{
|
||||
constexpr std::size_t writeBatchSize{ 20 };
|
||||
|
||||
while (!lyricsAssociations.empty())
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
|
||||
@@ -37,9 +37,6 @@ namespace lms::scanner
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 20 };
|
||||
constexpr std::size_t writeBatchSize{ 5 };
|
||||
|
||||
struct TrackInfo
|
||||
{
|
||||
db::TrackId trackId;
|
||||
@@ -118,6 +115,8 @@ namespace lms::scanner
|
||||
const db::PlayListFileId playListFileIdId{ searchContext.lastRetrievedPlayListFileId };
|
||||
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 20 };
|
||||
|
||||
auto transaction{ searchContext.session.createReadTransaction() };
|
||||
|
||||
db::PlayListFile::find(searchContext.session, searchContext.lastRetrievedPlayListFileId, readBatchSize, [&](const db::PlayListFile::pointer& playListFile) {
|
||||
@@ -199,6 +198,8 @@ namespace lms::scanner
|
||||
|
||||
void updatePlayListFiles(db::Session& session, PlayListFileAssociationContainer& playListFileAssociations)
|
||||
{
|
||||
constexpr std::size_t writeBatchSize{ 5 };
|
||||
|
||||
while (!playListFileAssociations.empty())
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
|
||||
@@ -38,9 +38,6 @@ namespace lms::scanner
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 100 };
|
||||
constexpr std::size_t writeBatchSize{ 20 };
|
||||
|
||||
struct ReleaseImageAssociation
|
||||
{
|
||||
db::ReleaseId releaseId;
|
||||
@@ -48,7 +45,7 @@ namespace lms::scanner
|
||||
};
|
||||
using ReleaseImageAssociationContainer = std::deque<ReleaseImageAssociation>;
|
||||
|
||||
struct SearchImageContext
|
||||
struct SearchReleaseImageContext
|
||||
{
|
||||
db::Session& session;
|
||||
db::ReleaseId lastRetrievedReleaseId;
|
||||
@@ -56,7 +53,7 @@ namespace lms::scanner
|
||||
const std::vector<std::string>& releaseFileNames;
|
||||
};
|
||||
|
||||
db::Image::pointer findImageInDirectory(SearchImageContext& searchContext, const std::filesystem::path& directoryPath)
|
||||
db::Image::pointer findImageInDirectory(SearchReleaseImageContext& searchContext, const std::filesystem::path& directoryPath)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -82,7 +79,7 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
db::Image::pointer computeBestReleaseImage(SearchImageContext& searchContext, const db::Release::pointer& release)
|
||||
db::Image::pointer computeBestReleaseImage(SearchReleaseImageContext& searchContext, const db::Release::pointer& release)
|
||||
{
|
||||
db::Image::pointer image;
|
||||
|
||||
@@ -130,11 +127,13 @@ namespace lms::scanner
|
||||
return image;
|
||||
}
|
||||
|
||||
bool fetchNextReleaseImagesToUpdate(SearchImageContext& searchContext, ReleaseImageAssociationContainer& releaseImageAssociations)
|
||||
bool fetchNextReleaseImagesToUpdate(SearchReleaseImageContext& searchContext, ReleaseImageAssociationContainer& releaseImageAssociations)
|
||||
{
|
||||
const db::ReleaseId releaseId{ searchContext.lastRetrievedReleaseId };
|
||||
|
||||
{
|
||||
constexpr std::size_t readBatchSize{ 100 };
|
||||
|
||||
auto transaction{ searchContext.session.createReadTransaction() };
|
||||
|
||||
db::Release::find(searchContext.session, searchContext.lastRetrievedReleaseId, readBatchSize, [&](const db::Release::pointer& release) {
|
||||
@@ -166,6 +165,8 @@ namespace lms::scanner
|
||||
|
||||
void updateReleaseImages(db::Session& session, ReleaseImageAssociationContainer& imageAssociations)
|
||||
{
|
||||
constexpr std::size_t writeBatchSize{ 20 };
|
||||
|
||||
while (!imageAssociations.empty())
|
||||
{
|
||||
auto transaction{ session.createWriteTransaction() };
|
||||
@@ -216,7 +217,7 @@ namespace lms::scanner
|
||||
context.currentStepStats.totalElems = db::Release::getCount(session);
|
||||
}
|
||||
|
||||
SearchImageContext searchContext{
|
||||
SearchReleaseImageContext searchContext{
|
||||
.session = session,
|
||||
.lastRetrievedReleaseId = {},
|
||||
.releaseFileNames = _releaseFileNames,
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace lms::api::subsonic
|
||||
return res;
|
||||
}
|
||||
|
||||
ReleaseId getReleaseFromDirectory(Session& session, DirectoryId directory)
|
||||
ReleaseId getReleaseIdFromDirectory(Session& session, DirectoryId directory)
|
||||
{
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
|
||||
@@ -117,7 +117,7 @@ namespace lms::api::subsonic
|
||||
|
||||
for (const DirectoryId id : params.directoryIds)
|
||||
{
|
||||
if (const ReleaseId releaseId{ getReleaseFromDirectory(context.dbSession, id) }; releaseId.isValid())
|
||||
if (const ReleaseId releaseId{ getReleaseIdFromDirectory(context.dbSession, id) }; releaseId.isValid())
|
||||
core::Service<feedback::IFeedbackService>::get()->star(context.user->getId(), releaseId);
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ namespace lms::api::subsonic
|
||||
|
||||
for (const DirectoryId id : params.directoryIds)
|
||||
{
|
||||
if (const ReleaseId releaseId{ getReleaseFromDirectory(context.dbSession, id) }; releaseId.isValid())
|
||||
if (const ReleaseId releaseId{ getReleaseIdFromDirectory(context.dbSession, id) }; releaseId.isValid())
|
||||
core::Service<feedback::IFeedbackService>::get()->unstar(context.user->getId(), releaseId);
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@ namespace lms::api::subsonic
|
||||
core::Service<feedback::IFeedbackService>::get()->setRating(context.user->getId(), *artistId, params.rating);
|
||||
else if (const DirectoryId * directoryId{ std::get_if<DirectoryId>(¶ms.id) })
|
||||
{
|
||||
if (const ReleaseId releaseId{ getReleaseFromDirectory(context.dbSession, *directoryId) }; releaseId.isValid())
|
||||
if (const ReleaseId releaseId{ getReleaseIdFromDirectory(context.dbSession, *directoryId) }; releaseId.isValid())
|
||||
core::Service<feedback::IFeedbackService>::get()->setRating(context.user->getId(), releaseId, params.rating);
|
||||
}
|
||||
else if (const ReleaseId * releaseId{ std::get_if<ReleaseId>(¶ms.id) })
|
||||
|
||||
@@ -45,16 +45,16 @@ namespace lms::ui
|
||||
}
|
||||
} // namespace
|
||||
|
||||
class ReportResource : public Wt::WResource
|
||||
class ScannerReportResource : public Wt::WResource
|
||||
{
|
||||
public:
|
||||
ReportResource() = default;
|
||||
~ReportResource() override
|
||||
ScannerReportResource() = default;
|
||||
~ScannerReportResource() override
|
||||
{
|
||||
beingDeleted();
|
||||
}
|
||||
ReportResource(const ReportResource&) = delete;
|
||||
ReportResource& operator=(const ReportResource&) = delete;
|
||||
ScannerReportResource(const ScannerReportResource&) = delete;
|
||||
ScannerReportResource& operator=(const ScannerReportResource&) = delete;
|
||||
|
||||
void setScanStats(const scanner::ScanStats& stats)
|
||||
{
|
||||
@@ -160,7 +160,7 @@ namespace lms::ui
|
||||
{
|
||||
_reportBtn = bindNew<Wt::WPushButton>("report-btn", Wt::WString::tr("Lms.Admin.ScannerController.get-report"));
|
||||
|
||||
auto reportResource{ std::make_shared<ReportResource>() };
|
||||
auto reportResource{ std::make_shared<ScannerReportResource>() };
|
||||
reportResource->setTakesUpdateLock(true);
|
||||
_reportResource = reportResource.get();
|
||||
|
||||
|
||||
@@ -42,6 +42,6 @@ namespace lms::ui
|
||||
Wt::WLineEdit* _lastScanStatus;
|
||||
Wt::WLineEdit* _status;
|
||||
Wt::WLineEdit* _stepStatus;
|
||||
class ReportResource* _reportResource;
|
||||
class ScannerReportResource* _reportResource;
|
||||
};
|
||||
} // namespace lms::ui
|
||||
|
||||
@@ -34,18 +34,20 @@ namespace lms::ui
|
||||
{
|
||||
namespace
|
||||
{
|
||||
class ReportResource : public Wt::WResource
|
||||
class TracingReportResource : public Wt::WResource
|
||||
{
|
||||
public:
|
||||
ReportResource(core::tracing::ITraceLogger& traceLogger)
|
||||
TracingReportResource(core::tracing::ITraceLogger& traceLogger)
|
||||
: _traceLogger{ traceLogger }
|
||||
{
|
||||
}
|
||||
|
||||
~ReportResource()
|
||||
~TracingReportResource()
|
||||
{
|
||||
beingDeleted();
|
||||
}
|
||||
TracingReportResource(const TracingReportResource&) = delete;
|
||||
TracingReportResource& operator=(const TracingReportResource&) = delete;
|
||||
|
||||
void handleRequest(const Wt::Http::Request&, Wt::Http::Response& response)
|
||||
{
|
||||
@@ -80,7 +82,7 @@ namespace lms::ui
|
||||
|
||||
if (auto traceLogger{ core::Service<core::tracing::ITraceLogger>::get() })
|
||||
{
|
||||
Wt::WLink link{ std::make_shared<ReportResource>(*traceLogger) };
|
||||
Wt::WLink link{ std::make_shared<TracingReportResource>(*traceLogger) };
|
||||
link.setTarget(Wt::LinkTarget::NewWindow);
|
||||
dumpBtn->setLink(link);
|
||||
}
|
||||
|
||||
@@ -36,8 +36,6 @@
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
using namespace db;
|
||||
|
||||
Artists::Artists(Filters& filters)
|
||||
: Template{ Wt::WString::tr("Lms.Explore.Artists.template") }
|
||||
, _artistCollector{ filters, _defaultSortMode, _maxCount }
|
||||
@@ -63,12 +61,12 @@ namespace lms::ui
|
||||
}
|
||||
|
||||
{
|
||||
const std::optional<TrackArtistLinkType> linkType{ state::readValue<TrackArtistLinkType>("artists_link_type") };
|
||||
const std::optional<db::TrackArtistLinkType> linkType{ state::readValue<db::TrackArtistLinkType>("artists_link_type") };
|
||||
_artistCollector.setArtistLinkType(linkType);
|
||||
|
||||
TrackArtistLinkTypeSelector* linkTypeSelector{ bindNew<TrackArtistLinkTypeSelector>("link-type", linkType) };
|
||||
linkTypeSelector->itemSelected.connect([this](std::optional<TrackArtistLinkType> newLinkType) {
|
||||
state::writeValue<TrackArtistLinkType>("artists_link_type", newLinkType);
|
||||
linkTypeSelector->itemSelected.connect([this](std::optional<db::TrackArtistLinkType> newLinkType) {
|
||||
state::writeValue<db::TrackArtistLinkType>("artists_link_type", newLinkType);
|
||||
refreshView(newLinkType);
|
||||
});
|
||||
}
|
||||
@@ -97,7 +95,7 @@ namespace lms::ui
|
||||
refreshView();
|
||||
}
|
||||
|
||||
void Artists::refreshView(std::optional<TrackArtistLinkType> linkType)
|
||||
void Artists::refreshView(std::optional<db::TrackArtistLinkType> linkType)
|
||||
{
|
||||
_artistCollector.setArtistLinkType(linkType);
|
||||
refreshView();
|
||||
@@ -111,14 +109,14 @@ namespace lms::ui
|
||||
|
||||
void Artists::addSome()
|
||||
{
|
||||
const auto artistIds{ _artistCollector.get(Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
||||
const auto artistIds{ _artistCollector.get(db::Range{ static_cast<std::size_t>(_container->getCount()), _batchSize }) };
|
||||
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
|
||||
for (const ArtistId artistId : artistIds.results)
|
||||
for (const db::ArtistId artistId : artistIds.results)
|
||||
{
|
||||
if (const auto artist{ Artist::find(LmsApp->getDbSession(), artistId) })
|
||||
if (const auto artist{ db::Artist::find(LmsApp->getDbSession(), artistId) })
|
||||
_container->add(ArtistListHelpers::createEntry(artist));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,5 @@ namespace lms::ui
|
||||
|
||||
private:
|
||||
PlayQueueController _playQueueController;
|
||||
SearchView* _search{};
|
||||
};
|
||||
} // namespace lms::ui
|
||||
|
||||
@@ -31,16 +31,14 @@
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
using namespace db;
|
||||
|
||||
RangeResults<ReleaseId> ReleaseCollector::get(std::optional<db::Range> requestedRange)
|
||||
db::RangeResults<db::ReleaseId> ReleaseCollector::get(std::optional<db::Range> requestedRange)
|
||||
{
|
||||
feedback::IFeedbackService& feedbackService{ *core::Service<feedback::IFeedbackService>::get() };
|
||||
scrobbling::IScrobblingService& scrobblingService{ *core::Service<scrobbling::IScrobblingService>::get() };
|
||||
|
||||
const Range range{ getActualRange(requestedRange) };
|
||||
const db::Range range{ getActualRange(requestedRange) };
|
||||
|
||||
RangeResults<ReleaseId> releases;
|
||||
db::RangeResults<db::ReleaseId> releases;
|
||||
|
||||
switch (getMode())
|
||||
{
|
||||
@@ -85,45 +83,45 @@ namespace lms::ui
|
||||
|
||||
case Mode::RecentlyAdded:
|
||||
{
|
||||
Release::FindParameters params;
|
||||
db::Release::FindParameters params;
|
||||
params.setFilters(getDbFilters());
|
||||
params.setKeywords(getSearchKeywords());
|
||||
params.setSortMethod(ReleaseSortMethod::AddedDesc);
|
||||
params.setSortMethod(db::ReleaseSortMethod::AddedDesc);
|
||||
params.setRange(range);
|
||||
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
releases = Release::findIds(LmsApp->getDbSession(), params);
|
||||
releases = db::Release::findIds(LmsApp->getDbSession(), params);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Mode::RecentlyModified:
|
||||
{
|
||||
Release::FindParameters params;
|
||||
db::Release::FindParameters params;
|
||||
params.setFilters(getDbFilters());
|
||||
params.setKeywords(getSearchKeywords());
|
||||
params.setSortMethod(ReleaseSortMethod::LastWrittenDesc);
|
||||
params.setSortMethod(db::ReleaseSortMethod::LastWrittenDesc);
|
||||
params.setRange(range);
|
||||
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
releases = Release::findIds(LmsApp->getDbSession(), params);
|
||||
releases = db::Release::findIds(LmsApp->getDbSession(), params);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Mode::All:
|
||||
{
|
||||
Release::FindParameters params;
|
||||
db::Release::FindParameters params;
|
||||
params.setFilters(getDbFilters());
|
||||
params.setSortMethod(ReleaseSortMethod::SortName);
|
||||
params.setSortMethod(db::ReleaseSortMethod::SortName);
|
||||
params.setKeywords(getSearchKeywords());
|
||||
params.setRange(range);
|
||||
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
releases = Release::findIds(LmsApp->getDbSession(), params);
|
||||
releases = db::Release::findIds(LmsApp->getDbSession(), params);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -135,21 +133,21 @@ namespace lms::ui
|
||||
return releases;
|
||||
}
|
||||
|
||||
RangeResults<ReleaseId> ReleaseCollector::getRandomReleases(Range range)
|
||||
db::RangeResults<db::ReleaseId> ReleaseCollector::getRandomReleases(Range range)
|
||||
{
|
||||
assert(getMode() == Mode::Random);
|
||||
|
||||
if (!_randomReleases)
|
||||
{
|
||||
Release::FindParameters params;
|
||||
db::Release::FindParameters params;
|
||||
params.setFilters(getDbFilters());
|
||||
params.setKeywords(getSearchKeywords());
|
||||
params.setSortMethod(ReleaseSortMethod::Random);
|
||||
params.setRange(Range{ 0, getMaxCount() });
|
||||
params.setSortMethod(db::ReleaseSortMethod::Random);
|
||||
params.setRange(db::Range{ 0, getMaxCount() });
|
||||
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
_randomReleases = Release::findIds(LmsApp->getDbSession(), params);
|
||||
_randomReleases = db::Release::findIds(LmsApp->getDbSession(), params);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,26 +47,24 @@
|
||||
|
||||
namespace lms::ui::TrackListHelpers
|
||||
{
|
||||
using namespace db;
|
||||
|
||||
std::map<Wt::WString, std::set<ArtistId>> getArtistsByRole(db::TrackId trackId, core::EnumSet<db::TrackArtistLinkType> artistLinkTypes)
|
||||
std::map<Wt::WString, std::set<db::ArtistId>> getArtistsByRole(db::TrackId trackId, core::EnumSet<db::TrackArtistLinkType> artistLinkTypes)
|
||||
{
|
||||
std::map<Wt::WString, std::set<ArtistId>> artistMap;
|
||||
std::map<Wt::WString, std::set<db::ArtistId>> artistMap;
|
||||
|
||||
auto addArtists = [&](TrackArtistLinkType linkType, const char* type) {
|
||||
auto addArtists = [&](db::TrackArtistLinkType linkType, const char* type) {
|
||||
if (!artistLinkTypes.contains(linkType))
|
||||
return;
|
||||
|
||||
Artist::FindParameters params;
|
||||
db::Artist::FindParameters params;
|
||||
params.setTrack(trackId);
|
||||
params.setLinkType(linkType);
|
||||
const auto artistIds{ Artist::findIds(LmsApp->getDbSession(), params) };
|
||||
const auto artistIds{ db::Artist::findIds(LmsApp->getDbSession(), params) };
|
||||
if (artistIds.results.empty())
|
||||
return;
|
||||
|
||||
Wt::WString typeStr{ Wt::WString::trn(type, artistIds.results.size()) };
|
||||
|
||||
for (ArtistId artistId : artistIds.results)
|
||||
for (db::ArtistId artistId : artistIds.results)
|
||||
artistMap[typeStr].insert(artistId);
|
||||
};
|
||||
|
||||
@@ -74,21 +72,21 @@ namespace lms::ui::TrackListHelpers
|
||||
if (!artistLinkTypes.contains(db::TrackArtistLinkType::Performer))
|
||||
return;
|
||||
|
||||
TrackArtistLink::FindParameters params;
|
||||
db::TrackArtistLink::FindParameters params;
|
||||
params.setTrack(trackId);
|
||||
params.setLinkType(TrackArtistLinkType::Performer);
|
||||
params.setLinkType(db::TrackArtistLinkType::Performer);
|
||||
|
||||
TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const TrackArtistLink::pointer& link) {
|
||||
db::TrackArtistLink::find(LmsApp->getDbSession(), params, [&](const db::TrackArtistLink::pointer& link) {
|
||||
artistMap[std::string{ link->getSubType() }].insert(link->getArtist()->getId());
|
||||
});
|
||||
};
|
||||
|
||||
addArtists(TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
||||
addArtists(TrackArtistLinkType::Conductor, "Lms.Explore.Artists.linktype-conductor");
|
||||
addArtists(TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.linktype-lyricist");
|
||||
addArtists(TrackArtistLinkType::Mixer, "Lms.Explore.Artists.linktype-mixer");
|
||||
addArtists(TrackArtistLinkType::Remixer, "Lms.Explore.Artists.linktype-remixer");
|
||||
addArtists(TrackArtistLinkType::Producer, "Lms.Explore.Artists.linktype-producer");
|
||||
addArtists(db::TrackArtistLinkType::Composer, "Lms.Explore.Artists.linktype-composer");
|
||||
addArtists(db::TrackArtistLinkType::Conductor, "Lms.Explore.Artists.linktype-conductor");
|
||||
addArtists(db::TrackArtistLinkType::Lyricist, "Lms.Explore.Artists.linktype-lyricist");
|
||||
addArtists(db::TrackArtistLinkType::Mixer, "Lms.Explore.Artists.linktype-mixer");
|
||||
addArtists(db::TrackArtistLinkType::Remixer, "Lms.Explore.Artists.linktype-remixer");
|
||||
addArtists(db::TrackArtistLinkType::Producer, "Lms.Explore.Artists.linktype-producer");
|
||||
addPerformerArtists();
|
||||
|
||||
if (auto itRolelessPerformers{ artistMap.find("") }; itRolelessPerformers != std::cend(artistMap))
|
||||
@@ -105,7 +103,7 @@ namespace lms::ui::TrackListHelpers
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createReadTransaction() };
|
||||
|
||||
const db::Track::pointer track{ Track::find(LmsApp->getDbSession(), trackId) };
|
||||
const db::Track::pointer track{ db::Track::find(LmsApp->getDbSession(), trackId) };
|
||||
if (!track)
|
||||
return;
|
||||
|
||||
@@ -113,7 +111,7 @@ namespace lms::ui::TrackListHelpers
|
||||
Wt::WWidget* trackInfoPtr{ trackInfo.get() };
|
||||
trackInfo->addFunction("tr", &Wt::WTemplate::Functions::tr);
|
||||
|
||||
std::map<Wt::WString, std::set<ArtistId>> artistMap{ getArtistsByRole(trackId) };
|
||||
std::map<Wt::WString, std::set<db::ArtistId>> artistMap{ getArtistsByRole(trackId) };
|
||||
if (!artistMap.empty())
|
||||
{
|
||||
trackInfo->setCondition("if-has-artist", true);
|
||||
@@ -219,10 +217,10 @@ namespace lms::ui::TrackListHelpers
|
||||
|
||||
entry->bindString("name", Wt::WString::fromUTF8(track->getName()), Wt::TextFormat::Plain);
|
||||
|
||||
const Release::pointer release{ track->getRelease() };
|
||||
const TrackId trackId{ track->getId() };
|
||||
const db::Release::pointer release{ track->getRelease() };
|
||||
const db::TrackId trackId{ track->getId() };
|
||||
|
||||
const auto artists{ track->getArtistIds({ TrackArtistLinkType::Artist }) };
|
||||
const auto artists{ track->getArtistIds({ db::TrackArtistLinkType::Artist }) };
|
||||
if (!artists.empty())
|
||||
{
|
||||
entry->setCondition("if-has-artists", true);
|
||||
|
||||
@@ -35,8 +35,6 @@
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
using namespace db;
|
||||
|
||||
TrackLists::TrackLists(Filters& filters)
|
||||
: Template{ Wt::WString::tr("Lms.Explore.TrackLists.template") }
|
||||
, _filters{ filters }
|
||||
@@ -111,17 +109,17 @@ namespace lms::ui
|
||||
|
||||
void TrackLists::addSome()
|
||||
{
|
||||
const Range range{ static_cast<std::size_t>(_container->getCount()), _batchSize };
|
||||
const db::Range range{ static_cast<std::size_t>(_container->getCount()), _batchSize };
|
||||
|
||||
Session& session{ LmsApp->getDbSession() };
|
||||
db::Session& session{ LmsApp->getDbSession() };
|
||||
auto transaction{ session.createReadTransaction() };
|
||||
|
||||
TrackList::FindParameters params;
|
||||
db::TrackList::FindParameters params;
|
||||
|
||||
if (!_searchText.empty())
|
||||
params.setKeywords(core::stringUtils::splitString(_searchText, ' '));
|
||||
params.setFilters(_filters.getDbFilters());
|
||||
params.setType(TrackListType::PlayList);
|
||||
params.setType(db::TrackListType::PlayList);
|
||||
params.setRange(range);
|
||||
|
||||
switch (_type)
|
||||
@@ -139,26 +137,26 @@ namespace lms::ui
|
||||
switch (_sortMode)
|
||||
{
|
||||
case SortMode::All:
|
||||
params.setSortMethod(TrackListSortMethod::Name);
|
||||
params.setSortMethod(db::TrackListSortMethod::Name);
|
||||
break;
|
||||
case SortMode::RecentlyModified:
|
||||
params.setSortMethod(TrackListSortMethod::LastModifiedDesc);
|
||||
params.setSortMethod(db::TrackListSortMethod::LastModifiedDesc);
|
||||
break;
|
||||
}
|
||||
|
||||
const auto trackListIds{ TrackList::find(session, params) };
|
||||
for (const TrackListId trackListId : trackListIds.results)
|
||||
const auto trackListIds{ db::TrackList::find(session, params) };
|
||||
for (const db::TrackListId trackListId : trackListIds.results)
|
||||
{
|
||||
if (const TrackList::pointer trackList{ TrackList::find(LmsApp->getDbSession(), trackListId) })
|
||||
if (const db::TrackList::pointer trackList{ db::TrackList::find(LmsApp->getDbSession(), trackListId) })
|
||||
addTracklist(trackList);
|
||||
}
|
||||
|
||||
_container->setHasMore(trackListIds.moreResults);
|
||||
}
|
||||
|
||||
void TrackLists::addTracklist(const ObjectPtr<TrackList>& trackList)
|
||||
void TrackLists::addTracklist(const db::ObjectPtr<db::TrackList>& trackList)
|
||||
{
|
||||
const TrackListId trackListId{ trackList->getId() };
|
||||
const db::TrackListId trackListId{ trackList->getId() };
|
||||
|
||||
WTemplate* entry{ _container->addNew<Template>(Wt::WString::tr("Lms.Explore.TrackLists.template.entry")) };
|
||||
entry->bindWidget("name", utils::createTrackListAnchor(trackList));
|
||||
|
||||
@@ -71,7 +71,6 @@ namespace lms::ui
|
||||
Type _type{ _defaultType };
|
||||
std::string _searchText;
|
||||
Filters& _filters;
|
||||
Wt::WWidget* _currentActiveItem{};
|
||||
InfiniteScrollingContainer* _container{};
|
||||
std::unordered_map<db::TrackListId, Wt::WWidget*> _trackListWidgets;
|
||||
};
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
#include "LmsApplication.hpp"
|
||||
|
||||
#define LOG(severity, message) LMS_LOG(UI, severity, "Image resource: " << message)
|
||||
#define ARTWORK_RESOURCE_LOG(severity, message) LMS_LOG(UI, severity, "Image resource: " << message)
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
@@ -190,7 +190,7 @@ namespace lms::ui
|
||||
const auto size{ sizeStr ? core::stringUtils::readAs<std::size_t>(*sizeStr) : std::nullopt };
|
||||
if (size && *size > maxSize)
|
||||
{
|
||||
LOG(DEBUG, "invalid size provided!");
|
||||
ARTWORK_RESOURCE_LOG(DEBUG, "invalid size provided!");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
#define LOG(severity, message) LMS_LOG(UI, severity, "Audio file resource: " << message)
|
||||
#define AUDIO_RESOURCE_LOG(severity, message) LMS_LOG(UI, severity, "Audio file resource: " << message)
|
||||
|
||||
namespace
|
||||
{
|
||||
@@ -43,7 +43,7 @@ namespace lms::ui
|
||||
const db::Track::pointer track{ db::Track::find(LmsApp->getDbSession(), trackId) };
|
||||
if (!track)
|
||||
{
|
||||
LOG(ERROR, "Missing track");
|
||||
AUDIO_RESOURCE_LOG(ERROR, "Missing track");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -55,14 +55,14 @@ namespace lms::ui
|
||||
const std::string* trackIdParameter{ request.getParameter("trackid") };
|
||||
if (!trackIdParameter)
|
||||
{
|
||||
LOG(ERROR, "Missing trackid URL parameter!");
|
||||
AUDIO_RESOURCE_LOG(ERROR, "Missing trackid URL parameter!");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
const std::optional<db::TrackId> trackId{ core::stringUtils::readAs<db::TrackId::ValueType>(*trackIdParameter) };
|
||||
if (!trackId)
|
||||
{
|
||||
LOG(ERROR, "Bad trackid URL parameter!");
|
||||
AUDIO_RESOURCE_LOG(ERROR, "Bad trackid URL parameter!");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
#include "LmsApplication.hpp"
|
||||
|
||||
#define LOG(severity, message) LMS_LOG(UI, severity, "Audio transcode resource: " << message)
|
||||
#define TRANSCODE_LOG(severity, message) LMS_LOG(UI, severity, "Audio transcode resource: " << message)
|
||||
|
||||
namespace lms::core::stringUtils
|
||||
{
|
||||
@@ -62,7 +62,7 @@ namespace lms::core::stringUtils
|
||||
return format;
|
||||
}
|
||||
|
||||
LOG(ERROR, "Cannot determine audio format from value '" << str << "'");
|
||||
TRANSCODE_LOG(ERROR, "Cannot determine audio format from value '" << str << "'");
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
@@ -88,7 +88,7 @@ namespace lms::ui
|
||||
return av::transcoding::OutputFormat::WEBM_VORBIS;
|
||||
}
|
||||
|
||||
LOG(ERROR, "Cannot convert from audio format to AV format");
|
||||
TRANSCODE_LOG(ERROR, "Cannot convert from audio format to AV format");
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
@@ -99,13 +99,13 @@ namespace lms::ui
|
||||
auto paramStr{ request.getParameter(parameterName) };
|
||||
if (!paramStr)
|
||||
{
|
||||
LOG(DEBUG, "Missing parameter '" << parameterName << "'");
|
||||
TRANSCODE_LOG(DEBUG, "Missing parameter '" << parameterName << "'");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto res{ core::stringUtils::readAs<T>(*paramStr) };
|
||||
if (!res)
|
||||
LOG(ERROR, "Cannot parse parameter '" << parameterName << "' from value '" << *paramStr << "'");
|
||||
TRANSCODE_LOG(ERROR, "Cannot parse parameter '" << parameterName << "' from value '" << *paramStr << "'");
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -130,7 +130,7 @@ namespace lms::ui
|
||||
|
||||
if (!db::isAudioBitrateAllowed(*bitrate))
|
||||
{
|
||||
LOG(ERROR, "Bitrate '" << *bitrate << "' is not allowed");
|
||||
TRANSCODE_LOG(ERROR, "Bitrate '" << *bitrate << "' is not allowed");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ namespace lms::ui
|
||||
const db::Track::pointer track{ db::Track::find(LmsApp->getDbSession(), *trackId) };
|
||||
if (!track)
|
||||
{
|
||||
LOG(ERROR, "Missing track");
|
||||
TRANSCODE_LOG(ERROR, "Missing track");
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ namespace lms::ui
|
||||
}
|
||||
catch (const av::Exception& e)
|
||||
{
|
||||
LOG(ERROR, "Caught Av exception: " << e.what());
|
||||
TRANSCODE_LOG(ERROR, "Caught Av exception: " << e.what());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
#include "LmsApplication.hpp"
|
||||
|
||||
#define LOG(severity, message) LMS_LOG(UI, severity, "Download resource: " << message)
|
||||
#define DL_RESOURCE_LOG(severity, message) LMS_LOG(UI, severity, "Download resource: " << message)
|
||||
|
||||
namespace lms::ui
|
||||
{
|
||||
@@ -71,7 +71,7 @@ namespace lms::ui
|
||||
}
|
||||
catch (zip::Exception& exception)
|
||||
{
|
||||
LOG(ERROR, "Zipper exception: " << exception.what());
|
||||
DL_RESOURCE_LOG(ERROR, "Zipper exception: " << exception.what());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ namespace lms::ui
|
||||
const db::Track::pointer track{ db::Track::find(LmsApp->getDbSession(), _trackId) };
|
||||
if (!track)
|
||||
{
|
||||
LOG(DEBUG, "Cannot find track");
|
||||
DL_RESOURCE_LOG(DEBUG, "Cannot find track");
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user