diff options
author | Roland Reichwein <mail@reichwein.it> | 2022-11-22 17:07:44 +0100 |
---|---|---|
committer | Roland Reichwein <mail@reichwein.it> | 2022-11-22 17:07:44 +0100 |
commit | 2a4d96188afa83110b30931559732d4fd9bacab2 (patch) | |
tree | 9513d272f2baba29d3b22b04c78ffa4bf61f58bd /whiteboard.cpp | |
parent | 15b3424c72fb3af3eb47e00eeee27730e8fa0b75 (diff) |
First working whiteboard
Diffstat (limited to 'whiteboard.cpp')
-rw-r--r-- | whiteboard.cpp | 148 |
1 files changed, 32 insertions, 116 deletions
diff --git a/whiteboard.cpp b/whiteboard.cpp index cecee9e..b6b3a8d 100644 --- a/whiteboard.cpp +++ b/whiteboard.cpp @@ -25,38 +25,15 @@ using namespace std::string_literals; namespace fs = std::filesystem; namespace { - - class TempDir - { - private: - fs::path m_path; - fs::path m_oldpath; - public: - TempDir() - { - char templ[] = "/tmp/downtubeXXXXXX"; - char *temp = mkdtemp(templ); - if (temp == nullptr) { - throw std::runtime_error("Can't create temporary directory."); - } - - m_path = temp; - m_oldpath = fs::current_path(); - fs::current_path(m_path); - } - ~TempDir() - { - fs::current_path(m_oldpath); - fs::remove_all(m_path); + uint32_t checksum32(const std::string& s) { + uint32_t result{0}; + for (int i = 0; i < s.size(); i++) { + result = ((result >> 1) | ((result & 1) << 31)) ^ (s[i] & 0xFF); } - - const fs::path& getPath() const {return m_path;} - }; - - std::regex re{"https?://(www\\.youtube\\.com/watch\\?v=|youtu\\.be/)[[:alnum:]_&=-]+", std::regex::extended}; // www.youtube.com/watch?v=ItjMIxS3-rI or https://youtu.be/ItjMIxS3-rI - -} // anonymous namespace + return result & 0x7FFFFFFF; + } +} int main(void) { @@ -81,6 +58,8 @@ int main(void) return 1; } + std::string filedata {""}; // initial content + while (FCGX_Accept_r(&request) >= 0) { try { char* method = FCGX_GetParam("REQUEST_METHOD", request.envp); @@ -99,107 +78,44 @@ int main(void) pt::ptree xml; std::istringstream ss{xmlData}; - pt::xml_parser::read_xml(ss, xml, pt::xml_parser::no_comments | pt::xml_parser::trim_whitespace); + pt::xml_parser::read_xml(ss, xml); - std::string url {xml.get<std::string>("request.url")}; - std::string format {xml.get<std::string>("request.format")}; std::string command {xml.get<std::string>("request.command")}; + std::string id {xml.get<std::string>("request.id")}; - //FCGX_PutS("Content-Type: text/plain\r\n\r\n", request.out); - //FCGX_FPrintF(request.out, "url: %s\r\n", url.c_str()); - //FCGX_FPrintF(request.out, "format: %s\r\n", format.c_str()); // mp3, mp4 - - if (format != "mp3" && format != "mp4") { - throw std::runtime_error("Bad format: "s + format); - } - - if (!std::regex_match(url, re)) { - throw std::runtime_error("Bad URL"); - } - - // remove trailing "&..." - size_t and_pos {url.find('&')}; - if (and_pos != std::string::npos) - url = url.substr(0, and_pos); - - //FCGX_FPrintF(request.out, "command: %s\r\n", command.c_str()); - - TempDir tempDir; - - //FCGX_FPrintF(request.out, "path: %s\r\n", tempDir.getPath().string().c_str()); - - if (command == "getfilename") { - //std::string cmd{"youtube-dl -o '%(title)s."s + format + "' --get-filename --no-call-home --restrict-filenames "s + url + " > filename.txt"}; - // Recoding to MP4 is too slow currently. So keep original format for now - std::string cmd{"xyoutube-dl -o '%(title)s.%(ext)s' --get-filename --no-call-home --restrict-filenames "s + url + " > filename.txt"}; - if (system(cmd.c_str())) - throw std::runtime_error("Can't guess filename"); - - std::string filename {File::getFile("filename.txt")}; - boost::algorithm::trim(filename); - - if (format == "mp3") - filename = fs::path{filename}.stem().string() + ".mp3"; - + if (command == "modify") { + std::string data {xml.get<std::string>("request.data")}; + filedata = data; FCGX_PutS("Content-Type: text/plain\r\n\r\n", request.out); - FCGX_FPrintF(request.out, "%s", filename.c_str()); } else if (command == "getfile") { - if (format == "mp3") { - std::string cmd{"xyoutube-dl --no-warnings --no-call-home --no-progress -x --audio-format mp3 -o 'audio.%(ext)s' --restrict-filenames "s + url}; - system(cmd.c_str()); // Ignore error - "ERROR: Stream #1:0 -> #0:1 (copy)" - seems to be ok - - std::string filedata {File::getFile("audio.mp3")}; // may throw - if (filedata.size() > 30000000) - throw std::runtime_error("File too big"); - - FCGX_PutS("Content-Type: application/octet-stream\r\n", request.out); - FCGX_FPrintF(request.out, "Content-Length: %d\r\n\r\n", filedata.size()); - FCGX_PutStr(filedata.c_str(), filedata.size(), request.out); - } else if (format == "mp4") { - //std::string cmd{"youtube-dl --no-warnings --no-call-home --no-progress --recode-video mp4 -o video.mp4 --restrict-filenames "s + url}; - // Recoding to MP4 is too slow currently. So keep original format for now - std::string cmd{"xyoutube-dl --no-warnings --no-call-home --no-progress -o video.mp4 --restrict-filenames "s + url}; - system(cmd.c_str()); // Ignore error - - // youtube-dl gets it wrong and creates, e.g. video.mkv. - // So find it and load it - fs::directory_iterator di{fs::current_path()}; - fs::path filename; - for (const auto& i: di) { - if (boost::algorithm::starts_with(i.path().filename().string(), "video."s)) { - filename = i.path().filename().string(); - break; - } - } - - if (filename.empty()) { - throw std::runtime_error("No video file found."); - } - - std::string filedata {File::getFile(filename)}; // may throw - - if (filedata.size() > 300000000) - throw std::runtime_error("File too big"); - + if (filedata.size() > 30000000) + throw std::runtime_error("File too big"); + + FCGX_PutS("Content-Type: application/octet-stream\r\n", request.out); + FCGX_FPrintF(request.out, "Content-Length: %d\r\n\r\n", filedata.size()); + FCGX_PutStr(filedata.c_str(), filedata.size(), request.out); + } else if (command == "checkupdate") { + std::string checksum_s {xml.get<std::string>("request.checksum")}; + uint32_t checksum{static_cast<uint32_t>(stoul(checksum_s))}; + + //std::cout << "Checksum JS: " << checksum_s << std::endl; + //std::cout << "Checksum C++: " << checksum32(filedata) << std::endl; + + if (checksum != checksum32(filedata)) { + //std::cout << "Sending change..." << std::endl; FCGX_PutS("Content-Type: application/octet-stream\r\n", request.out); FCGX_FPrintF(request.out, "Content-Length: %d\r\n\r\n", filedata.size()); FCGX_PutStr(filedata.c_str(), filedata.size(), request.out); } else { - throw std::runtime_error("Bad format for unknown reason: "s + format); // should have been caught above already! + //std::cout << "No change..." << std::endl; + FCGX_PutS("Content-Type: text/plain\r\n\r\n", request.out); + FCGX_PutS("No change.\r\n", request.out); } } else { throw std::runtime_error("Bad command: "s + command); } - // Name: - // youtube-dl -o "%(title)s.mp3" --get-filename --no-call-home --restrict-filenames $SOURCE > filename.txt - // - // MP3: - // youtube-dl --no-warnings --no-call-home --no-progress -x --audio-format mp3 --embed-thumbnail -o "%(title)s.(ext)s" --restrict-filenames $SOURCE - // - // MP4: - // youtube-dl --no-warnings --no-call-home --no-progress --recode-video mp4 -o "%(title)s.(ext)s" --restrict-filenames $SOURCE } else { throw std::runtime_error("Unsupported method.\r\n"); } |