add api for live2d.
This commit is contained in:
parent
2d479a1cf1
commit
7185247c12
@ -5,7 +5,6 @@
|
||||
#include <stddef.h>
|
||||
#include "mpeg-ps.h"
|
||||
#include "mpeg-ts.h"
|
||||
#include "mpeg-ts-proto.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -1,6 +0,0 @@
|
||||
#ifndef _mpeg_ts_proto_h_
|
||||
#define _mpeg_ts_proto_h_
|
||||
|
||||
#pragma message("This file is deprecated. Please use \"mpeg-ts.h\" or \"mpeg-ps.h\" only")
|
||||
|
||||
#endif /* !_mpeg_ts_proto_h_ */
|
@ -254,6 +254,10 @@ const Application::RequestHandler *Application::find(boost::urls::segments_encod
|
||||
return ret;
|
||||
}
|
||||
|
||||
void Application::insertUrl(std::string_view url, RequestHandler &&handler) {
|
||||
m_router->insert(url, std::move(handler));
|
||||
}
|
||||
|
||||
int Application::exec() {
|
||||
LOG(info) << "application start successful ...";
|
||||
startCheckInterval(*m_ioContext->ioContext(), 2);
|
||||
|
@ -24,6 +24,7 @@ public:
|
||||
BUILD_SETTING(uint32_t, Threads, std::thread::hardware_concurrency());
|
||||
BUILD_SETTING(std::string, DocumentRoot, ".");
|
||||
BUILD_SETTING(std::string, HomeAssistantAccessToken, "");
|
||||
BUILD_SETTING(std::string, Live2dModelsRoot, "./live2d");
|
||||
|
||||
INITIALIZE_FIELDS(Server, Port, Threads, DocumentRoot);
|
||||
Application(const std::string &path);
|
||||
@ -32,6 +33,7 @@ public:
|
||||
|
||||
const RequestHandler *find(boost::urls::segments_encoded_view path,
|
||||
boost::urls::matches_base &matches) const noexcept;
|
||||
void insertUrl(std::string_view url,RequestHandler &&handler);
|
||||
|
||||
protected:
|
||||
void alarmTask();
|
||||
|
@ -13,6 +13,7 @@ add_executable(Server main.cpp
|
||||
ServiceManager.h
|
||||
SystemUsage.h SystemUsage.cpp
|
||||
UdpServer.h UdpServer.cpp
|
||||
Live2dBackend.h Live2dBackend.cpp
|
||||
WeChatContext/CorporationContext.h WeChatContext/CorporationContext.cpp
|
||||
WeChatContext/WeChatContext.h WeChatContext/WeChatContext.cpp
|
||||
WeChatContext/WeChatSession.h WeChatContext/WeChatSession.cpp
|
||||
|
47
Server/Live2dBackend.cpp
Normal file
47
Server/Live2dBackend.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
#include "Live2dBackend.h"
|
||||
#include "Application.h"
|
||||
#include "HttpSession.h"
|
||||
#include "ServiceLogic.h"
|
||||
#include <boost/url/url_view.hpp>
|
||||
|
||||
Live2dBackend::Live2dBackend() {
|
||||
using namespace Amass;
|
||||
auto application = Singleton<Application>::instance();
|
||||
application->insertUrl("/api/v1/live2d/{path*}", [this, live2dModelsRoot{application->getLive2dModelsRoot()}](
|
||||
HttpSession &session, const Application::Request &request,
|
||||
const boost::urls::matches &matches) {
|
||||
using namespace boost::beast;
|
||||
boost::urls::url_view view(request.target());
|
||||
auto target = view.path();
|
||||
LOG(info) << target;
|
||||
if (target.find("..") != boost::beast::string_view::npos) {
|
||||
session.reply(ServiceLogic::badRequest(request, "Illegal request-target"));
|
||||
return;
|
||||
}
|
||||
std::string path = ResponseUtility::pathCat(live2dModelsRoot, matches["path"]);
|
||||
if (target.back() == '/') path.append("index.html");
|
||||
if (std::filesystem::is_directory(path)) path.append("/index.html");
|
||||
boost::beast::error_code ec;
|
||||
http::file_body::value_type body;
|
||||
body.open(path.c_str(), boost::beast::file_mode::scan, ec);
|
||||
if (ec == boost::beast::errc::no_such_file_or_directory) {
|
||||
std::ostringstream oss;
|
||||
oss << "The resource '" << target << "' was not found.";
|
||||
LOG(error) << oss.str();
|
||||
session.errorReply(request, http::status::not_found, oss.str());
|
||||
return;
|
||||
} else if (ec) {
|
||||
session.reply(ServiceLogic::serverError(request, ec.message()));
|
||||
return;
|
||||
}
|
||||
auto const size = body.size();
|
||||
http::response<http::file_body> res{std::piecewise_construct, std::make_tuple(std::move(body)),
|
||||
std::make_tuple(http::status::ok, request.version())};
|
||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||
res.set(http::field::content_type, ResponseUtility::mimeType(path));
|
||||
res.set(http::field::access_control_allow_origin, "*");
|
||||
res.content_length(size);
|
||||
res.keep_alive(request.keep_alive());
|
||||
session.reply(std::move(res));
|
||||
});
|
||||
}
|
9
Server/Live2dBackend.h
Normal file
9
Server/Live2dBackend.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef __LIVE2DBACKEND_H__
|
||||
#define __LIVE2DBACKEND_H__
|
||||
|
||||
class Live2dBackend {
|
||||
public:
|
||||
Live2dBackend();
|
||||
};
|
||||
|
||||
#endif // __LIVE2DBACKEND_H__
|
@ -3,6 +3,7 @@
|
||||
#include "Database.h"
|
||||
#include "IoContext.h"
|
||||
#include "Listener.h"
|
||||
#include "Live2dBackend.h"
|
||||
#include "MediaServer.h"
|
||||
#include "ProxyListener.h"
|
||||
#include "ServiceManager.h"
|
||||
@ -74,6 +75,7 @@ int main(int argc, char const *argv[]) {
|
||||
|
||||
auto wechatContext = Singleton<WeChatContext>::instance<Construct>(application->ioContext());
|
||||
auto corpContext = Singleton<CorporationContext>::instance<Construct>(application->ioContext());
|
||||
auto live2d = std::make_shared<Live2dBackend>();
|
||||
|
||||
LOG(info) << "hardware_concurrency: " << std::thread::hardware_concurrency()
|
||||
<< ",threads: " << application->getThreads();
|
||||
|
Loading…
Reference in New Issue
Block a user