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");     } | 
