Some more renaming
This commit is contained in:
@@ -31,7 +31,7 @@
|
||||
namespace Av::Transcoding
|
||||
{
|
||||
|
||||
#define LOG(sev) LMS_LOG(TRANSCODE, sev) << "[" << _debugId << "] - "
|
||||
#define LOG(sev) LMS_LOG(TRANSCODING, sev) << "[" << _debugId << "] - "
|
||||
|
||||
static std::atomic<size_t> globalId{};
|
||||
static std::filesystem::path ffmpegPath;
|
||||
|
||||
@@ -43,9 +43,9 @@ namespace Av::Transcoding
|
||||
, _transcoder{ inputParameters, outputParameters }
|
||||
{
|
||||
if (_estimatedContentLength)
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Estimated content length = " << *_estimatedContentLength;
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Estimated content length = " << *_estimatedContentLength;
|
||||
else
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Not using estimated content length";
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Not using estimated content length";
|
||||
}
|
||||
|
||||
Wt::Http::ResponseContinuation* TranscodingResourceHandler::processRequest(const Wt::Http::Request& /*request*/, Wt::Http::Response& response)
|
||||
@@ -53,11 +53,11 @@ namespace Av::Transcoding
|
||||
if (_estimatedContentLength)
|
||||
response.setContentLength(*_estimatedContentLength);
|
||||
response.setMimeType(_transcoder.getOutputMimeType());
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Transcoder finished = " << _transcoder.finished() << ", total served bytes = " << _totalServedByteCount << ", mime type = " << _transcoder.getOutputMimeType();
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Transcoder finished = " << _transcoder.finished() << ", total served bytes = " << _totalServedByteCount << ", mime type = " << _transcoder.getOutputMimeType();
|
||||
|
||||
if (_bytesReadyCount > 0)
|
||||
{
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Writing " << _bytesReadyCount << " bytes back to client";
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Writing " << _bytesReadyCount << " bytes back to client";
|
||||
|
||||
response.out().write(reinterpret_cast<const char*>(&_buffer[0]), _bytesReadyCount);
|
||||
_totalServedByteCount += _bytesReadyCount;
|
||||
@@ -70,7 +70,7 @@ namespace Av::Transcoding
|
||||
continuation->waitForMoreData();
|
||||
_transcoder.asyncRead(_buffer.data(), _buffer.size(), [=](std::size_t nbBytesRead)
|
||||
{
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Have " << nbBytesRead << " more bytes to send back";
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Have " << nbBytesRead << " more bytes to send back";
|
||||
|
||||
assert(_bytesReadyCount == 0);
|
||||
_bytesReadyCount = nbBytesRead;
|
||||
@@ -86,7 +86,7 @@ namespace Av::Transcoding
|
||||
{
|
||||
const std::size_t padSize{ *_estimatedContentLength - _totalServedByteCount };
|
||||
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Adding " << padSize << " padding bytes";
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Adding " << padSize << " padding bytes";
|
||||
|
||||
for (std::size_t i{}; i < padSize; ++i)
|
||||
response.out().put(0);
|
||||
@@ -94,7 +94,7 @@ namespace Av::Transcoding
|
||||
_totalServedByteCount += padSize;
|
||||
}
|
||||
|
||||
LMS_LOG(TRANSCODE, DEBUG) << "Transcoding finished. Total served byte count = " << _totalServedByteCount;
|
||||
LMS_LOG(TRANSCODING, DEBUG) << "Transcoding finished. Total served byte count = " << _totalServedByteCount;
|
||||
}
|
||||
|
||||
return {};
|
||||
|
||||
@@ -21,59 +21,59 @@
|
||||
|
||||
const char* getModuleName(Module mod)
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case Module::API_SUBSONIC: return "API_SUBSONIC";
|
||||
case Module::AUTH: return "AUTH";
|
||||
case Module::AV: return "AV";
|
||||
case Module::CHILDPROCESS: return "CHILDPROC";
|
||||
case Module::COVER: return "COVER";
|
||||
case Module::DB: return "DB";
|
||||
case Module::DBUPDATER: return "DB UPDATER";
|
||||
case Module::FEATURE: return "FEATURE";
|
||||
case Module::FEEDBACK: return "FEEDBACK";
|
||||
case Module::HTTP: return "HTTP";
|
||||
case Module::MAIN: return "MAIN";
|
||||
case Module::METADATA: return "METADATA";
|
||||
case Module::REMOTE: return "REMOTE";
|
||||
case Module::SCROBBLING: return "SCROBBLING";
|
||||
case Module::SERVICE: return "SERVICE";
|
||||
case Module::RECOMMENDATION: return "RECOMMENDATION";
|
||||
case Module::TRANSCODE: return "TRANSCODE";
|
||||
case Module::UI: return "UI";
|
||||
case Module::UTILS: return "UTILS";
|
||||
}
|
||||
return "";
|
||||
switch (mod)
|
||||
{
|
||||
case Module::API_SUBSONIC: return "API_SUBSONIC";
|
||||
case Module::AUTH: return "AUTH";
|
||||
case Module::AV: return "AV";
|
||||
case Module::CHILDPROCESS: return "CHILDPROC";
|
||||
case Module::COVER: return "COVER";
|
||||
case Module::DB: return "DB";
|
||||
case Module::DBUPDATER: return "DB UPDATER";
|
||||
case Module::FEATURE: return "FEATURE";
|
||||
case Module::FEEDBACK: return "FEEDBACK";
|
||||
case Module::HTTP: return "HTTP";
|
||||
case Module::MAIN: return "MAIN";
|
||||
case Module::METADATA: return "METADATA";
|
||||
case Module::REMOTE: return "REMOTE";
|
||||
case Module::SCROBBLING: return "SCROBBLING";
|
||||
case Module::SERVICE: return "SERVICE";
|
||||
case Module::RECOMMENDATION: return "RECOMMENDATION";
|
||||
case Module::TRANSCODING: return "TRANSCODING";
|
||||
case Module::UI: return "UI";
|
||||
case Module::UTILS: return "UTILS";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
const char* getSeverityName(Severity sev)
|
||||
{
|
||||
switch (sev)
|
||||
{
|
||||
case Severity::FATAL: return "fatal";
|
||||
case Severity::ERROR: return "error";
|
||||
case Severity::WARNING: return "warning";
|
||||
case Severity::INFO: return "info";
|
||||
case Severity::DEBUG: return "debug";
|
||||
}
|
||||
return "";
|
||||
switch (sev)
|
||||
{
|
||||
case Severity::FATAL: return "fatal";
|
||||
case Severity::ERROR: return "error";
|
||||
case Severity::WARNING: return "warning";
|
||||
case Severity::INFO: return "info";
|
||||
case Severity::DEBUG: return "debug";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
Log::Log(Logger* logger, Module module, Severity severity)
|
||||
: _module {module},
|
||||
_severity {severity},
|
||||
_logger {logger}
|
||||
: _module{ module },
|
||||
_severity{ severity },
|
||||
_logger{ logger }
|
||||
{}
|
||||
|
||||
Log::~Log()
|
||||
{
|
||||
if (_logger)
|
||||
_logger->processLog(*this);
|
||||
if (_logger)
|
||||
_logger->processLog(*this);
|
||||
}
|
||||
|
||||
std::string
|
||||
Log::getMessage() const
|
||||
{
|
||||
return _oss.str();
|
||||
return _oss.str();
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ enum class Module
|
||||
SCROBBLING,
|
||||
SERVICE,
|
||||
RECOMMENDATION,
|
||||
TRANSCODE,
|
||||
TRANSCODING,
|
||||
UI,
|
||||
UTILS,
|
||||
};
|
||||
|
||||
@@ -44,7 +44,7 @@ add_executable(lms
|
||||
ui/explore/TrackListsView.cpp
|
||||
ui/explore/TracksView.cpp
|
||||
ui/resource/AudioFileResource.cpp
|
||||
ui/resource/AudioTranscodeResource.cpp
|
||||
ui/resource/AudioTranscodingResource.cpp
|
||||
ui/resource/CoverResource.cpp
|
||||
ui/resource/DownloadResource.cpp
|
||||
)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
#include "explore/Explore.hpp"
|
||||
#include "explore/Filters.hpp"
|
||||
#include "resource/AudioFileResource.hpp"
|
||||
#include "resource/AudioTranscodeResource.hpp"
|
||||
#include "resource/AudioTranscodingResource.hpp"
|
||||
#include "resource/DownloadResource.hpp"
|
||||
#include "resource/CoverResource.hpp"
|
||||
#include "Auth.hpp"
|
||||
|
||||
+240
-249
@@ -35,7 +35,7 @@
|
||||
#include "services/database/User.hpp"
|
||||
|
||||
#include "resource/CoverResource.hpp"
|
||||
#include "resource/AudioTranscodeResource.hpp"
|
||||
#include "resource/AudioTranscodingResource.hpp"
|
||||
#include "resource/AudioFileResource.hpp"
|
||||
|
||||
#include "utils/String.hpp"
|
||||
@@ -44,304 +44,295 @@
|
||||
#include "LmsApplication.hpp"
|
||||
#include "Utils.hpp"
|
||||
|
||||
namespace UserInterface {
|
||||
|
||||
static std::string settingsToJSString(const MediaPlayer::Settings& settings)
|
||||
namespace UserInterface
|
||||
{
|
||||
namespace Json = Wt::Json;
|
||||
namespace
|
||||
{
|
||||
std::string settingsToJSString(const MediaPlayer::Settings& settings)
|
||||
{
|
||||
namespace Json = Wt::Json;
|
||||
|
||||
Json::Object res;
|
||||
Json::Object res;
|
||||
|
||||
{
|
||||
Json::Object transcode;
|
||||
transcode["mode"] = static_cast<int>(settings.transcode.mode);
|
||||
transcode["format"] = static_cast<int>(settings.transcode.format);
|
||||
transcode["bitrate"] = static_cast<int>(settings.transcode.bitrate);
|
||||
res["transcode"] = std::move(transcode);
|
||||
}
|
||||
{
|
||||
Json::Object transcoding;
|
||||
transcoding["mode"] = static_cast<int>(settings.transcoding.mode);
|
||||
transcoding["format"] = static_cast<int>(settings.transcoding.format);
|
||||
transcoding["bitrate"] = static_cast<int>(settings.transcoding.bitrate);
|
||||
res["transcoding"] = std::move(transcoding);
|
||||
}
|
||||
|
||||
{
|
||||
Json::Object replayGain;
|
||||
replayGain["mode"] = static_cast<int>(settings.replayGain.mode);
|
||||
replayGain["preAmpGain"] = settings.replayGain.preAmpGain;
|
||||
replayGain["preAmpGainIfNoInfo"] = settings.replayGain.preAmpGainIfNoInfo;
|
||||
res["replayGain"] = std::move(replayGain);
|
||||
}
|
||||
{
|
||||
Json::Object replayGain;
|
||||
replayGain["mode"] = static_cast<int>(settings.replayGain.mode);
|
||||
replayGain["preAmpGain"] = settings.replayGain.preAmpGain;
|
||||
replayGain["preAmpGainIfNoInfo"] = settings.replayGain.preAmpGainIfNoInfo;
|
||||
res["replayGain"] = std::move(replayGain);
|
||||
}
|
||||
|
||||
return Json::serialize(res);
|
||||
}
|
||||
return Json::serialize(res);
|
||||
}
|
||||
|
||||
static
|
||||
std::optional<MediaPlayer::Settings::Transcode::Mode>
|
||||
transcodeModeFromString(const std::string& str)
|
||||
{
|
||||
const auto value {StringUtils::readAs<int>(str)};
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
std::optional<MediaPlayer::Settings::Transcoding::Mode> transcodingModeFromString(const std::string& str)
|
||||
{
|
||||
const auto value{ StringUtils::readAs<int>(str) };
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
|
||||
MediaPlayer::Settings::Transcode::Mode mode {static_cast<MediaPlayer::Settings::Transcode::Mode>(*value)};
|
||||
switch (mode)
|
||||
{
|
||||
case MediaPlayer::Settings::Transcode::Mode::Never:
|
||||
case MediaPlayer::Settings::Transcode::Mode::Always:
|
||||
case MediaPlayer::Settings::Transcode::Mode::IfFormatNotSupported:
|
||||
return mode;
|
||||
}
|
||||
MediaPlayer::Settings::Transcoding::Mode mode{ static_cast<MediaPlayer::Settings::Transcoding::Mode>(*value) };
|
||||
switch (mode)
|
||||
{
|
||||
case MediaPlayer::Settings::Transcoding::Mode::Never:
|
||||
case MediaPlayer::Settings::Transcoding::Mode::Always:
|
||||
case MediaPlayer::Settings::Transcoding::Mode::IfFormatNotSupported:
|
||||
return mode;
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
static
|
||||
std::optional<MediaPlayer::Format>
|
||||
formatFromString(const std::string& str)
|
||||
{
|
||||
const auto value {StringUtils::readAs<int>(str)};
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
std::optional<MediaPlayer::Format> formatFromString(const std::string& str)
|
||||
{
|
||||
const auto value{ StringUtils::readAs<int>(str) };
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
|
||||
MediaPlayer::Format format {static_cast<MediaPlayer::Format>(*value)};
|
||||
switch (format)
|
||||
{
|
||||
case MediaPlayer::Format::MP3:
|
||||
case MediaPlayer::Format::OGG_OPUS:
|
||||
case MediaPlayer::Format::MATROSKA_OPUS:
|
||||
case MediaPlayer::Format::OGG_VORBIS:
|
||||
case MediaPlayer::Format::WEBM_VORBIS:
|
||||
return format;
|
||||
}
|
||||
MediaPlayer::Format format{ static_cast<MediaPlayer::Format>(*value) };
|
||||
switch (format)
|
||||
{
|
||||
case MediaPlayer::Format::MP3:
|
||||
case MediaPlayer::Format::OGG_OPUS:
|
||||
case MediaPlayer::Format::MATROSKA_OPUS:
|
||||
case MediaPlayer::Format::OGG_VORBIS:
|
||||
case MediaPlayer::Format::WEBM_VORBIS:
|
||||
return format;
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
static
|
||||
std::optional<MediaPlayer::Bitrate>
|
||||
bitrateFromString(const std::string& str)
|
||||
{
|
||||
const auto value {StringUtils::readAs<int>(str)};
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
std::optional<MediaPlayer::Bitrate> bitrateFromString(const std::string& str)
|
||||
{
|
||||
const auto value{ StringUtils::readAs<int>(str) };
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
|
||||
if (!Database::isAudioBitrateAllowed(*value))
|
||||
return std::nullopt;
|
||||
if (!Database::isAudioBitrateAllowed(*value))
|
||||
return std::nullopt;
|
||||
|
||||
return *value;
|
||||
}
|
||||
return *value;
|
||||
}
|
||||
|
||||
static
|
||||
std::optional<MediaPlayer::Settings::ReplayGain::Mode>
|
||||
replayGainModeFromString(const std::string& str)
|
||||
{
|
||||
const auto value {StringUtils::readAs<int>(str)};
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
std::optional<MediaPlayer::Settings::ReplayGain::Mode> replayGainModeFromString(const std::string& str)
|
||||
{
|
||||
const auto value{ StringUtils::readAs<int>(str) };
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
|
||||
MediaPlayer::Settings::ReplayGain::Mode mode {static_cast<MediaPlayer::Settings::ReplayGain::Mode>(*value)};
|
||||
switch (mode)
|
||||
{
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::None:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Auto:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Track:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Release:
|
||||
return mode;
|
||||
}
|
||||
MediaPlayer::Settings::ReplayGain::Mode mode{ static_cast<MediaPlayer::Settings::ReplayGain::Mode>(*value) };
|
||||
switch (mode)
|
||||
{
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::None:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Auto:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Track:
|
||||
case MediaPlayer::Settings::ReplayGain::Mode::Release:
|
||||
return mode;
|
||||
}
|
||||
|
||||
return std::nullopt;
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
static
|
||||
std::optional<float>
|
||||
replayGainPreAmpGainFromString(const std::string& str)
|
||||
{
|
||||
const auto value {StringUtils::readAs<double>(str)};
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
std::optional<float> replayGainPreAmpGainFromString(const std::string& str)
|
||||
{
|
||||
const auto value{ StringUtils::readAs<double>(str) };
|
||||
if (!value)
|
||||
return std::nullopt;
|
||||
|
||||
return ::Utils::clamp(*value, (double)MediaPlayer::Settings::ReplayGain::minPreAmpGain, (double)MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
|
||||
}
|
||||
return ::Utils::clamp(*value, (double)MediaPlayer::Settings::ReplayGain::minPreAmpGain, (double)MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
|
||||
}
|
||||
|
||||
static MediaPlayer::Settings settingsfromJSString(const std::string& strSettings)
|
||||
{
|
||||
using Settings = MediaPlayer::Settings;
|
||||
namespace Json = Wt::Json;
|
||||
Json::Object parsedSettings;
|
||||
MediaPlayer::Settings settingsfromJSString(const std::string& strSettings)
|
||||
{
|
||||
using Settings = MediaPlayer::Settings;
|
||||
namespace Json = Wt::Json;
|
||||
Json::Object parsedSettings;
|
||||
|
||||
Json::parse(strSettings, parsedSettings);
|
||||
Json::parse(strSettings, parsedSettings);
|
||||
|
||||
MediaPlayer::Settings settings;
|
||||
MediaPlayer::Settings settings;
|
||||
|
||||
{
|
||||
const Json::Value transcodeValue {parsedSettings.get("transcode")};
|
||||
if (transcodeValue.type() == Json::Type::Object)
|
||||
{
|
||||
const Json::Object transcode {transcodeValue};
|
||||
settings.transcode.mode = transcodeModeFromString(transcode.get("mode").toString().orIfNull("")).value_or(Settings::Transcode::defaultMode);
|
||||
settings.transcode.format = formatFromString(transcode.get("format").toString().orIfNull("")).value_or(Settings::Transcode::defaultFormat);
|
||||
settings.transcode.bitrate = bitrateFromString(transcode.get("bitrate").toString().orIfNull("")).value_or(Settings::Transcode::defaultBitrate);
|
||||
}
|
||||
}
|
||||
{
|
||||
const Json::Value replayGainValue {parsedSettings.get("replayGain")};
|
||||
if (replayGainValue.type() == Json::Type::Object)
|
||||
{
|
||||
const Json::Object replayGain {replayGainValue};
|
||||
settings.replayGain.mode = replayGainModeFromString(replayGain.get("mode").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultMode);
|
||||
settings.replayGain.preAmpGain = replayGainPreAmpGainFromString(replayGain.get("preAmpGain").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
|
||||
settings.replayGain.preAmpGainIfNoInfo = replayGainPreAmpGainFromString(replayGain.get("preAmpGainIfNoInfo").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
|
||||
}
|
||||
}
|
||||
{
|
||||
const Json::Value transcodingValue{ parsedSettings.get("transcoding") };
|
||||
if (transcodingValue.type() == Json::Type::Object)
|
||||
{
|
||||
const Json::Object transcoding{ transcodingValue };
|
||||
settings.transcoding.mode = transcodingModeFromString(transcoding.get("mode").toString().orIfNull("")).value_or(Settings::Transcoding::defaultMode);
|
||||
settings.transcoding.format = formatFromString(transcoding.get("format").toString().orIfNull("")).value_or(Settings::Transcoding::defaultFormat);
|
||||
settings.transcoding.bitrate = bitrateFromString(transcoding.get("bitrate").toString().orIfNull("")).value_or(Settings::Transcoding::defaultBitrate);
|
||||
}
|
||||
}
|
||||
{
|
||||
const Json::Value replayGainValue{ parsedSettings.get("replayGain") };
|
||||
if (replayGainValue.type() == Json::Type::Object)
|
||||
{
|
||||
const Json::Object replayGain{ replayGainValue };
|
||||
settings.replayGain.mode = replayGainModeFromString(replayGain.get("mode").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultMode);
|
||||
settings.replayGain.preAmpGain = replayGainPreAmpGainFromString(replayGain.get("preAmpGain").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
|
||||
settings.replayGain.preAmpGainIfNoInfo = replayGainPreAmpGainFromString(replayGain.get("preAmpGainIfNoInfo").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
|
||||
}
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
return settings;
|
||||
}
|
||||
}
|
||||
|
||||
MediaPlayer::MediaPlayer()
|
||||
: Wt::WTemplate {Wt::WString::tr("Lms.MediaPlayer.template")}
|
||||
, playPrevious {this, "playPrevious"}
|
||||
, playNext {this, "playNext"}
|
||||
, scrobbleListenNow {this, "scrobbleListenNow"}
|
||||
, scrobbleListenFinished {this, "scrobbleListenFinished"}
|
||||
, playbackEnded {this, "playbackEnded"}
|
||||
, _settingsLoaded {this, "settingsLoaded"}
|
||||
{
|
||||
addFunction("tr", &Wt::WTemplate::Functions::tr);
|
||||
MediaPlayer::MediaPlayer()
|
||||
: Wt::WTemplate{ Wt::WString::tr("Lms.MediaPlayer.template") }
|
||||
, playPrevious{ this, "playPrevious" }
|
||||
, playNext{ this, "playNext" }
|
||||
, scrobbleListenNow{ this, "scrobbleListenNow" }
|
||||
, scrobbleListenFinished{ this, "scrobbleListenFinished" }
|
||||
, playbackEnded{ this, "playbackEnded" }
|
||||
, _settingsLoaded{ this, "settingsLoaded" }
|
||||
{
|
||||
addFunction("tr", &Wt::WTemplate::Functions::tr);
|
||||
|
||||
_audioTranscodeResource = std::make_unique<AudioTranscodeResource>();
|
||||
_audioFileResource = std::make_unique<AudioFileResource>();
|
||||
_audioTranscodingResource = std::make_unique<AudioTranscodingResource>();
|
||||
_audioFileResource = std::make_unique<AudioFileResource>();
|
||||
|
||||
_title = bindNew<Wt::WText>("title");
|
||||
_artist = bindNew<Wt::WAnchor>("artist");
|
||||
_release = bindNew<Wt::WAnchor>("release");
|
||||
_separator = bindNew<Wt::WText>("separator");
|
||||
_playQueue = bindNew<Wt::WPushButton>("playqueue-btn", Wt::WString::tr("Lms.MediaPlayer.template.playqueue-btn").arg(0), Wt::TextFormat::XHTML);
|
||||
_playQueue->setLink(Wt::WLink {Wt::LinkType::InternalPath, "/playqueue"});
|
||||
_playQueue->setToolTip(tr("Lms.PlayQueue.playqueue"));
|
||||
_title = bindNew<Wt::WText>("title");
|
||||
_artist = bindNew<Wt::WAnchor>("artist");
|
||||
_release = bindNew<Wt::WAnchor>("release");
|
||||
_separator = bindNew<Wt::WText>("separator");
|
||||
_playQueue = bindNew<Wt::WPushButton>("playqueue-btn", Wt::WString::tr("Lms.MediaPlayer.template.playqueue-btn").arg(0), Wt::TextFormat::XHTML);
|
||||
_playQueue->setLink(Wt::WLink{ Wt::LinkType::InternalPath, "/playqueue" });
|
||||
_playQueue->setToolTip(tr("Lms.PlayQueue.playqueue"));
|
||||
|
||||
_settingsLoaded.connect([this](const std::string& settings)
|
||||
{
|
||||
LMS_LOG(UI, DEBUG) << "Settings loaded! '" << settings << "'";
|
||||
_settingsLoaded.connect([this](const std::string& settings)
|
||||
{
|
||||
LMS_LOG(UI, DEBUG) << "Settings loaded! '" << settings << "'";
|
||||
|
||||
_settings = settingsfromJSString(settings);
|
||||
_settings = settingsfromJSString(settings);
|
||||
|
||||
settingsLoaded.emit();
|
||||
});
|
||||
settingsLoaded.emit();
|
||||
});
|
||||
|
||||
{
|
||||
Settings defaultSettings;
|
||||
{
|
||||
Settings defaultSettings;
|
||||
|
||||
std::ostringstream oss;
|
||||
oss << "LMS.mediaplayer.init("
|
||||
<< jsRef()
|
||||
<< ", defaultSettings = " << settingsToJSString(defaultSettings)
|
||||
<< ")";
|
||||
std::ostringstream oss;
|
||||
oss << "LMS.mediaplayer.init("
|
||||
<< jsRef()
|
||||
<< ", defaultSettings = " << settingsToJSString(defaultSettings)
|
||||
<< ")";
|
||||
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
}
|
||||
}
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaPlayer::loadTrack(Database::TrackId trackId, bool play, float replayGain)
|
||||
{
|
||||
LMS_LOG(UI, DEBUG) << "Playing track ID = " << trackId.toString();
|
||||
void MediaPlayer::loadTrack(Database::TrackId trackId, bool play, float replayGain)
|
||||
{
|
||||
LMS_LOG(UI, DEBUG) << "Playing track ID = " << trackId.toString();
|
||||
|
||||
std::ostringstream oss;
|
||||
{
|
||||
auto transaction {LmsApp->getDbSession().createSharedTransaction()};
|
||||
std::ostringstream oss;
|
||||
{
|
||||
auto transaction{ LmsApp->getDbSession().createSharedTransaction() };
|
||||
|
||||
const auto track {Database::Track::find(LmsApp->getDbSession(), trackId)};
|
||||
if (!track)
|
||||
return;
|
||||
const auto track{ Database::Track::find(LmsApp->getDbSession(), trackId) };
|
||||
if (!track)
|
||||
return;
|
||||
|
||||
const std::string transcodeResource {_audioTranscodeResource->getUrl(trackId)};
|
||||
const std::string nativeResource {_audioFileResource->getUrl(trackId)};
|
||||
const std::string transcodingResource{ _audioTranscodingResource->getUrl(trackId) };
|
||||
const std::string nativeResource{ _audioFileResource->getUrl(trackId) };
|
||||
|
||||
const auto artists {track->getArtists({Database::TrackArtistLinkType::Artist})};
|
||||
const auto artists{ track->getArtists({Database::TrackArtistLinkType::Artist}) };
|
||||
|
||||
oss
|
||||
<< "var params = {"
|
||||
<< " trackId :\"" << trackId.toString() << "\","
|
||||
<< " nativeResource: \"" << nativeResource << "\","
|
||||
<< " transcodeResource: \"" << transcodeResource << "\","
|
||||
<< " duration: " << std::chrono::duration_cast<std::chrono::seconds>(track->getDuration()).count() << ","
|
||||
<< " replayGain: " << replayGain << ","
|
||||
<< " title: \"" << StringUtils::jsEscape(track->getName()) << "\","
|
||||
<< " artist: \"" << (!artists.empty() ? StringUtils::jsEscape(artists.front()->getName()) : "") << "\","
|
||||
<< " release: \"" << (track->getRelease() ? StringUtils::jsEscape(track->getRelease()->getName()) : "") << "\","
|
||||
<< " artwork: ["
|
||||
<< " { src: \"" << LmsApp->getCoverResource()->getTrackUrl(trackId, CoverResource::Size::Small) << "\", sizes: \"128x128\", type: \"image/jpeg\" },"
|
||||
<< " { src: \"" << LmsApp->getCoverResource()->getTrackUrl(trackId, CoverResource::Size::Large) << "\", sizes: \"512x512\", type: \"image/jpeg\" },"
|
||||
<< " ]"
|
||||
<< "};";
|
||||
oss << "LMS.mediaplayer.loadTrack(params, " << (play ? "true" : "false") << ")"; // true to autoplay
|
||||
oss
|
||||
<< "var params = {"
|
||||
<< " trackId :\"" << trackId.toString() << "\","
|
||||
<< " nativeResource: \"" << nativeResource << "\","
|
||||
<< " transcodingResource: \"" << transcodingResource << "\","
|
||||
<< " duration: " << std::chrono::duration_cast<std::chrono::seconds>(track->getDuration()).count() << ","
|
||||
<< " replayGain: " << replayGain << ","
|
||||
<< " title: \"" << StringUtils::jsEscape(track->getName()) << "\","
|
||||
<< " artist: \"" << (!artists.empty() ? StringUtils::jsEscape(artists.front()->getName()) : "") << "\","
|
||||
<< " release: \"" << (track->getRelease() ? StringUtils::jsEscape(track->getRelease()->getName()) : "") << "\","
|
||||
<< " artwork: ["
|
||||
<< " { src: \"" << LmsApp->getCoverResource()->getTrackUrl(trackId, CoverResource::Size::Small) << "\", sizes: \"128x128\", type: \"image/jpeg\" },"
|
||||
<< " { src: \"" << LmsApp->getCoverResource()->getTrackUrl(trackId, CoverResource::Size::Large) << "\", sizes: \"512x512\", type: \"image/jpeg\" },"
|
||||
<< " ]"
|
||||
<< "};";
|
||||
// Update 'sizes' above to match this:
|
||||
static_assert(static_cast<std::underlying_type_t<CoverResource::Size>>(CoverResource::Size::Small) == 128);
|
||||
static_assert(static_cast<std::underlying_type_t<CoverResource::Size>>(CoverResource::Size::Large) == 512);
|
||||
oss << "LMS.mediaplayer.loadTrack(params, " << (play ? "true" : "false") << ")"; // true to autoplay
|
||||
|
||||
_title->setTextFormat(Wt::TextFormat::Plain);
|
||||
_title->setText(Wt::WString::fromUTF8(track->getName()));
|
||||
_title->setTextFormat(Wt::TextFormat::Plain);
|
||||
_title->setText(Wt::WString::fromUTF8(track->getName()));
|
||||
|
||||
bool needSeparator {true};
|
||||
bool needSeparator{ true };
|
||||
|
||||
if (!artists.empty())
|
||||
{
|
||||
_artist->setTextFormat(Wt::TextFormat::Plain);
|
||||
_artist->setText(Wt::WString::fromUTF8(artists.front()->getName()));
|
||||
_artist->setLink(Utils::createArtistLink(artists.front()));
|
||||
}
|
||||
else
|
||||
{
|
||||
_artist->setText("");
|
||||
_artist->setLink({});
|
||||
needSeparator = false;
|
||||
}
|
||||
if (!artists.empty())
|
||||
{
|
||||
_artist->setTextFormat(Wt::TextFormat::Plain);
|
||||
_artist->setText(Wt::WString::fromUTF8(artists.front()->getName()));
|
||||
_artist->setLink(Utils::createArtistLink(artists.front()));
|
||||
}
|
||||
else
|
||||
{
|
||||
_artist->setText("");
|
||||
_artist->setLink({});
|
||||
needSeparator = false;
|
||||
}
|
||||
|
||||
if (track->getRelease())
|
||||
{
|
||||
_release->setTextFormat(Wt::TextFormat::Plain);
|
||||
_release->setText(Wt::WString::fromUTF8(track->getRelease()->getName()));
|
||||
_release->setLink(Utils::createReleaseLink(track->getRelease()));
|
||||
}
|
||||
else
|
||||
{
|
||||
_release->setText("");
|
||||
_release->setLink({});
|
||||
needSeparator = false;
|
||||
}
|
||||
if (track->getRelease())
|
||||
{
|
||||
_release->setTextFormat(Wt::TextFormat::Plain);
|
||||
_release->setText(Wt::WString::fromUTF8(track->getRelease()->getName()));
|
||||
_release->setLink(Utils::createReleaseLink(track->getRelease()));
|
||||
}
|
||||
else
|
||||
{
|
||||
_release->setText("");
|
||||
_release->setLink({});
|
||||
needSeparator = false;
|
||||
}
|
||||
|
||||
if (needSeparator)
|
||||
_separator->setText(" — ");
|
||||
else
|
||||
_separator->setText("");
|
||||
}
|
||||
if (needSeparator)
|
||||
_separator->setText(" — ");
|
||||
else
|
||||
_separator->setText("");
|
||||
}
|
||||
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
|
||||
_trackIdLoaded = trackId;
|
||||
trackLoaded.emit(*_trackIdLoaded);
|
||||
}
|
||||
_trackIdLoaded = trackId;
|
||||
trackLoaded.emit(*_trackIdLoaded);
|
||||
}
|
||||
|
||||
void
|
||||
MediaPlayer::stop()
|
||||
{
|
||||
doJavaScript("LMS.mediaplayer.stop()");
|
||||
}
|
||||
void MediaPlayer::stop()
|
||||
{
|
||||
doJavaScript("LMS.mediaplayer.stop()");
|
||||
}
|
||||
|
||||
void
|
||||
MediaPlayer::setSettings(const Settings& settings)
|
||||
{
|
||||
_settings = settings;
|
||||
void MediaPlayer::setSettings(const Settings& settings)
|
||||
{
|
||||
_settings = settings;
|
||||
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << "LMS.mediaplayer.setSettings(settings = " << settingsToJSString(settings) << ")";
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << "LMS.mediaplayer.setSettings(settings = " << settingsToJSString(settings) << ")";
|
||||
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
}
|
||||
}
|
||||
LMS_LOG(UI, DEBUG) << "Running js = '" << oss.str() << "'";
|
||||
doJavaScript(oss.str());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
MediaPlayer::onPlayQueueUpdated(std::size_t trackCount)
|
||||
{
|
||||
_playQueue->setText(Wt::WString::tr("Lms.MediaPlayer.template.playqueue-btn").arg(trackCount));
|
||||
}
|
||||
void MediaPlayer::onPlayQueueUpdated(std::size_t trackCount)
|
||||
{
|
||||
_playQueue->setText(Wt::WString::tr("Lms.MediaPlayer.template.playqueue-btn").arg(trackCount));
|
||||
}
|
||||
|
||||
} // namespace UserInterface
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
namespace UserInterface
|
||||
{
|
||||
class AudioFileResource;
|
||||
class AudioTranscodeResource;
|
||||
class AudioTranscodingResource;
|
||||
|
||||
class MediaPlayer : public Wt::WTemplate
|
||||
{
|
||||
@@ -47,7 +47,7 @@ namespace UserInterface
|
||||
|
||||
struct Settings
|
||||
{
|
||||
struct Transcode
|
||||
struct Transcoding
|
||||
{
|
||||
enum class Mode
|
||||
{
|
||||
@@ -84,16 +84,14 @@ namespace UserInterface
|
||||
Gain preAmpGainIfNoInfo{ defaultPreAmpGain };
|
||||
};
|
||||
|
||||
Transcode transcode;
|
||||
Transcoding transcoding;
|
||||
ReplayGain replayGain;
|
||||
};
|
||||
|
||||
MediaPlayer();
|
||||
|
||||
~MediaPlayer() = default;
|
||||
MediaPlayer(const MediaPlayer&) = delete;
|
||||
MediaPlayer(MediaPlayer&&) = delete;
|
||||
MediaPlayer& operator=(const MediaPlayer&) = delete;
|
||||
MediaPlayer& operator=(MediaPlayer&&) = delete;
|
||||
|
||||
std::optional<Database::TrackId> getTrackLoaded() const { return _trackIdLoaded; }
|
||||
|
||||
@@ -118,7 +116,7 @@ namespace UserInterface
|
||||
|
||||
private:
|
||||
std::unique_ptr<AudioFileResource> _audioFileResource;
|
||||
std::unique_ptr<AudioTranscodeResource> _audioTranscodeResource;
|
||||
std::unique_ptr<AudioTranscodingResource> _audioTranscodingResource;
|
||||
|
||||
std::optional<Database::TrackId> _trackIdLoaded;
|
||||
std::optional<Settings> _settings;
|
||||
|
||||
+58
-58
@@ -44,23 +44,23 @@
|
||||
#include "LmsApplication.hpp"
|
||||
#include "MediaPlayer.hpp"
|
||||
|
||||
namespace UserInterface {
|
||||
|
||||
namespace UserInterface
|
||||
{
|
||||
using namespace Database;
|
||||
|
||||
class SettingsModel : public Wt::WFormModel
|
||||
{
|
||||
public:
|
||||
// Associate each field with a unique string literal.
|
||||
static inline const Field TranscodeModeField{ "transcode-mode" };
|
||||
static inline const Field TranscodeFormatField{ "transcode-format" };
|
||||
static inline const Field TranscodeBitrateField{ "transcode-bitrate" };
|
||||
static inline const Field TranscodingModeField{ "transcoding-mode" };
|
||||
static inline const Field TranscodeFormatField{ "transcoding-output-format" };
|
||||
static inline const Field TranscodeBitrateField{ "transcoding-output-bitrate" };
|
||||
static inline const Field ReplayGainModeField{ "replaygain-mode" };
|
||||
static inline const Field ReplayGainPreAmpGainField{ "replaygain-preamp" };
|
||||
static inline const Field ReplayGainPreAmpGainIfNoInfoField{ "replaygain-preamp-no-rg-info" };
|
||||
static inline const Field SubsonicArtistListModeField{ "subsonic-artist-list-mode" };
|
||||
static inline const Field SubsonicTranscodingOutputFormatField{ "subsonic-transcode-format" };
|
||||
static inline const Field SubsonicTranscodingOutputBitrateField{ "subsonic-transcode-bitrate" };
|
||||
static inline const Field SubsonicTranscodingOutputFormatField{ "subsonic-transcoding-output-format" };
|
||||
static inline const Field SubsonicTranscodingOutputBitrateField{ "subsonic-transcoding-output-bitrate" };
|
||||
static inline const Field FeedbackBackendField{ "feedback-backend" };
|
||||
static inline const Field ScrobblingBackendField{ "scrobbling-backend" };
|
||||
static inline const Field ListenBrainzTokenField{ "listenbrainz-token" };
|
||||
@@ -68,7 +68,7 @@ namespace UserInterface {
|
||||
static inline const Field PasswordField{ "password" };
|
||||
static inline const Field PasswordConfirmField{ "password-confirm" };
|
||||
|
||||
using TranscodingModeModel = ValueStringModel<MediaPlayer::Settings::Transcode::Mode>;
|
||||
using TranscodingModeModel = ValueStringModel<MediaPlayer::Settings::Transcoding::Mode>;
|
||||
using ReplayGainModeModel = ValueStringModel<MediaPlayer::Settings::ReplayGain::Mode>;
|
||||
using FeedbackBackendModel = ValueStringModel<FeedbackBackend>;
|
||||
using ScrobblingBackendModel = ValueStringModel<ScrobblingBackend>;
|
||||
@@ -79,7 +79,7 @@ namespace UserInterface {
|
||||
{
|
||||
initializeModels();
|
||||
|
||||
addField(TranscodeModeField);
|
||||
addField(TranscodingModeField);
|
||||
addField(TranscodeBitrateField);
|
||||
addField(TranscodeFormatField);
|
||||
addField(ReplayGainModeField);
|
||||
@@ -105,7 +105,7 @@ namespace UserInterface {
|
||||
addField(PasswordConfirmField);
|
||||
}
|
||||
|
||||
setValidator(TranscodeModeField, createMandatoryValidator());
|
||||
setValidator(TranscodingModeField, createMandatoryValidator());
|
||||
setValidator(TranscodeBitrateField, createMandatoryValidator());
|
||||
setValidator(TranscodeFormatField, createMandatoryValidator());
|
||||
setValidator(ReplayGainModeField, createMandatoryValidator());
|
||||
@@ -124,7 +124,7 @@ namespace UserInterface {
|
||||
|
||||
std::shared_ptr<TranscodingModeModel> getTranscodingModeModel() { return _transcodingModeModeModel; }
|
||||
std::shared_ptr<Wt::WAbstractItemModel> getTranscodingOutputBitrateModel() { return _transcodingOutputBitrateModel; }
|
||||
std::shared_ptr<Wt::WAbstractItemModel> getTranscodeFormatModel() { return _transcodingOutputFormatModel; }
|
||||
std::shared_ptr<Wt::WAbstractItemModel> getTranscodingOutputFormatModel() { return _transcodingOutputFormatModel; }
|
||||
std::shared_ptr<ReplayGainModeModel> getReplayGainModeModel() { return _replayGainModeModel; }
|
||||
std::shared_ptr<Wt::WAbstractItemModel> getSubsonicArtistListModeModel() { return _subsonicArtistListModeModel; }
|
||||
std::shared_ptr<FeedbackBackendModel> getFeedbackBackendModel() { return _feedbackBackendModel; }
|
||||
@@ -139,17 +139,17 @@ namespace UserInterface {
|
||||
{
|
||||
MediaPlayer::Settings settings;
|
||||
|
||||
auto transcodeModeRow{ _transcodingModeModeModel->getRowFromString(valueText(TranscodeModeField)) };
|
||||
if (transcodeModeRow)
|
||||
settings.transcode.mode = _transcodingModeModeModel->getValue(*transcodeModeRow);
|
||||
auto transcodingModeRow{ _transcodingModeModeModel->getRowFromString(valueText(TranscodingModeField)) };
|
||||
if (transcodingModeRow)
|
||||
settings.transcoding.mode = _transcodingModeModeModel->getValue(*transcodingModeRow);
|
||||
|
||||
auto transcodeFormatRow{ _transcodingOutputFormatModel->getRowFromString(valueText(TranscodeFormatField)) };
|
||||
if (transcodeFormatRow)
|
||||
settings.transcode.format = _transcodingOutputFormatModel->getValue(*transcodeFormatRow);
|
||||
auto transcodingOutputFormatRow{ _transcodingOutputFormatModel->getRowFromString(valueText(TranscodeFormatField)) };
|
||||
if (transcodingOutputFormatRow)
|
||||
settings.transcoding.format = _transcodingOutputFormatModel->getValue(*transcodingOutputFormatRow);
|
||||
|
||||
auto transcodeBitrateRow{ _transcodingOutputBitrateModel->getRowFromString(valueText(TranscodeBitrateField)) };
|
||||
if (transcodeBitrateRow)
|
||||
settings.transcode.bitrate = _transcodingOutputBitrateModel->getValue(*transcodeBitrateRow);
|
||||
auto transcodingOutputBitrateRow{ _transcodingOutputBitrateModel->getRowFromString(valueText(TranscodeBitrateField)) };
|
||||
if (transcodingOutputBitrateRow)
|
||||
settings.transcoding.bitrate = _transcodingOutputBitrateModel->getValue(*transcodingOutputBitrateRow);
|
||||
|
||||
auto replayGainModeRow{ _replayGainModeModel->getRowFromString(valueText(ReplayGainModeField)) };
|
||||
if (replayGainModeRow)
|
||||
@@ -205,22 +205,22 @@ namespace UserInterface {
|
||||
{
|
||||
const auto settings{ *LmsApp->getMediaPlayer().getSettings() };
|
||||
|
||||
auto transcodeModeRow{ _transcodingModeModeModel->getRowFromValue(settings.transcode.mode) };
|
||||
if (transcodeModeRow)
|
||||
setValue(TranscodeModeField, _transcodingModeModeModel->getString(*transcodeModeRow));
|
||||
auto transcodingModeRow{ _transcodingModeModeModel->getRowFromValue(settings.transcoding.mode) };
|
||||
if (transcodingModeRow)
|
||||
setValue(TranscodingModeField, _transcodingModeModeModel->getString(*transcodingModeRow));
|
||||
|
||||
auto transcodeFormatRow{ _transcodingOutputFormatModel->getRowFromValue(settings.transcode.format) };
|
||||
if (transcodeFormatRow)
|
||||
setValue(TranscodeFormatField, _transcodingOutputFormatModel->getString(*transcodeFormatRow));
|
||||
auto transcodingOutputFormatRow{ _transcodingOutputFormatModel->getRowFromValue(settings.transcoding.format) };
|
||||
if (transcodingOutputFormatRow)
|
||||
setValue(TranscodeFormatField, _transcodingOutputFormatModel->getString(*transcodingOutputFormatRow));
|
||||
|
||||
auto transcodeBitrateRow{ _transcodingOutputBitrateModel->getRowFromValue(settings.transcode.bitrate) };
|
||||
if (transcodeBitrateRow)
|
||||
setValue(TranscodeBitrateField, _transcodingOutputBitrateModel->getString(*transcodeBitrateRow));
|
||||
auto transcodingOutputBitrateRow{ _transcodingOutputBitrateModel->getRowFromValue(settings.transcoding.bitrate) };
|
||||
if (transcodingOutputBitrateRow)
|
||||
setValue(TranscodeBitrateField, _transcodingOutputBitrateModel->getString(*transcodingOutputBitrateRow));
|
||||
|
||||
{
|
||||
const bool usesTranscode{ settings.transcode.mode != MediaPlayer::Settings::Transcode::Mode::Never };
|
||||
setReadOnly(SettingsModel::TranscodeFormatField, !usesTranscode);
|
||||
setReadOnly(SettingsModel::TranscodeBitrateField, !usesTranscode);
|
||||
const bool useTranscoding{ settings.transcoding.mode != MediaPlayer::Settings::Transcoding::Mode::Never };
|
||||
setReadOnly(SettingsModel::TranscodeFormatField, !useTranscoding);
|
||||
setReadOnly(SettingsModel::TranscodeBitrateField, !useTranscoding);
|
||||
}
|
||||
|
||||
auto replayGainModeRow{ _replayGainModeModel->getRowFromValue(settings.replayGain.mode) };
|
||||
@@ -316,9 +316,9 @@ namespace UserInterface {
|
||||
void initializeModels()
|
||||
{
|
||||
_transcodingModeModeModel = std::make_shared<TranscodingModeModel>();
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcode-mode.always"), MediaPlayer::Settings::Transcode::Mode::Always);
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcode-mode.never"), MediaPlayer::Settings::Transcode::Mode::Never);
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcode-mode.if-format-not-supported"), MediaPlayer::Settings::Transcode::Mode::IfFormatNotSupported);
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.always"), MediaPlayer::Settings::Transcoding::Mode::Always);
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.never"), MediaPlayer::Settings::Transcoding::Mode::Never);
|
||||
_transcodingModeModeModel->add(Wt::WString::tr("Lms.Settings.transcoding-mode.if-format-not-supported"), MediaPlayer::Settings::Transcoding::Mode::IfFormatNotSupported);
|
||||
|
||||
_transcodingOutputBitrateModel = std::make_shared<ValueStringModel<Bitrate>>();
|
||||
visitAllowedAudioBitrates([&](const Bitrate bitrate)
|
||||
@@ -327,11 +327,11 @@ namespace UserInterface {
|
||||
});
|
||||
|
||||
_transcodingOutputFormatModel = std::make_shared<ValueStringModel<TranscodingOutputFormat>>();
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcode-format.mp3"), TranscodingOutputFormat::MP3);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcode-format.ogg_opus"), TranscodingOutputFormat::OGG_OPUS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcode-format.matroska_opus"), TranscodingOutputFormat::MATROSKA_OPUS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcode-format.ogg_vorbis"), TranscodingOutputFormat::OGG_VORBIS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcode-format.webm_vorbis"), TranscodingOutputFormat::WEBM_VORBIS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.mp3"), TranscodingOutputFormat::MP3);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_opus"), TranscodingOutputFormat::OGG_OPUS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.matroska_opus"), TranscodingOutputFormat::MATROSKA_OPUS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.ogg_vorbis"), TranscodingOutputFormat::OGG_VORBIS);
|
||||
_transcodingOutputFormatModel->add(Wt::WString::tr("Lms.Settings.transcoding-output-format.webm_vorbis"), TranscodingOutputFormat::WEBM_VORBIS);
|
||||
|
||||
_replayGainModeModel = std::make_shared<ReplayGainModeModel>();
|
||||
_replayGainModeModel->add(Wt::WString::tr("Lms.Settings.replaygain-mode.none"), MediaPlayer::Settings::ReplayGain::Mode::None);
|
||||
@@ -431,24 +431,24 @@ namespace UserInterface {
|
||||
// Audio
|
||||
{
|
||||
// Transcode
|
||||
auto transcodeMode{ std::make_unique<Wt::WComboBox>() };
|
||||
auto* transcodeModeRaw{ transcodeMode.get() };
|
||||
transcodeMode->setModel(model->getTranscodingModeModel());
|
||||
t->setFormWidget(SettingsModel::TranscodeModeField, std::move(transcodeMode));
|
||||
auto transcodingMode{ std::make_unique<Wt::WComboBox>() };
|
||||
auto* transcodingModeRaw{ transcodingMode.get() };
|
||||
transcodingMode->setModel(model->getTranscodingModeModel());
|
||||
t->setFormWidget(SettingsModel::TranscodingModeField, std::move(transcodingMode));
|
||||
|
||||
// Format
|
||||
auto transcodeFormat{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodeFormat->setModel(model->getTranscodeFormatModel());
|
||||
t->setFormWidget(SettingsModel::TranscodeFormatField, std::move(transcodeFormat));
|
||||
auto transcodingOutputFormat{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodingOutputFormat->setModel(model->getTranscodingOutputFormatModel());
|
||||
t->setFormWidget(SettingsModel::TranscodeFormatField, std::move(transcodingOutputFormat));
|
||||
|
||||
// Bitrate
|
||||
auto transcodeBitrate{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodeBitrate->setModel(model->getTranscodingOutputBitrateModel());
|
||||
t->setFormWidget(SettingsModel::TranscodeBitrateField, std::move(transcodeBitrate));
|
||||
auto transcodingOutputBitrate{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodingOutputBitrate->setModel(model->getTranscodingOutputBitrateModel());
|
||||
t->setFormWidget(SettingsModel::TranscodeBitrateField, std::move(transcodingOutputBitrate));
|
||||
|
||||
transcodeModeRaw->activated().connect([=](int row)
|
||||
transcodingModeRaw->activated().connect([=](int row)
|
||||
{
|
||||
const bool enable{ model->getTranscodingModeModel()->getValue(row) != MediaPlayer::Settings::Transcode::Mode::Never };
|
||||
const bool enable{ model->getTranscodingModeModel()->getValue(row) != MediaPlayer::Settings::Transcoding::Mode::Never };
|
||||
model->setReadOnly(SettingsModel::TranscodeFormatField, !enable);
|
||||
model->setReadOnly(SettingsModel::TranscodeBitrateField, !enable);
|
||||
t->updateModel(model.get());
|
||||
@@ -491,14 +491,14 @@ namespace UserInterface {
|
||||
t->setCondition("if-has-subsonic-api", Service<IConfig>::get()->getBool("api-subsonic", true));
|
||||
|
||||
// Format
|
||||
auto transcodeFormat{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodeFormat->setModel(model->getTranscodeFormatModel());
|
||||
t->setFormWidget(SettingsModel::SubsonicTranscodingOutputFormatField, std::move(transcodeFormat));
|
||||
auto transcodingOutputFormat{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodingOutputFormat->setModel(model->getTranscodingOutputFormatModel());
|
||||
t->setFormWidget(SettingsModel::SubsonicTranscodingOutputFormatField, std::move(transcodingOutputFormat));
|
||||
|
||||
// Bitrate
|
||||
auto transcodeBitrate{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodeBitrate->setModel(model->getTranscodingOutputBitrateModel());
|
||||
t->setFormWidget(SettingsModel::SubsonicTranscodingOutputBitrateField, std::move(transcodeBitrate));
|
||||
auto transcodingOutputBitrate{ std::make_unique<Wt::WComboBox>() };
|
||||
transcodingOutputBitrate->setModel(model->getTranscodingOutputBitrateModel());
|
||||
t->setFormWidget(SettingsModel::SubsonicTranscodingOutputBitrateField, std::move(transcodingOutputBitrate));
|
||||
|
||||
// Artist list mode
|
||||
auto artistListMode{ std::make_unique<Wt::WComboBox>() };
|
||||
|
||||
+4
-4
@@ -17,7 +17,7 @@
|
||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "AudioTranscodeResource.hpp"
|
||||
#include "AudioTranscodingResource.hpp"
|
||||
|
||||
#include <optional>
|
||||
#include <Wt/Http/Response.h>
|
||||
@@ -159,17 +159,17 @@ namespace UserInterface
|
||||
}
|
||||
}
|
||||
|
||||
AudioTranscodeResource:: ~AudioTranscodeResource()
|
||||
AudioTranscodingResource:: ~AudioTranscodingResource()
|
||||
{
|
||||
beingDeleted();
|
||||
}
|
||||
|
||||
std::string AudioTranscodeResource::getUrl(Database::TrackId trackId) const
|
||||
std::string AudioTranscodingResource::getUrl(Database::TrackId trackId) const
|
||||
{
|
||||
return url() + "&trackid=" + trackId.toString();
|
||||
}
|
||||
|
||||
void AudioTranscodeResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
||||
void AudioTranscodingResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response)
|
||||
{
|
||||
std::shared_ptr<IResourceHandler> resourceHandler;
|
||||
|
||||
+2
-2
@@ -31,10 +31,10 @@ namespace Database
|
||||
|
||||
namespace UserInterface
|
||||
{
|
||||
class AudioTranscodeResource : public Wt::WResource
|
||||
class AudioTranscodingResource : public Wt::WResource
|
||||
{
|
||||
public:
|
||||
~AudioTranscodeResource();
|
||||
~AudioTranscodingResource();
|
||||
|
||||
// Url depends on the user since settings are used in parameters
|
||||
std::string getUrl(Database::TrackId trackId) const;
|
||||
Reference in New Issue
Block a user