diff --git a/approot/messages_zh.xml b/approot/messages_zh.xml index 23e0e3a0..16a9eed2 100644 --- a/approot/messages_zh.xml +++ b/approot/messages_zh.xml @@ -218,5 +218,3 @@ 此字段不能为空 这个值应该在 {1} 和 {2} - - diff --git a/src/libs/av/impl/TranscodeResourceHandler.cpp b/src/libs/av/impl/TranscodeResourceHandler.cpp index 7cbd99c6..6554999c 100644 --- a/src/libs/av/impl/TranscodeResourceHandler.cpp +++ b/src/libs/av/impl/TranscodeResourceHandler.cpp @@ -33,7 +33,6 @@ namespace Av TranscodeResourceHandler::TranscodeResourceHandler(const std::filesystem::path& trackPath, const TranscodeParameters& parameters) : _transcoder {trackPath, parameters} { - _transcoder.start(); } Wt::Http::ResponseContinuation* diff --git a/src/libs/av/impl/Transcoder.cpp b/src/libs/av/impl/Transcoder.cpp index caf719ba..7efa0442 100644 --- a/src/libs/av/impl/Transcoder.cpp +++ b/src/libs/av/impl/Transcoder.cpp @@ -48,11 +48,12 @@ Transcoder::Transcoder(const std::filesystem::path& filePath, const TranscodePar , _filePath {filePath} , _parameters {parameters} { + start(); } Transcoder::~Transcoder() = default; -bool +void Transcoder::start() { if (ffmpegPath.empty()) @@ -61,20 +62,13 @@ Transcoder::start() try { if (!std::filesystem::exists(_filePath)) - { - LOG(ERROR) << "File '" << _filePath << "' does not exist!"; - return false; - } + throw Exception {"File '" + _filePath.string() + "' does not exist!"}; else if (!std::filesystem::is_regular_file( _filePath) ) - { - LOG(ERROR) << "File '" << _filePath << "' is not regular!"; - return false; - } + throw Exception {"File '" + _filePath.string() + "' is not regular!"}; } catch (const std::filesystem::filesystem_error& e) { - LOG(ERROR) << "File error on '" << _filePath.string() << "': " << e.what(); - return false; + throw Exception {"File error '" + _filePath.string() + "': " + e.what()}; } LOG(INFO) << "Transcoding file '" << _filePath.string() << "'"; @@ -163,7 +157,7 @@ Transcoder::start() break; default: - return false; + throw Exception {"Unhandled format (" + std::to_string(static_cast(_parameters.format)) + ")"}; } _outputMimeType = formatToMimetype(_parameters.format); @@ -181,11 +175,8 @@ Transcoder::start() } catch (ChildProcessException& exception) { - LOG(ERROR) << "Cannot execute '" << ffmpegPath << "': " << exception.what(); - return false; + throw Exception {"Cannot execute '" + ffmpegPath.string() + "': " + exception.what()}; } - - return true; } void @@ -223,6 +214,8 @@ Transcoder::readSome(std::byte* buffer, std::size_t bufferSize) bool Transcoder::finished() const { + assert(_childProcess); + return _childProcess->finished(); } diff --git a/src/libs/av/impl/Transcoder.hpp b/src/libs/av/impl/Transcoder.hpp index aa9ace31..0ebb9179 100644 --- a/src/libs/av/impl/Transcoder.hpp +++ b/src/libs/av/impl/Transcoder.hpp @@ -40,8 +40,6 @@ namespace Av Transcoder(Transcoder&&) = delete; Transcoder& operator=(Transcoder&&) = delete; - bool start(); - using WaitCallback = std::function; void asyncWaitForData(WaitCallback cb); @@ -58,6 +56,8 @@ namespace Av private: static void init(); + void start(); + const std::size_t _id {}; const std::filesystem::path _filePath; const TranscodeParameters _parameters; diff --git a/src/libs/scrobbling/impl/IScrobbler.hpp b/src/libs/scrobbling/impl/IScrobbler.hpp index 7587ce0e..840d24ef 100644 --- a/src/libs/scrobbling/impl/IScrobbler.hpp +++ b/src/libs/scrobbling/impl/IScrobbler.hpp @@ -19,8 +19,9 @@ #pragma once +#include #include -#include +#include #include diff --git a/src/libs/scrobbling/impl/listenbrainz/ListenBrainzScrobbler.hpp b/src/libs/scrobbling/impl/listenbrainz/ListenBrainzScrobbler.hpp index 80c50fb2..690a7afc 100644 --- a/src/libs/scrobbling/impl/listenbrainz/ListenBrainzScrobbler.hpp +++ b/src/libs/scrobbling/impl/listenbrainz/ListenBrainzScrobbler.hpp @@ -19,9 +19,7 @@ #pragma once -#include #include -#include #include #include diff --git a/src/libs/scrobbling/include/scrobbling/IScrobbling.hpp b/src/libs/scrobbling/include/scrobbling/IScrobbling.hpp index 7b46436b..376ad085 100644 --- a/src/libs/scrobbling/include/scrobbling/IScrobbling.hpp +++ b/src/libs/scrobbling/include/scrobbling/IScrobbling.hpp @@ -21,9 +21,9 @@ #include #include -#include +#include #include -#include +#include #include diff --git a/src/libs/subsonic/impl/Stream.cpp b/src/libs/subsonic/impl/Stream.cpp index 29085c83..911b1514 100644 --- a/src/libs/subsonic/impl/Stream.cpp +++ b/src/libs/subsonic/impl/Stream.cpp @@ -26,6 +26,7 @@ #include "database/Track.hpp" #include "database/User.hpp" #include "utils/IResourceHandler.hpp" +#include "utils/Logger.hpp" #include "utils/FileResourceHandlerCreator.hpp" #include "utils/Utils.hpp" #include "ParameterParsing.hpp" @@ -147,24 +148,30 @@ handleStream(RequestContext& context, const Wt::Http::Request& request, Wt::Http { std::shared_ptr resourceHandler; - Wt::Http::ResponseContinuation* continuation = request.continuation(); - if (!continuation) + try { - StreamParameters streamParameters {getStreamParameters(context)}; - if (streamParameters.transcodeParameters) - resourceHandler = Av::createTranscodeResourceHandler(streamParameters.trackPath, *streamParameters.transcodeParameters); + Wt::Http::ResponseContinuation* continuation = request.continuation(); + if (!continuation) + { + StreamParameters streamParameters {getStreamParameters(context)}; + if (streamParameters.transcodeParameters) + resourceHandler = Av::createTranscodeResourceHandler(streamParameters.trackPath, *streamParameters.transcodeParameters); + else + resourceHandler = createFileResourceHandler(streamParameters.trackPath); + } else - resourceHandler = createFileResourceHandler(streamParameters.trackPath); + { + resourceHandler = Wt::cpp17::any_cast>(continuation->data()); + } + + continuation = resourceHandler->processRequest(request, response); + if (continuation) + continuation->setData(resourceHandler); } - else + catch (const Av::Exception& e) { - resourceHandler = Wt::cpp17::any_cast>(continuation->data()); + LMS_LOG(API_SUBSONIC, ERROR) << "Caught Av exception: " << e.what(); } - - continuation = resourceHandler->processRequest(request, response); - if (continuation) - continuation->setData(resourceHandler); -} - } +} // namespace API::Subsonic::Stream diff --git a/src/libs/utils/impl/ChildProcess.cpp b/src/libs/utils/impl/ChildProcess.cpp index 82f319fc..ae0ae91b 100644 --- a/src/libs/utils/impl/ChildProcess.cpp +++ b/src/libs/utils/impl/ChildProcess.cpp @@ -69,13 +69,15 @@ ChildProcess::ChildProcess(boost::asio::io_context& ioContext, const std::filesy throw SystemException {errno, "pipe2 failed!"}; { - const std::size_t pipeSize {65536*8}; +#if defined(__linux__) && defined(F_SETPIPE_SZ) + // Just a hint here to prevent the writer from writing too many bytes ahead of the reader + constexpr std::size_t pipeSize {65536*4}; if (fcntl(pipe[0], F_SETPIPE_SZ, pipeSize) == -1) throw SystemException {errno, "fcntl failed!"}; - if (fcntl(pipe[1], F_SETPIPE_SZ, pipeSize) == -1) throw SystemException {errno, "fcntl failed!"}; +#endif } res = fork(); diff --git a/src/lms/ui/resource/AudioTranscodeResource.cpp b/src/lms/ui/resource/AudioTranscodeResource.cpp index 818eb67a..f20a159c 100644 --- a/src/lms/ui/resource/AudioTranscodeResource.cpp +++ b/src/lms/ui/resource/AudioTranscodeResource.cpp @@ -180,23 +180,30 @@ AudioTranscodeResource::handleRequest(const Wt::Http::Request& request, { std::shared_ptr resourceHandler; - Wt::Http::ResponseContinuation* continuation {request.continuation()}; - if (!continuation) + try { - const std::optional& parameters {readTranscodeParameters(request)}; - if (parameters) - resourceHandler = Av::createTranscodeResourceHandler(parameters->file, parameters->transcodeParameters); - } - else - { - resourceHandler = Wt::cpp17::any_cast>(continuation->data()); - } + Wt::Http::ResponseContinuation* continuation {request.continuation()}; + if (!continuation) + { + const std::optional& parameters {readTranscodeParameters(request)}; + if (parameters) + resourceHandler = Av::createTranscodeResourceHandler(parameters->file, parameters->transcodeParameters); + } + else + { + resourceHandler = Wt::cpp17::any_cast>(continuation->data()); + } - if (resourceHandler) + if (resourceHandler) + { + continuation = resourceHandler->processRequest(request, response); + if (continuation) + continuation->setData(resourceHandler); + } + } + catch (const Av::Exception& e) { - continuation = resourceHandler->processRequest(request, response); - if (continuation) - continuation->setData(resourceHandler); + LOG(ERROR) << "Caught Av exception: " << e.what(); } }