Do not crash when transcoding a non existing file (regression from eea27b8), fixes #141

This commit is contained in:
emeric
2021-04-17 15:00:14 +02:00
parent 68107311e3
commit 05f0213a9f
5 changed files with 53 additions and 47 deletions
@@ -33,7 +33,6 @@ namespace Av
TranscodeResourceHandler::TranscodeResourceHandler(const std::filesystem::path& trackPath, const TranscodeParameters& parameters) TranscodeResourceHandler::TranscodeResourceHandler(const std::filesystem::path& trackPath, const TranscodeParameters& parameters)
: _transcoder {trackPath, parameters} : _transcoder {trackPath, parameters}
{ {
_transcoder.start();
} }
Wt::Http::ResponseContinuation* Wt::Http::ResponseContinuation*
+9 -16
View File
@@ -48,11 +48,12 @@ Transcoder::Transcoder(const std::filesystem::path& filePath, const TranscodePar
, _filePath {filePath} , _filePath {filePath}
, _parameters {parameters} , _parameters {parameters}
{ {
start();
} }
Transcoder::~Transcoder() = default; Transcoder::~Transcoder() = default;
bool void
Transcoder::start() Transcoder::start()
{ {
if (ffmpegPath.empty()) if (ffmpegPath.empty())
@@ -61,20 +62,13 @@ Transcoder::start()
try try
{ {
if (!std::filesystem::exists(_filePath)) if (!std::filesystem::exists(_filePath))
{ throw Exception {"File '" + _filePath.string() + "' does not exist!"};
LOG(ERROR) << "File '" << _filePath << "' does not exist!";
return false;
}
else if (!std::filesystem::is_regular_file( _filePath) ) else if (!std::filesystem::is_regular_file( _filePath) )
{ throw Exception {"File '" + _filePath.string() + "' is not regular!"};
LOG(ERROR) << "File '" << _filePath << "' is not regular!";
return false;
}
} }
catch (const std::filesystem::filesystem_error& e) catch (const std::filesystem::filesystem_error& e)
{ {
LOG(ERROR) << "File error on '" << _filePath.string() << "': " << e.what(); throw Exception {"File error '" + _filePath.string() + "': " + e.what()};
return false;
} }
LOG(INFO) << "Transcoding file '" << _filePath.string() << "'"; LOG(INFO) << "Transcoding file '" << _filePath.string() << "'";
@@ -163,7 +157,7 @@ Transcoder::start()
break; break;
default: default:
return false; throw Exception {"Unhandled format (" + std::to_string(static_cast<int>(_parameters.format)) + ")"};
} }
_outputMimeType = formatToMimetype(_parameters.format); _outputMimeType = formatToMimetype(_parameters.format);
@@ -181,11 +175,8 @@ Transcoder::start()
} }
catch (ChildProcessException& exception) catch (ChildProcessException& exception)
{ {
LOG(ERROR) << "Cannot execute '" << ffmpegPath << "': " << exception.what(); throw Exception {"Cannot execute '" + ffmpegPath.string() + "': " + exception.what()};
return false;
} }
return true;
} }
void void
@@ -223,6 +214,8 @@ Transcoder::readSome(std::byte* buffer, std::size_t bufferSize)
bool bool
Transcoder::finished() const Transcoder::finished() const
{ {
assert(_childProcess);
return _childProcess->finished(); return _childProcess->finished();
} }
+2 -2
View File
@@ -40,8 +40,6 @@ namespace Av
Transcoder(Transcoder&&) = delete; Transcoder(Transcoder&&) = delete;
Transcoder& operator=(Transcoder&&) = delete; Transcoder& operator=(Transcoder&&) = delete;
bool start();
using WaitCallback = std::function<void()>; using WaitCallback = std::function<void()>;
void asyncWaitForData(WaitCallback cb); void asyncWaitForData(WaitCallback cb);
@@ -58,6 +56,8 @@ namespace Av
private: private:
static void init(); static void init();
void start();
const std::size_t _id {}; const std::size_t _id {};
const std::filesystem::path _filePath; const std::filesystem::path _filePath;
const TranscodeParameters _parameters; const TranscodeParameters _parameters;
+9 -2
View File
@@ -26,6 +26,7 @@
#include "database/Track.hpp" #include "database/Track.hpp"
#include "database/User.hpp" #include "database/User.hpp"
#include "utils/IResourceHandler.hpp" #include "utils/IResourceHandler.hpp"
#include "utils/Logger.hpp"
#include "utils/FileResourceHandlerCreator.hpp" #include "utils/FileResourceHandlerCreator.hpp"
#include "utils/Utils.hpp" #include "utils/Utils.hpp"
#include "ParameterParsing.hpp" #include "ParameterParsing.hpp"
@@ -147,6 +148,8 @@ handleStream(RequestContext& context, const Wt::Http::Request& request, Wt::Http
{ {
std::shared_ptr<IResourceHandler> resourceHandler; std::shared_ptr<IResourceHandler> resourceHandler;
try
{
Wt::Http::ResponseContinuation* continuation = request.continuation(); Wt::Http::ResponseContinuation* continuation = request.continuation();
if (!continuation) if (!continuation)
{ {
@@ -164,7 +167,11 @@ handleStream(RequestContext& context, const Wt::Http::Request& request, Wt::Http
continuation = resourceHandler->processRequest(request, response); continuation = resourceHandler->processRequest(request, response);
if (continuation) if (continuation)
continuation->setData(resourceHandler); continuation->setData(resourceHandler);
}
catch (const Av::Exception& e)
{
LMS_LOG(API_SUBSONIC, ERROR) << "Caught Av exception: " << e.what();
}
} }
} } // namespace API::Subsonic::Stream
@@ -180,6 +180,8 @@ AudioTranscodeResource::handleRequest(const Wt::Http::Request& request,
{ {
std::shared_ptr<IResourceHandler> resourceHandler; std::shared_ptr<IResourceHandler> resourceHandler;
try
{
Wt::Http::ResponseContinuation* continuation {request.continuation()}; Wt::Http::ResponseContinuation* continuation {request.continuation()};
if (!continuation) if (!continuation)
{ {
@@ -198,6 +200,11 @@ AudioTranscodeResource::handleRequest(const Wt::Http::Request& request,
if (continuation) if (continuation)
continuation->setData(resourceHandler); continuation->setData(resourceHandler);
} }
}
catch (const Av::Exception& e)
{
LOG(ERROR) << "Caught Av exception: " << e.what();
}
} }
} // namespace UserInterface } // namespace UserInterface