Skip to content

Commit

Permalink
Merge branch 'develop' for release v3.25.1
Browse files Browse the repository at this point in the history
  • Loading branch information
epoupon committed Apr 27, 2021
2 parents 06fbda9 + 7a6ee6f commit c4a1bf8
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 56 deletions.
2 changes: 0 additions & 2 deletions approot/messages_zh.xml
Original file line number Diff line number Diff line change
Expand Up @@ -218,5 +218,3 @@
<message id="Wt.WValidator.Invalid">此字段不能为空</message>
<message id="Wt.WDoubleValidator.BadRange">这个值应该在 {1} 和 {2}</message>
</messages>

</messages>
1 change: 0 additions & 1 deletion src/libs/av/impl/TranscodeResourceHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ namespace Av
TranscodeResourceHandler::TranscodeResourceHandler(const std::filesystem::path& trackPath, const TranscodeParameters& parameters)
: _transcoder {trackPath, parameters}
{
_transcoder.start();
}

Wt::Http::ResponseContinuation*
Expand Down
25 changes: 9 additions & 16 deletions src/libs/av/impl/Transcoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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() << "'";
Expand Down Expand Up @@ -163,7 +157,7 @@ Transcoder::start()
break;

default:
return false;
throw Exception {"Unhandled format (" + std::to_string(static_cast<int>(_parameters.format)) + ")"};
}

_outputMimeType = formatToMimetype(_parameters.format);
Expand All @@ -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
Expand Down Expand Up @@ -223,6 +214,8 @@ Transcoder::readSome(std::byte* buffer, std::size_t bufferSize)
bool
Transcoder::finished() const
{
assert(_childProcess);

return _childProcess->finished();
}

Expand Down
4 changes: 2 additions & 2 deletions src/libs/av/impl/Transcoder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ namespace Av
Transcoder(Transcoder&&) = delete;
Transcoder& operator=(Transcoder&&) = delete;

bool start();

using WaitCallback = std::function<void()>;
void asyncWaitForData(WaitCallback cb);

Expand All @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/libs/scrobbling/impl/IScrobbler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@

#pragma once

#include <chrono>
#include <memory>
#include <vector>
#include <optional>

#include <Wt/WDateTime.h>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@

#pragma once

#include <chrono>
#include <deque>
#include <mutex>

#include <Wt/Http/Client.h>
#include <Wt/WIOService.h>
Expand Down
4 changes: 2 additions & 2 deletions src/libs/scrobbling/include/scrobbling/IScrobbling.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@

#include <chrono>
#include <memory>
#include <vector>
#include <optional>
#include <set>
#include <string_view>
#include <vector>

#include <Wt/WDateTime.h>

Expand Down
35 changes: 21 additions & 14 deletions src/libs/subsonic/impl/Stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -147,24 +148,30 @@ handleStream(RequestContext& context, const Wt::Http::Request& request, Wt::Http
{
std::shared_ptr<IResourceHandler> 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<std::shared_ptr<IResourceHandler>>(continuation->data());
}

continuation = resourceHandler->processRequest(request, response);
if (continuation)
continuation->setData(resourceHandler);
}
else
catch (const Av::Exception& e)
{
resourceHandler = Wt::cpp17::any_cast<std::shared_ptr<IResourceHandler>>(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
6 changes: 4 additions & 2 deletions src/libs/utils/impl/ChildProcess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
35 changes: 21 additions & 14 deletions src/lms/ui/resource/AudioTranscodeResource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,23 +180,30 @@ AudioTranscodeResource::handleRequest(const Wt::Http::Request& request,
{
std::shared_ptr<IResourceHandler> resourceHandler;

Wt::Http::ResponseContinuation* continuation {request.continuation()};
if (!continuation)
try
{
const std::optional<TranscodeParameters>& parameters {readTranscodeParameters(request)};
if (parameters)
resourceHandler = Av::createTranscodeResourceHandler(parameters->file, parameters->transcodeParameters);
}
else
{
resourceHandler = Wt::cpp17::any_cast<std::shared_ptr<IResourceHandler>>(continuation->data());
}
Wt::Http::ResponseContinuation* continuation {request.continuation()};
if (!continuation)
{
const std::optional<TranscodeParameters>& parameters {readTranscodeParameters(request)};
if (parameters)
resourceHandler = Av::createTranscodeResourceHandler(parameters->file, parameters->transcodeParameters);
}
else
{
resourceHandler = Wt::cpp17::any_cast<std::shared_ptr<IResourceHandler>>(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();
}
}

Expand Down

0 comments on commit c4a1bf8

Please sign in to comment.