#include "WebAPI.h" #include "Recorder/Recorder.h" #include "Recorder/DigooRecorder.h" #include "Recorder/FoscamRecorder.h" #include "Recorder/RTSPRecorder.h" #include "Recorder/VStarCamRecorder.h" #include "Recorder/WatchBotRecorder.h" #include "Recorder/ZModoRecorder.h" #include #include #include #include namespace CameraRecorder { namespace API { // API Description // Status Query // Goal: Provide status information based on POST data // Use: DomoticaSite status update // URL: http:///API/////// WebAPI::WebAPI() { } WebAPI::~WebAPI() { } Http::HttpServer::HttpReply WebAPI::ProcessQuery(ctpl::thread_pool* pThreadPool, Http::HttpClient* pHttpClient, Util::RecorderMutexPointer pRecorderMutex, const std::string& path, const std::string& ffmpeg, const std::string& uri, const std::vector& postData) { if (!StringAlgorithm::iequals(uri, "/api") && !StringAlgorithm::istarts_with(uri, "/api/")) { Http::HttpServer::HttpReply reply; reply.status = Http::HttpServer::HttpReply::Status::Unauthorized; return reply; } Http::HttpServer::HttpReply reply; reply.status = Http::HttpServer::HttpReply::Status::InternalServerError; reply.content = "{\"result\": \"error\"}\r\n"; try { std::string apiURI = uri.substr(4); std::vector uriTokens = StringAlgorithm::split(apiURI, '/'); if (uriTokens.size() < 7) return reply; std::string action = uriTokens[1]; std::string brand = uriTokens[2]; Recorder::Settings settings; settings.Path = path; settings.IpAddress = uriTokens[3]; settings.Port = uriTokens[4]; settings.URL = cppcodec::base64_url::decode(uriTokens[5].c_str(), uriTokens[5].length()); settings.Username = uriTokens[6]; settings.Password = uriTokens[7]; int numberOfImages = 5; if (uriTokens.size() > 8) numberOfImages = stoi(uriTokens[8]); reply.status = Http::HttpServer::HttpReply::Status::Ok; if (StringAlgorithm::iequals("Digoo", brand)) { auto recorder = Recorder::DigooRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } else if (StringAlgorithm::iequals("Foscam", brand)) { auto recorder = Recorder::FoscamRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } else if (StringAlgorithm::iequals("RTSP", brand)) { auto recorder = Recorder::RTSPRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } else if (StringAlgorithm::iequals("VStarCam", brand)) { auto recorder = Recorder::VStarCamRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } else if (StringAlgorithm::iequals("WatchBot", brand)) { auto recorder = Recorder::WatchBotRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } else if (StringAlgorithm::iequals("ZModo", brand)) { auto recorder = Recorder::ZModoRecorder(pHttpClient, settings, pRecorderMutex); if (StringAlgorithm::iequals("Snapshot", action)) reply.content = recorder.Snapshot(pThreadPool, ffmpeg); else if (StringAlgorithm::iequals("MultiSnapshot", action)) reply.content = recorder.MultiSnapshot(pThreadPool, ffmpeg, numberOfImages); else if (StringAlgorithm::iequals("Video", action)) reply.content = recorder.Video(pThreadPool, ffmpeg); } } catch (const std::exception& e) { std::cout << "WebAPI::ProcessQuery() - Error: " << e.what() << std::endl; return reply; } return reply; } } // namespace API } // namespace CameraRecorder