diff --git a/Tubio/DownloadManager.cpp b/Tubio/DownloadManager.cpp index 9dadffb..3de654e 100644 --- a/Tubio/DownloadManager.cpp +++ b/Tubio/DownloadManager.cpp @@ -48,27 +48,27 @@ std::string DownloadManager::QueueDownload(std::string url, DOWNLOAD_MODE mode) { if ((j.AsJson.DoesExist("title")) && (j.AsJson["title"].GetDataType() == JDType::STRING)) { - newDownload.title = j["title"]; + newDownload.title = j["title"].AsString; } if ((j.AsJson.DoesExist("description")) && (j.AsJson["description"].GetDataType() == JDType::STRING)) { - newDownload.description = j["description"]; + newDownload.description = j["description"].AsString; } if ((j.AsJson.DoesExist("uploader")) && (j.AsJson["uploader"].GetDataType() == JDType::STRING)) { - newDownload.uploader = j["uploader"]; + newDownload.uploader = j["uploader"].AsString; } if ((j.AsJson.DoesExist("duration")) && (j.AsJson["duration"].GetDataType() == JDType::INT)) { - newDownload.duration = j["duration"]; + newDownload.duration = j["duration"].AsInt; } if ((j.AsJson.DoesExist("webpage_url")) && (j.AsJson["webpage_url"].GetDataType() == JDType::STRING)) { - newDownload.webpage_url = j["webpage_url"]; + newDownload.webpage_url = j["webpage_url"].AsString; } if ((j.AsJson.DoesExist("thumbnails")) && (j.AsJson["thumbnails"].GetDataType() == JDType::ARRAY)) @@ -79,11 +79,11 @@ std::string DownloadManager::QueueDownload(std::string url, DOWNLOAD_MODE mode) if (thumbnails.Size() > 1) { // If we have more than one thumbnail to choose from, choose the second-highes quality. - newDownload.thumbnail_url = thumbnails[thumbnails.Size() - 2]["url"]; + newDownload.thumbnail_url = thumbnails[thumbnails.Size() - 2]["url"].AsString; } else { - newDownload.thumbnail_url = thumbnails[thumbnails.Size() - 1]["url"]; + newDownload.thumbnail_url = thumbnails[thumbnails.Size() - 1]["url"].AsString; } } } @@ -321,7 +321,7 @@ DownloadEntry& DownloadManager::GetDownloadEntryByTubioID(std::string tubioId) if (saveFileCache_Atomic[i].tubio_id == tubioId) return saveFileCache_Atomic[i]; } - throw std::exception("TubioID not found!"); + throw std::exception(); std::terminate(); } @@ -451,52 +451,52 @@ std::vector DownloadManager::ParseJsonArrayToEntries(const JasonP if ((iter.DoesExist("title")) && (iter["title"].GetDataType() == JDType::STRING)) { - newEntry.title = iter["title"]; + newEntry.title = iter["title"].AsString; } if ((iter.DoesExist("description")) && (iter["description"].GetDataType() == JDType::STRING)) { - newEntry.description = iter["description"]; + newEntry.description = iter["description"].AsString; } if ((iter.DoesExist("uploader")) && (iter["uploader"].GetDataType() == JDType::STRING)) { - newEntry.uploader = iter["uploader"]; + newEntry.uploader = iter["uploader"].AsString; } if ((iter.DoesExist("duration")) && (iter["duration"].GetDataType() == JDType::INT)) { - newEntry.duration = iter["duration"]; + newEntry.duration = iter["duration"].AsInt; } if ((iter.DoesExist("tubio_id")) && (iter["tubio_id"].GetDataType() == JDType::STRING)) { - newEntry.tubio_id = iter["tubio_id"]; + newEntry.tubio_id = iter["tubio_id"].AsString; } if ((iter.DoesExist("webpage_url")) && (iter["webpage_url"].GetDataType() == JDType::STRING)) { - newEntry.webpage_url = iter["webpage_url"]; + newEntry.webpage_url = iter["webpage_url"].AsString; } if ((iter.DoesExist("thumbnail_url")) && (iter["thumbnail_url"].GetDataType() == JDType::STRING)) { - newEntry.thumbnail_url = iter["thumbnail_url"]; + newEntry.thumbnail_url = iter["thumbnail_url"].AsString; } if ((iter.DoesExist("download_url")) && (iter["download_url"].GetDataType() == JDType::STRING)) { - newEntry.download_url = iter["download_url"]; + newEntry.download_url = iter["download_url"].AsString; } if ((iter.DoesExist("downloaded_filename")) && (iter["downloaded_filename"].GetDataType() == JDType::STRING)) { - newEntry.downloaded_filename = iter["downloaded_filename"]; + newEntry.downloaded_filename = iter["downloaded_filename"].AsString; } if ((iter.DoesExist("queued_timestamp")) && (iter["queued_timestamp"].GetDataType() == JDType::INT)) { - newEntry.queued_timestamp = iter["queued_timestamp"]; + newEntry.queued_timestamp = iter["queued_timestamp"].AsInt; } if ((iter.DoesExist("mode")) && (iter["mode"].GetDataType() == JDType::STRING)) @@ -529,7 +529,7 @@ std::string DownloadManager::CreateNewTubioID() while (!isIdUnique) { - if (counter > 100000000) throw std::exception("Tubio download id generator timeout"); + if (counter > 100000000) throw std::exception(); newId = Internal::Helpers::Base10_2_X(time(0), "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); diff --git a/Tubio/FileSystem.cpp b/Tubio/FileSystem.cpp index ed45724..446f13a 100644 --- a/Tubio/FileSystem.cpp +++ b/Tubio/FileSystem.cpp @@ -9,7 +9,7 @@ std::string FileSystem::ReadFile(std::string filename) ifs.open(filename, std::ios::in); if (!ifs.good()) { - throw std::exception("no such file"); + throw std::exception(); std::terminate(); } std::string buf; @@ -86,15 +86,17 @@ bool FileSystem::Delete(std::string filename) } #include -long long int FileSystem::CalculateSize(std::string name) +long long int FileSystem::CalculateSize(std::string name, bool isDirectory) { #ifdef _WIN + // Windows implementation + WIN32_FIND_DATAA data; HANDLE sh = NULL; long long int byteCount = 0; //std::cout << "Scanning dir " << name << std::endl; - sh = FindFirstFileA((name + "\\*").c_str(), &data); + sh = FindFirstFileA((name + ((isDirectory) ? "\\*" : "")).c_str(), &data); if (sh == INVALID_HANDLE_VALUE) return -1; @@ -106,7 +108,7 @@ long long int FileSystem::CalculateSize(std::string name) if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { // ... a directory, search it recursively - byteCount += CalculateSize(name + "\\" + data.cFileName); + byteCount += CalculateSize(name + "\\" + data.cFileName, true); } else { @@ -121,6 +123,23 @@ long long int FileSystem::CalculateSize(std::string name) return byteCount; #else + // Linux implementation + + std::string cmd("du -sb '"); + cmd.append(name); + cmd.append("' | cut -f1 2>&1"); + + // execute above command and get the output + FILE* stream = popen(cmd.c_str(), "r"); + if (stream) { + const int max_size = 256; + char readbuf[max_size]; + if (fgets(readbuf, max_size, stream) != NULL) { + return atoll(readbuf); + } + pclose(stream); + } + // return error val return -1; #endif } diff --git a/Tubio/FileSystem.h b/Tubio/FileSystem.h index 761c1c8..7e0af90 100644 --- a/Tubio/FileSystem.h +++ b/Tubio/FileSystem.h @@ -3,6 +3,7 @@ #include #include #include +#include #include class FileSystem @@ -18,7 +19,8 @@ public: static bool _CreateDirectory(std::string name); static bool CreateDirectoryIfNotExists(std::string name); static bool DeleteDirectory(std::string name); - static long long int CalculateSize(std::string name); + static long long int CalculateSize(std::string name, bool isDirectory = false); + private: }; diff --git a/Tubio/Logger.cpp b/Tubio/Logger.cpp index 90767b5..768dac6 100644 --- a/Tubio/Logger.cpp +++ b/Tubio/Logger.cpp @@ -40,10 +40,15 @@ std::string Logger::Flush() time_t currTime = time(0); + char timeBuf[256]; +#ifdef _WIN tm currTm; localtime_s(&currTm, &currTime); - char timeBuf[256]; strftime(timeBuf, 100, "%d.%m.%Y - %T", &currTm); +#else + tm* currTm = localtime(&currTime); + strftime(timeBuf, 100, "%d.%m.%Y - %T", currTm); +#endif std::stringstream bufOut; bufOut << "<" << timeBuf << "> [" << identifier << "]" << TypeToPrefix(type) << ((additional_information.length() > 0) ? " " : "") << additional_information << ": " << cout.str(); diff --git a/Tubio/RestQueryHandler.cpp b/Tubio/RestQueryHandler.cpp index b8927d5..3dd655b 100644 --- a/Tubio/RestQueryHandler.cpp +++ b/Tubio/RestQueryHandler.cpp @@ -30,6 +30,7 @@ bool RestQueryHandler::ProcessQuery(const std::string clientAdress, const Json& else if (requestName == "queue_download") return QueueDownload(requestBody, responseBody, responseCode); else if (requestName == "fetch_session_cache") return FetchSessionCache(requestBody, responseBody, responseCode); else if (requestName == "fetch_alltime_cache") return FetchAlltimeCache(requestBody, responseBody, responseCode); + else if (requestName == "get_disk_usage") return GetDiskUsage(requestBody, responseBody, responseCode); else if (requestName == "clear_download_cache") return ClearDownloadCache(requestBody, responseBody, responseCode); else if (requestName == "foo") return Example_Foo(requestBody, responseBody, responseCode); else if (requestName == "show_console") return ShowConsole(requestBody, responseBody, responseCode); @@ -280,6 +281,67 @@ bool RestQueryHandler::FetchAlltimeLogs(const JsonBlock& request, JsonBlock& res return true; } +bool RestQueryHandler::GetDiskUsage(const JsonBlock& request, JsonBlock& responseBody, HTTP_STATUS_CODE& responseCode) +{ + log->cout << "Fetching disk usage..."; + log->Flush(); + + responseCode = OK; + responseBody.CloneFrom(RestResponseTemplates::GetByCode(OK)); + + JsonBlock diskUsages; + + long long int dlcache = 0; + if (FileSystem::ExistsDirectory(XGConfig::downloader.cachedir)) + { + dlcache = FileSystem::CalculateSize(XGConfig::downloader.cachedir, true); + } + diskUsages.Set("dlcache") = dlcache; + + long long int logs = 0; + if (FileSystem::Exists("log.txt")) + { + logs += FileSystem::CalculateSize("log.txt"); + } + if (FileSystem::Exists("log.json")) + { + logs += FileSystem::CalculateSize("log.json"); + } + diskUsages.Set("logs") = logs; + + long long int misc = 0; + if (FileSystem::Exists("config.json")) + { + misc += FileSystem::CalculateSize("config.json"); + } + diskUsages.Set("misc") = misc; + + long long int dependencies = 0; + if (FileSystem::Exists("ffmpeg.exe")) + { + dependencies += FileSystem::CalculateSize("ffmpeg.exe"); + } + if (FileSystem::Exists("ffprobe.exe")) + { + dependencies += FileSystem::CalculateSize("ffprobe.exe"); + } + if (FileSystem::Exists("ffplay.exe")) + { + dependencies += FileSystem::CalculateSize("ffplay.exe"); + } + if (FileSystem::Exists("youtube-dl.exe")) + { + dependencies += FileSystem::CalculateSize("youtube-dl.exe"); + } + diskUsages.Set("dependencies") = dependencies; + + diskUsages.Set("total") = dlcache + logs + misc + dependencies; + + responseBody.Set("disk_usage") = diskUsages; + responseBody.Set("message") = "Disk usage in bytes. Dependencies are 0 on linux, because the dependencies should be installed globally."; + + return true; +} diff --git a/Tubio/RestQueryHandler.h b/Tubio/RestQueryHandler.h index 25a5393..f4ffe52 100644 --- a/Tubio/RestQueryHandler.h +++ b/Tubio/RestQueryHandler.h @@ -29,6 +29,7 @@ namespace Rest static bool GetOSName(const JasonPP::JsonBlock& request, JasonPP::JsonBlock& responseBody, HTTP_STATUS_CODE& responseCode); static bool FetchAlltimeLogs(const JasonPP::JsonBlock& request, JasonPP::JsonBlock& responseBody, HTTP_STATUS_CODE& responseCode); static bool FetchSessionLogs(const JasonPP::JsonBlock& request, JasonPP::JsonBlock& responseBody, HTTP_STATUS_CODE& responseCode); + static bool GetDiskUsage(const JasonPP::JsonBlock& request, JasonPP::JsonBlock& responseBody, HTTP_STATUS_CODE& responseCode); static bool ValidateField(const std::string name, const JasonPP::JDType type, const JasonPP::Json& checkThat, JasonPP::JsonBlock& putErrorResponseHere); diff --git a/Tubio/Tubio.vcxproj b/Tubio/Tubio.vcxproj index 20f71c6..6b86f63 100644 --- a/Tubio/Tubio.vcxproj +++ b/Tubio/Tubio.vcxproj @@ -86,7 +86,7 @@ Level3 true - _WIN;_WIN32;JASONPP_RENDER_SORTED;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _WIN;JASONPP_RENDER_SORTED;_WIN32;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp17 @@ -101,7 +101,7 @@ true true true - _WIN;_WIN32;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + _WIN;JASONPP_RENDER_SORTED;_WIN32;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp17 @@ -116,7 +116,7 @@ Level3 true - _WIN;_WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _WIN;JASONPP_RENDER_SORTED;_WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp17 @@ -131,7 +131,7 @@ true true true - _WIN;_WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + _WIN;JASONPP_RENDER_SORTED;_WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp17 diff --git a/Tubio/main.cpp b/Tubio/main.cpp index 4b6817e..c203008 100644 --- a/Tubio/main.cpp +++ b/Tubio/main.cpp @@ -2,9 +2,6 @@ int main() { - std::cout << (FileSystem::CalculateSize("C:\\Users\\Leon\\source\\repos\\Tubio\\Tubio") / 1024 / 1024) << std::endl; - - return 0; Framework framework; framework.Run(); diff --git a/linux_build/build.sh b/linux_build/build.sh new file mode 100644 index 0000000..b0c9316 --- /dev/null +++ b/linux_build/build.sh @@ -0,0 +1,29 @@ +#!/bin/bash +g++ \ +\ +-std=c++17 \ +\ +-D __linux__ \ +-D JASONPP_RENDER_SORTED \ +\ +../Tubio/main.cpp \ +../Tubio/ConsoleManager.cpp \ +../Tubio/DownloadManager.cpp \ +../Tubio/FileSystem.cpp \ +../Tubio/Framework.cpp \ +../Tubio/HttpServer.cpp \ +../Tubio/Logger.cpp \ +../Tubio/LogHistory.cpp \ +../Tubio/RestQueryHandler.cpp \ +../Tubio/RestResponseTemplates.cpp \ +../Tubio/XGConfig.cpp \ +../Tubio/XGControl.cpp \ +\ +\ +../Tubio/external_dependencies/casenta/mongoose/mongoose.c \ +../Tubio/external_dependencies/leonetienne/JasonPP/JasonPP.cpp \ +\ +-lpthread \ +\ +-w \ +-o ./tubio.out diff --git a/linux_build/tubio.out b/linux_build/tubio.out new file mode 100644 index 0000000..25c1ee9 Binary files /dev/null and b/linux_build/tubio.out differ