diff --git a/g++/main.cpp b/g++/main.cpp index ebf753c..7e6a6ac 100644 --- a/g++/main.cpp +++ b/g++/main.cpp @@ -1,5 +1,5 @@ -#include "parameterManager.h" #include "programManager.h" +#include "parameterManager.h" int main(int argc, char *argv[]) @@ -10,5 +10,5 @@ int main(int argc, char *argv[]) if(res != 0) return (res == -1) ? 0 : res; - return mainProgram.start(settings); + return mainProgram.start(&settings); } diff --git a/g++/pageManager.cpp b/g++/pageManager.cpp index 67e83b8..9042f81 100644 --- a/g++/pageManager.cpp +++ b/g++/pageManager.cpp @@ -274,7 +274,7 @@ int PageManager::writeToFile(std::string path, std::string text) std::ofstream of; of.open(path, std::ios::out | std::ios::app); if(!of.is_open()) { - perror(" => Error: Konnte output Datei nicht öffnen"); + perror(" => Error: Konnte Output Datei nicht öffnen"); return -1; } of << text << std::endl; diff --git a/g++/pageManager.h b/g++/pageManager.h index 152685b..276ecab 100644 --- a/g++/pageManager.h +++ b/g++/pageManager.h @@ -3,7 +3,7 @@ #include // if complied for windows; everything is in */projectfolder/curl/ -#include +#include #include #include #include diff --git a/g++/parameterManager.cpp b/g++/parameterManager.cpp index a521b7a..2367128 100644 --- a/g++/parameterManager.cpp +++ b/g++/parameterManager.cpp @@ -1,8 +1,11 @@ #include "parameterManager.h" -void setPaths(Settings &settings, std::string executablePathTo) +void setPaths(Settings &settings) { //Path settings + std::string executablePathTo = getexepath(); + std::cout << "Path " << executablePathTo << std::endl; + executablePathTo.erase(executablePathTo.find_last_of(settings.pathSymbol) + 1 , executablePathTo.length() - ( executablePathTo.find_last_of(settings.pathSymbol) + 1) ); if(!dirExists(executablePathTo + "src" + settings.pathSymbol)) @@ -17,30 +20,31 @@ void setPaths(Settings &settings, std::string executablePathTo) } - int manageParameter(Settings &settings, int argc, char **argv) { //Path settings - setPaths(settings, argv[0]); + setPathSymbol(settings); + setPaths(settings); if(argc < 2) { - std::cout << " => Keine Unteroption angegeben." << std::endl; - std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " --help“ liefert weitere Informationen." << std::endl; + std::cout << " => Error: Keine Unteroption angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl; + std::cout << "„" << getProgramName() << " --help“ liefert weitere Informationen." << std::endl; return 1; } - int res = compare("--help\ndefault\nurl\n--version\nsearch", argv[1]); + int res = compare("--help\ndefault\nurl\n--version\nsearch\ninfo", argv[1]); if(res != 1) { - std::cout << " => Unbekannte Unteroption: '" << argv[1] << "': Mehrere oder keine Option gefunden: " << res << " Möglichkeiten." << std::endl; - std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " --help“ liefert weitere Informationen." << std::endl; + std::cout << " => Error: " << ( (res == 0) ? std::string("Unbekannte Unteroption: '") + argv[1] + "'" : + std::string("Mehrere Optionen für '") + argv[1] + std::string("' gefunden.") ) << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl; + std::cout << "„" << getProgramName() << " --help“ liefert weitere Informationen." << std::endl; return 2; } if(strncmp(argv[1], "--help", strlen(argv[1])) == 0) { argv[1][0] = '\0'; - return unterOption_help(&settings, argv[0]); + return unterOption_help(); } else if (strncmp(argv[1], "default", strlen(argv[1])) == 0) { argv[1][0] = '\0'; @@ -58,9 +62,9 @@ int manageParameter(Settings &settings, int argc, char **argv) argv[1][0] = '\0'; return unterOption_search(&settings, argc, argv); - } else if (false) { - - //return 0; + } else if (strncmp(argv[1], "info", strlen(argv[1])) == 0) { + argv[1][0] = '\0'; + return unterOption_info(&settings, argc, argv); } else { std::cout << "Error: Invalid option " << argv[1] << ", but not detected in compare-Function" << std::endl; @@ -68,9 +72,9 @@ int manageParameter(Settings &settings, int argc, char **argv) } } -int unterOption_help(Settings *, char * argv0) +int unterOption_help() { - std::cout << "Aufruf: " << getProgramName(argv0) << " [Unteroption] [PARAMETER]" << std::endl << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl << std::endl; std::cout << "Unteroptionen:" << std::endl << "\t„--help“\tListe aller Unteroptionen" << std::endl << "\t„--version“\tVersion des Programmes" << std::endl @@ -88,7 +92,6 @@ int unterOption_default(Settings *settings, int argc, char ** argv) int c = 0; const option long_opts[] = { - {"name", required_argument, nullptr, 'n'}, {"socks5-proxy", required_argument, nullptr, 'p'}, {"genauer-hoster", required_argument, nullptr, 'g'}, {"languages", required_argument, nullptr, 'l'}, @@ -112,14 +115,8 @@ int unterOption_default(Settings *settings, int argc, char ** argv) }; - while( ( c = getopt_long (argc, argv, "n:p:g:l:o:e:E:s:S:C:m:t:hcd", long_opts, nullptr) ) != -1 ) { + while( ( c = getopt_long (argc, argv, "p:g:l:o:e:E:s:S:C:m:t:hcd", long_opts, nullptr) ) != -1 ) { switch(c) { - case 'n': - if(optarg) - settings->name = optarg; - if(settings->debugMode) - std::cout << "Name: " << settings->name << std::endl; - break; case 'p': { if(!optarg || std::string(optarg) == "") break; @@ -245,6 +242,12 @@ int unterOption_default(Settings *settings, int argc, char ** argv) settings->colorless = true; if(settings->debugMode) std::cout << "Farblos: true" << std::endl; + if(argc > optind) + if(argv[optind][0] != '-' && std::string(argv[optind]).find(settings->pathSymbol) != std::string::npos) { + std::cout << " => Upps: Hast du -c (--colorless) mit -C (--check-dir) verwechselt?" << std::endl + << " (Hat “Argument“ mit “"<< settings->pathSymbol << "“: '-c " << std::string(argv[optind]) << "')." << std::endl; + return -1; + } break; case 'd': settings->debugMode = true; @@ -252,30 +255,40 @@ int unterOption_default(Settings *settings, int argc, char ** argv) std::cout << "Debug Modus: true" << std::endl; break; case 'h': - unterOption_default_help(settings, argv[0]); + unterOption_default_help(); return -1; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " default [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " default --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " default --help“ liefert weitere Informationen." << std::endl; return -1; } } - if(settings->debugMode) + //Alle nicht verwendeten Parameter == Name + while (optind < argc) { + if(argv[optind][0]) { + settings->name.append(argv[optind++]).append(" "); + } else + optind++; + } + + if(settings->name.length() > 0) + settings->name.pop_back(); + if(settings->debugMode) { + std::cout << "Name: " << settings->name << std::endl; std::cout << "Modus: DEFAULT_MODUS" << std::endl; + } + return 0; } -void unterOption_default_help(Settings *, char * argv0) +void unterOption_default_help() { - std::cout << "Usage: " << getProgramName(argv0) << " default [ Parameter & {-n [Name]} ]..." << std::endl + std::cout << "Usage: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl << "Parameter:" << std::endl << std::endl - << " > Muss-Parameter:" << std::endl - << "\t-n [Name], --name [Name]" << std::endl - << "\t -> Namen der Serie, deren Links du willst." << std::endl - << std::endl << " > Auswahloptionen:" << std::endl << "\t-g [Hoster1,Hoster2,...], --genauer-hoster [Hoster1,Hoster2,...]" << std::endl << "\t -> Die Namen der Hoster, deren Links du willst. Der wichtigste zuerst." << std::endl + << "\t -> Default: Vivo,GoUnlimited" << std::endl << "\t-l [GerDub/GerSub/Eng,...], --languages [GerDub/GerSub/Eng,...]" << std::endl << "\t -> Die Sprache(n) die du willst. Die wichtigsten zuerst. Default: GerDub,GerSub,Eng" << std::endl << std::endl @@ -330,7 +343,6 @@ int unterOption_url(Settings *settings, int argc, char **argv) int c = 0; const option long_opts[] = { - {"url", required_argument, nullptr, 'u'}, {"socks5-proxy", required_argument, nullptr, 'p'}, {"output-file", required_argument, nullptr, 'o'}, @@ -342,15 +354,8 @@ int unterOption_url(Settings *settings, int argc, char **argv) }; - while( ( c = getopt_long (argc, argv, "u:p:o:hcd", long_opts, nullptr) ) != -1 ) { + while( ( c = getopt_long (argc, argv, "p:o:hcd", long_opts, nullptr) ) != -1 ) { switch(c) { - case 'u': - if(optarg) - settings->name = optarg; - if(settings->debugMode) - std::cout << "Urls: " << settings->name << std::endl; - break; - case 'p': { if(!optarg || std::string(optarg) == "") break; @@ -392,30 +397,43 @@ int unterOption_url(Settings *settings, int argc, char **argv) std::cout << "Debug Modus: true" << std::endl; break; case 'h': - unterOption_url_help(settings, argv[0]); + unterOption_url_help(); return -1; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " url [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " url --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl; + std::cout << "„" << getProgramName() << " url --help“ liefert weitere Informationen." << std::endl; return 21; } } - if(settings->debugMode) + + + //Alle nicht verwendeten Parameter == Name + while (optind < argc) { + if(argv[optind][0]) { + settings->name.append(argv[optind++]).append(","); + } else + optind++; + } + + if(settings->name.length() > 0) + settings->name.pop_back(); + if(settings->debugMode) { + std::cout << "Urls: " << settings->name << std::endl; std::cout << "Modus: DIRECT_LINK_MODUS" << std::endl; + } + return 0; } -void unterOption_url_help(Settings *, char * argv0) +void unterOption_url_help() { - std::cout << "Usage: " << getProgramName(argv0) << " url [ Parameter & {-u [Url]} ]..." << std::endl + std::cout << "Usage: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl << "Parameter:" << std::endl - << "\t-u [Url1,Url2,...], --url [Url1,Url2,...]" << std::endl - << "\t -> Die zu umwandelnden redirect-Links." << std::endl << "\t-p [ProxyAddresse], --socks5-proxy [ProxyAddresse]" << std::endl << "\t -> Type: Socks5, Default: 127.0.0.1:9050" << std::endl << "\t-o [Pfad], --output-file [Pfad]" << std::endl << "\t-c, --colorless" << std::endl - << "\t -> Default: false ." << std::endl + << "\t -> Default: false" << std::endl << "\t-d, --debug-mode" << std::endl << "\t -> Debug Nachrichten an. Default: false" << std::endl << "\t-h, --help" << std::endl; @@ -423,37 +441,17 @@ void unterOption_url_help(Settings *, char * argv0) } -std::string getProgramName(char *argv0) -{ - return std::string(argv0).erase(0, ( (std::string(argv0).find_last_of("/\\") != std::string::npos ) ? std::string(argv0).find_last_of("/\\") +1 : 0 ) ); -} - -int compare(std::string All_Options_with_komma_between, std::string input) -{ - std::istringstream iStrStream( All_Options_with_komma_between + "\n"); - std::string line; - int allFounds = 0; - while (getline(iStrStream, line).good()) - if(strncmp(line.c_str(), input.c_str(), input.length()) == 0) { - allFounds++; - //std::cout << "Unteroption '" << input << "' stimmt mit '" << line << "' überein." << std::endl; - } - return allFounds; -} - int unterOption_search(Settings *settings, int argc, char **argv) { - settings->modus = Modus::Search_MODUS; + settings->modus = Modus::SEARCH_MODUS; int c = 0; const option long_opts[] = { - {"name", required_argument, nullptr, 'n'}, {"socks5-proxy", required_argument, nullptr, 'p'}, {"help", no_argument, nullptr, 'h'}, {"colorless", no_argument, nullptr, 'c'}, {"debug-mode", no_argument, nullptr, 'd'}, - {"debug-mode", no_argument, nullptr, 'd'}, {"exactly-writing", no_argument, nullptr, 'e'}, {"update", no_argument, nullptr, 'u'}, @@ -463,12 +461,6 @@ int unterOption_search(Settings *settings, int argc, char **argv) while( ( c = getopt_long (argc, argv, "n:p:hcdeu", long_opts, nullptr) ) != -1 ) { switch(c) { - case 'n': - if(optarg) - settings->name = optarg; - if(settings->debugMode) - std::cout << "Name: " << settings->name << std::endl; - break; case 'p': { if(!optarg || std::string(optarg) == "") break; @@ -494,7 +486,7 @@ int unterOption_search(Settings *settings, int argc, char **argv) } break; case 'h': - unterOption_search_help(settings, argv[0]); + unterOption_search_help(); return -1; case 'c': settings->colorless = true; @@ -517,23 +509,34 @@ int unterOption_search(Settings *settings, int argc, char **argv) std::cout << "Update die Liste: true" << std::endl; break; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " search [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " search --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " search --help“ liefert weitere Informationen." << std::endl; return 21; } } - if(settings->debugMode) - std::cout << "Modus: Search_MODUS" << std::endl; - return 0; + //Alle nicht verwendeten Parameter == Name + while (optind < argc) { + if(argv[optind][0]) { + settings->name.append(argv[optind++]).append(" "); + } else + optind++; + } + if(settings->name.length() > 0) + settings->name.pop_back(); + if(settings->debugMode) { + std::cout << "Name: " << settings->name << std::endl; + std::cout << "Modus: Search_MODUS" << std::endl; + } + + return 0; } -void unterOption_search_help(Settings *, char *argv0) +void unterOption_search_help() { - std::cout << "Usage: " << getProgramName(argv0) << " search [ Parameter & {-n [Name] / -u} ]..." << std::endl + std::cout << "Usage: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl + << " " << getProgramName() << " search [-u, --update]" << std::endl << "Parameter:" << std::endl - << "\t-n [Name], --name [Name]" << std::endl - << "\t -> (Teil)Namen der gesuchten Serie." << std::endl << "\t-p [Socks5Proxy], --socks5-proxy [Socks5Proxy]" << std::endl << "\t -> Verwende diesen Socks5-Proxy. Default: 127.0.0.1:9050" << std::endl << "\t-c, --colorless" << std::endl @@ -550,8 +553,147 @@ void unterOption_search_help(Settings *, char *argv0) } +int compare(std::string All_Options_with_komma_between, std::string input) +{ + std::istringstream iStrStream( All_Options_with_komma_between + "\n"); + std::string line; + int allFounds = 0; + while (getline(iStrStream, line).good()) + if(strncmp(line.c_str(), input.c_str(), input.length()) == 0) { + allFounds++; + //std::cout << "Unteroption '" << input << "' stimmt mit '" << line << "' überein." << std::endl; + } + return allFounds; +} + bool dirExists(std::string dir) { struct stat sb; return (stat(dir.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) ? true : false; } + +std::string getProgramName() +{ + return getexepath().erase(0, ( getexepath().find_last_of("/\\") != std::string::npos ) ? getexepath().find_last_of("/\\") +1 : 0 ); +} + + +int unterOption_info(Settings *settings, int argc, char **argv) +{ + settings->modus = Modus::INFO_MODUS; + + int c = 0; + const option long_opts[] = { + {"socks5-proxy", required_argument, nullptr, 'p'}, + + {"help", no_argument, nullptr, 'h'}, + {"colorless", no_argument, nullptr, 'c'}, + {"debug-mode", no_argument, nullptr, 'd'}, + + {nullptr, no_argument, nullptr, 0} + + }; + + while( ( c = getopt_long (argc, argv, "n:p:hcdeu", long_opts, nullptr) ) != -1 ) { + switch(c) { + case 'p': { + if(!optarg || std::string(optarg) == "") + break; + std::string optarg = ::optarg; + if(optarg.find(":") == std::string::npos) { + std::cout << "Invalid Socks5 Proxy: " << optarg << std::endl; + return 31; + } + std::string ip = optarg.substr(0, optarg.find(":")); + std::string portStr = optarg.substr(optarg.find(":") + 1, optarg.length() - optarg.find(":")); + int port = atoi(portStr.c_str()); + if(std::to_string(port) != portStr || port <= 0) { + std::cout << "[-p]: Invalid Port: " << portStr << std::endl; + return 32; + } else if (ip == "") { + std::cout << "[-p]: Invalid Ip Addresse: " << ip << std::endl; + return 34; + } else if(settings->debugMode) { + std::cout << "Proxy Addresse: "<< ip << ":" << port << std::endl; + } + settings->proxy_ip = ip; + settings->proxy_port = port; + } + break; + case 'h': + unterOption_info_help(); + return -1; + case 'c': + settings->colorless = true; + if(settings->debugMode) + std::cout << "Farblos: true" << std::endl; + break; + case 'd': + settings->debugMode = true; + if(settings->debugMode) + std::cout << "Debug Modus: true" << std::endl; + break; + default: + std::cout << "Aufruf: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " info --help“ liefert weitere Informationen." << std::endl; + return 21; + } + } + + //Alle nicht verwendeten Parameter == Name + while (optind < argc) { + if(argv[optind][0]) { + settings->name.append(argv[optind++]).append(" "); + } else + optind++; + } + if(settings->name.length() > 0) + settings->name.pop_back(); + if(settings->debugMode) { + std::cout << "Name: " << settings->name << std::endl; + std::cout << "Modus: Search_MODUS" << std::endl; + } + + return 0; +} + +void unterOption_info_help() +{ + std::cout << "Usage: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl + << "Parameter:" << std::endl + << "\t-p [Socks5Proxy], --socks5-proxy [Socks5Proxy]" << std::endl + << "\t -> Verwende diesen Socks5-Proxy. Default: 127.0.0.1:9050" << std::endl + << "\t-c, --colorless" << std::endl + << "\t -> Gib keine Farbigen Infos aus. Default: false" << std::endl + << "\t-d, --debug-mode" << std::endl + << "\t -> Debug Nachrichten an. Default: false" << std::endl + << "\t-h, --help" << std::endl + << "\t -> Gibt dieses Helpmenü aus." << std::endl; +} + + +std::string getexepath() +{ +#ifdef linux + char result[ PATH_MAX ]; + ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX ); + return std::string( result, (count > 0) ? static_cast(count) : 0 ); +#endif +#ifdef ABC ///_WIN32 + wchar_t result[ MAX_PATH ]; + char buffer[MAX_PATH]; + return std::string( result, GetModuleFileName( NULL, buffer, MAX_PATH ) ); + //GetModuleFileName(NULL, result, MAX_PATH) ; + //return reinterpret_cast(result); +#endif +} + +void setPathSymbol(Settings &settings) +{ +#ifdef linux + settings.pathSymbol = '/'; +#endif +#ifdef _WIN32 + settings.pathSymbol = '\\'; +#endif +} diff --git a/g++/parameterManager.h b/g++/parameterManager.h index 7a61129..2d2f23c 100644 --- a/g++/parameterManager.h +++ b/g++/parameterManager.h @@ -7,11 +7,19 @@ #include #include +#include // PATH_MAX +#include // readlink() + +#ifdef _WIN32 +#include +#endif + enum Modus { EXIT = -1, DEFAULT_MODUS = 0, DIRECT_LINK_MODUS = 1, - Search_MODUS = 2, + SEARCH_MODUS = 2, + INFO_MODUS = 3 }; @@ -27,8 +35,8 @@ struct Settings { serienListPath = "/tmp/SerienListe", proxy_ip = "127.0.0.1", languages = "GerDub,GerSub,Eng", - genaueHoster = "", - version = "2.0.0", + genaueHoster = "Vivo,GoUnlimited", + version = "2.1.2", outputFilePath = "", default_checkDirPath = "", default_Searchmuster = "S%Staffel%E%Folge%"; @@ -44,27 +52,33 @@ struct Settings { stopSeason = 0, proxy_port = 9050, default_maxDirs = 20; - const char pathSymbol = '/'; + char pathSymbol = '/'; }; int manageParameter(Settings &settings, int argc, char ** argv); -std::string getProgramName(char * argv0); +std::string getProgramName(); int compare(std::string All_Options_with_komma_between, std::string input); -void setPaths(Settings &settings, std::string executablePathTo); +void setPaths(Settings &settings); bool dirExists(std::string dir); -int unterOption_help(Settings * settings, char *argv0); +std::string getexepath(); +void setPathSymbol(Settings &settings); + + +int unterOption_help(); int unterOption_default(Settings * settings, int argc, char **argv); -void unterOption_default_help(Settings * settings, char * argv0); +void unterOption_default_help(); int unterOption_url(Settings * settings, int argc, char **argv); -void unterOption_url_help(Settings * settings, char *argv0); +void unterOption_url_help(); int unterOption_search(Settings * settings, int argc, char **argv); -void unterOption_search_help(Settings * settings, char *argv0); +void unterOption_search_help(); +int unterOption_info(Settings * settings, int argc, char **argv); +void unterOption_info_help(); #endif // PARAMETERMANAGER_H diff --git a/g++/programManager.cpp b/g++/programManager.cpp index 1465ef6..ef60211 100644 --- a/g++/programManager.cpp +++ b/g++/programManager.cpp @@ -10,19 +10,21 @@ ProgramManager::~ProgramManager() } -int ProgramManager::start(Settings settings) +int ProgramManager::start(Settings *settings) { - pageManager.setProxy(settings.proxy_ip, settings.proxy_port); - pageManager.setCookieFilePath(settings.cookieFilePath); - pageManager.setDebugMode(settings.debugMode); + pageManager.setProxy(settings->proxy_ip, settings->proxy_port); + pageManager.setCookieFilePath(settings->cookieFilePath); + pageManager.setDebugMode(settings->debugMode); - switch (settings.modus) { + switch (settings->modus) { case Modus::DEFAULT_MODUS: - return defaultModus(&settings); + return defaultModus(settings); case Modus::DIRECT_LINK_MODUS: - return directLinkModus(&settings); - case Modus::Search_MODUS: - return searchModus(&settings); + return directLinkModus(settings); + case Modus::SEARCH_MODUS: + return searchModus(settings); + case Modus::INFO_MODUS: + return infoModus(settings); default: return -1; } @@ -44,22 +46,32 @@ int ProgramManager::defaultModus(Settings *settings) std::cout << " > Use Path for Name: " << settings->default_checkDirPath << " -> " << settings->name << std::endl; } } if(settings->name == "") { - std::cout << " => Error: Kein Name angegeben: Missing Parameter -n [Name]." << std::endl; + std::cout << " => Error: Kein Name angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " default --help“ liefert weitere Informationen." << std::endl; return 27; } } + //Überprüfe ob ein Muster existiert: + if(settings->default_Searchmuster == "") { + std::cout << " => Error: [-m]: Kein Muster angegeben." << std::endl; + return 31; + } + + //Liste alle Dateien in dem Ornder von -C auf und speichere diese std::string dirFiles; if(settings->default_checkDirPath != "") if(listDir(dirFiles, settings->default_checkDirPath, settings->default_maxDirs ) != 0) return 28; + //Entferne von der liste das \n am ende if(dirFiles.length() > 0) dirFiles.pop_back(); //Wenn Debug Mode, gib die Liste aus - if(settings->debugMode) + if(settings->debugMode && settings->default_checkDirPath != "") std::cout << " > [-C] Files:\n" << dirFiles << std::endl; //Führe Function aus, die überprüft ob die serie existiert @@ -145,7 +157,9 @@ int ProgramManager::directLinkModus(Settings *settings) AccountManager accountManager(settings->accountFilePath, settings->accountNumberPath); if(settings->name == "") { - std::cout << "Kein(e) Link(s) angegeben: Missing Parameter -u [Url]." << std::endl; + std::cout << " => Error: Kein(e) Link(s) angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl; + std::cout << "„" << getProgramName() << " url --help“ liefert weitere Informationen." << std::endl; return 76; } @@ -157,7 +171,7 @@ int ProgramManager::directLinkModus(Settings *settings) while (getline(iStrStream, line).good()) { if(line.find("https://s.to/redirect/") == std::string::npos) { - std::cout << "Invalid Redirect Link: '" << line << "'" << std::endl; + std::cout << " => Error: Invalid Redirect Link: '" << line << "'" << std::endl; continue; } else if(convertLink(pageManager.replace(line, "https://s.to", ""), &accountManager, settings) != 0) @@ -169,17 +183,18 @@ int ProgramManager::directLinkModus(Settings *settings) int ProgramManager::searchModus(Settings *settings) { - if(settings->search_wantUpdate) { int res = searchModus_update(settings) ; if( res == 0) std::cout << "Erfolgreich geupdatet: Die Serienliste ist nun auf dem neusten Stand." << std::endl; else - std::cout << "Das updaten der Serienliste ist fehlgeschlagen." << std::endl; + std::cout << "Error: Das updaten der Serienliste ist fehlgeschlagen." << std::endl; return res; } else if(settings->name == "") { - std::cout << "Kein Name angegeben: Missing Parameter -n [Name]." << std::endl; + std::cout << " => Error: Kein Name angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " search --help“ liefert weitere Informationen." << std::endl; return 27; } @@ -191,7 +206,7 @@ int ProgramManager::searchModus(Settings *settings) else { ifs.open(settings->serienListPath); if(!ifs.is_open()) { - perror("Couldn't open SerienList file after update again."); + perror(" => Error: Couldn't open SerienList file after update again."); return 434; } std::cout << "Erfolgreich gedownloadet." << std::endl; @@ -201,9 +216,11 @@ int ProgramManager::searchModus(Settings *settings) //Save file in string: std::string serienListe((std::istreambuf_iterator(ifs)), std::istreambuf_iterator()); + //Suche alle Möglichkeiten std::string finds = pageManager.grep(serienListe, settings->name, settings->search_IgnoreUpperLower); - serienListe.clear(); + serienListe.clear(); // Speicher freigeben + //Text mit Farben versehen if(!settings->colorless) { for (size_t pos = pageManager.upper_string( finds ).find( pageManager.upper_string( settings->name ), 0); pos != std::string::npos; @@ -211,12 +228,16 @@ int ProgramManager::searchModus(Settings *settings) finds.insert(pos, ( (finds.find(settings->name, pos) == pos) ? "\033[32m" : "\033[36m" ) ).insert(pos + settings->name.length() + strlen("\033[37m"), "\033[0m"); } - + //Ausgabe + if(finds == "") { + std::cout << " => Für '" << settings->name << "' wurde(n) keine Serie(n) gefunden." << std::endl; + return 0; + } std::stringstream strstream(finds); std::string line; - std::cout << "Für '" << settings->name << "' wurde(n) folgende Serie(n) gefunden: " << std::endl; + std::cout << " => Für '" << settings->name << "' wurde(n) folgende Serie(n) gefunden: " << std::endl; while (getline(strstream, line)) { - std::cout << " > " << line.substr(line.find("|", line.find("/")) + 1, line.length() - line.find("|", line.find("/")) -1 ) + std::cout << " > " << line.substr(line.find("|", line.find("/")) + 1, line.length() - line.find("|", line.find("/")) -1 ) << "\t[" << line.substr(line.find("/") + 1, line.find("|", line.find("/")) - line.find("/") - 1) << "]" << ( (line[0] == '|') ? "" : "\t( " + line.substr(0, line.find("|")) + " )" ) << std::endl; } @@ -224,11 +245,138 @@ int ProgramManager::searchModus(Settings *settings) return 0; } +int ProgramManager::infoModus(Settings *settings) +{ + if(settings->name == "") { + std::cout << " => Error: Kein Name angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " info --help“ liefert weitere Informationen." << std::endl; + return 27; + } + + //Führe Function aus, die überprüft ob die serie existiert + std::string nameInUrl = pageManager.checkName(settings->name); + if(nameInUrl == "-1") { + //Wenn nicht, dann fühe noch eine Suche nach ähnlichen durch. + searchModus(settings); + return 25; + } + + //Finde Anzahl der Staffel heraus: + Reply tmp_reply = pageManager.getServerRequest(pageManager.UrlPraefix + nameInUrl); + if(tmp_reply.html == "-1") + return 32; + + //speicher (zahl -1), ab da wo /staffel-x nicht mehr vorkommt + int maxStaffel = pageManager.counterContains(tmp_reply.html, "/staffel-%i"); + + //Um namen der Folge für jede Staffel zu bekommen + for (int staffel = 1; staffel <= maxStaffel; ++staffel) { + Reply tmpReply = pageManager.getServerRequest(pageManager.UrlPraefix + nameInUrl + "/staffel-" + std::to_string(staffel)); + if(tmpReply.html == "-1") + return 40; + std::cout << " > Die Staffel " << staffel << " hat " << pageManager.counterContains(tmp_reply.html, "/episode-%i") << " Folge(n)." << std::endl; + + } + + //Datum & FSK + std::string line = pageManager.grep(tmp_reply.html, " ( Error: Konnte ' ( Error: Konnte 'href=' nicht finden." << std::endl; + return 84; + } else + line.erase(0, pos + 5); + + if( (pos = line.find(">")) == std::string::npos ) { + std::cout << " => Error: Konnte '>' nicht finden." << std::endl; + return 85; + } else if ((pos2 = line.find("")) == std::string::npos ) { + std::cout << " => Error: Konnte '' nicht finden." << std::endl; + return 86; + } + startStopDates[i] = line.substr(pos + 1, pos2 - pos -1); + } + + if( (pos = line.find("data-fsk=\"")) == std::string::npos ) { + std::cout << " => Error: Konnte 'data-fsk=\"' nicht finden." << std::endl; + return 87; + } else if ((pos2 = line.find("\" class=\"fsk")) == std::string::npos ) { + std::cout << " => Error: Konnte '\" class=\"fsk' nicht finden." << std::endl; + return 86; + } + std::string fsk = line.substr(pos + 10, pos2 -pos - 10); + + //Deskription + if( (pos = tmp_reply.html.find("data-full-description=")) == std::string::npos) { + std::cout << " => Error: Konnte 'data-full-description=' nicht finden." << std::endl; + return 83; + } else if ((pos2 = tmp_reply.html.find("\">", pos)) == std::string::npos ) { + std::cout << " => Error: Konnte '\">' nicht finden." << std::endl; + return 86; + } + std::string description = pageManager.replace( pageManager.replace( tmp_reply.html.substr(pos + 23, pos2 - pos - 23), "\n", "" ), "
", "" ); + + //Genres + std::vector genres; + line = pageManager.grep(tmp_reply.html, "\"genre\">"); + if(line == "") { + std::cout << " => Error: Konnte '\"genre\">' nicht finden." << std::endl; + return 87; + } + for (pos = line.find("\"genre\">"); pos != std::string::npos; pos = line.find("\"genre\">", pos + 7)) { + if( (pos2 = line.find("", pos)) == std::string::npos) { + std::cout << " => Error: Konnte '' nicht finden." << std::endl; + return 89; + } + genres.push_back(line.substr(pos + 8, pos2 - pos - 8)); + } + + //CoverLink + line = pageManager.grep(tmp_reply.html, "title=\"Cover"); + if( (pos = line.find("data-src=\"")) == std::string::npos) { + std::cout << " => Error: Konnte 'data-src=\"' nicht finden." << std::endl; + return 90; + } else if ((pos2 = line.find("\"", pos + 10)) == std::string::npos ) { + std::cout << " => Error: Konnte '\"' nicht finden." << std::endl; + return 86; + } + std::string coverLink = line.substr(pos + 10, pos2 - pos -10); + + + + + std::cout << "Produktion von " << startStopDates[0] << " bis " << startStopDates[1] << std::endl + << "FSK: " << fsk << std::endl + << "Cover Bild: " << coverLink << std::endl + << "Genre(s): " << std::flush; + for( const auto &e : genres) + std::cout << e << " "; + + std::cout << std::endl << "\nBeschreibung: " << description << std::endl; + + + + return 0; +} + int ProgramManager::searchModus_update(Settings *settings) { Reply reply = pageManager.getServerRequest("https://s.to/serien"); if(reply.html == "-1") return 21; + else if(reply.html.find("") == std::string::npos ) { + std::cout << " => Error: Konnte in searchModus_update() nicht finden." << std::endl; + return 22; + } std::string serienListe = pageManager.replace( pageManager.grep( reply.html, "data-alternative-title" ), "", "\n" ); @@ -260,8 +408,18 @@ int ProgramManager::searchModus_update(Settings *settings) //...\n|/serie/stream/2012-das-jahr-null"_weg_>2012 - Das Jahr Null|\n... serienListe += line + "\n"; - } serienListe.pop_back(); + } + if(serienListe.length() > 0) + serienListe.pop_back(); + //Anzahl der Serien/Zeilen vorher: + ssize_t countBef = 0; + std::ifstream myFileBef(settings->serienListPath); + if(myFileBef.is_open()) + for(countBef = 0; std::getline(myFileBef,line); countBef++); + myFileBef.close(); + + //Schreibe die Liste in das TextFile std::ofstream ofs(settings->serienListPath, std::ios::trunc); if(!ofs.is_open()) { perror("Konnte SerienListe-Datei nicht öffnen"); @@ -270,6 +428,14 @@ int ProgramManager::searchModus_update(Settings *settings) ofs << serienListe << std::endl; ofs.close(); + //Anzahl der Zeile nachher + ssize_t countAf = 0; + std::ifstream myFileAf(settings->serienListPath); + if(myFileAf.is_open()) + for(countAf = 0; std::getline(myFileAf,line); countAf++); + myFileAf.close(); + + std::cout << "Serienunterschied: " << ( ((countAf - countBef) > 0) ? "+" : "") << countAf - countBef << " Serien." << std::endl; return 0; } @@ -326,7 +492,8 @@ int ProgramManager::convertLink(std::string redirectLink, AccountManager * accou else { std::cout << " => " << orange << "Keinen PASSENDEN Hoster für die Folge " << folgenID << " gefunden." << "\033[0m" << std::endl << "Alle Links:" << std::endl - << allLinks << std::endl; + << pageManager.replace( pageManager.replace( pageManager.replace( allLinks, "data-lang-key=\"1\"", "language=\"GerDub\"" ), + "data-lang-key=\"2\"", "language=\"Eng\"" ), "data-lang-key=\"3\"", "language=\"GerSub\"") << std::endl; if(pageManager.writeToFile(settings->outputFilePath, std::string("Keinen PASSENDEN Hoster für die Folge ") + folgenID + std::string(" gefunden.")) != 0) return 138; } @@ -345,16 +512,16 @@ int ProgramManager::convertLink(std::string redirectLink, AccountManager * accou continue; } else { - std::cout << " => " << folgenID << ": " << green << newUrl << "\033[0m" << std::endl; + std::cout << " => " << folgenID << ( (folgenID == "") ? "" : ": " ) << green << newUrl << "\033[0m" << std::endl; if(settings->outputFilePath != "") - if(pageManager.writeToFile(settings->outputFilePath,folgenID + newUrl) != 0) + if(pageManager.writeToFile(settings->outputFilePath,folgenID + ( (folgenID == "") ? "" : ": " ) + newUrl) != 0) return 108; return 0; } } - std::cout << " => " << folgenID << ": " << red << "https://s.to" << redirectLink << "\033[0m" << std::endl; + std::cout << " => " << folgenID << ( (folgenID == "") ? "" : ": " ) << red << "https://s.to" << redirectLink << "\033[0m" << std::endl; if(settings->outputFilePath != "") - if(pageManager.writeToFile(settings->outputFilePath, folgenID + redirectLink) != 0) + if(pageManager.writeToFile(settings->outputFilePath, folgenID + ( (folgenID == "") ? "" : ": " ) + redirectLink) != 0) return 114; return 0; } diff --git a/g++/programManager.h b/g++/programManager.h index 437f69b..35ac267 100644 --- a/g++/programManager.h +++ b/g++/programManager.h @@ -1,8 +1,8 @@ #ifndef MANAGEPROGRAM_H #define MANAGEPROGRAM_H -#include "parameterManager.h" #include "pageManager.h" +#include "parameterManager.h" #include "accountManager.h" #include @@ -14,13 +14,14 @@ class ProgramManager public: ProgramManager(); ~ProgramManager(); - int start(Settings setting); + int start(Settings *setting); int listDir(std::string &list, std::string path, int maxDepth); private: int defaultModus(Settings * settings); int directLinkModus(Settings * settings); int searchModus(Settings * settings); + int infoModus(Settings * settings); PageManager pageManager; diff --git a/main.cpp b/main.cpp index 2a9d222..7e6a6ac 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,5 @@ -#include "parameterManager.h" #include "programManager.h" +#include "parameterManager.h" int main(int argc, char *argv[]) diff --git a/pageManager.h b/pageManager.h index 152685b..5e41e2c 100644 --- a/pageManager.h +++ b/pageManager.h @@ -3,7 +3,7 @@ #include // if complied for windows; everything is in */projectfolder/curl/ -#include +#include #include #include #include diff --git a/parameterManager.cpp b/parameterManager.cpp index 3e80a6b..2367128 100644 --- a/parameterManager.cpp +++ b/parameterManager.cpp @@ -1,8 +1,11 @@ #include "parameterManager.h" -void setPaths(Settings &settings, std::string executablePathTo) +void setPaths(Settings &settings) { //Path settings + std::string executablePathTo = getexepath(); + std::cout << "Path " << executablePathTo << std::endl; + executablePathTo.erase(executablePathTo.find_last_of(settings.pathSymbol) + 1 , executablePathTo.length() - ( executablePathTo.find_last_of(settings.pathSymbol) + 1) ); if(!dirExists(executablePathTo + "src" + settings.pathSymbol)) @@ -17,32 +20,31 @@ void setPaths(Settings &settings, std::string executablePathTo) } - int manageParameter(Settings &settings, int argc, char **argv) { //Path settings - setPaths(settings, argv[0]); - settings.argv0 = argv[0]; + setPathSymbol(settings); + setPaths(settings); if(argc < 2) { std::cout << " => Error: Keine Unteroption angegeben." << std::endl; - std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl; + std::cout << "„" << getProgramName() << " --help“ liefert weitere Informationen." << std::endl; return 1; } - int res = compare("--help\ndefault\nurl\n--version\nsearch", argv[1]); + int res = compare("--help\ndefault\nurl\n--version\nsearch\ninfo", argv[1]); if(res != 1) { std::cout << " => Error: " << ( (res == 0) ? std::string("Unbekannte Unteroption: '") + argv[1] + "'" : std::string("Mehrere Optionen für '") + argv[1] + std::string("' gefunden.") ) << std::endl; - std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl; + std::cout << "„" << getProgramName() << " --help“ liefert weitere Informationen." << std::endl; return 2; } if(strncmp(argv[1], "--help", strlen(argv[1])) == 0) { argv[1][0] = '\0'; - return unterOption_help(&settings, argv[0]); + return unterOption_help(); } else if (strncmp(argv[1], "default", strlen(argv[1])) == 0) { argv[1][0] = '\0'; @@ -60,9 +62,9 @@ int manageParameter(Settings &settings, int argc, char **argv) argv[1][0] = '\0'; return unterOption_search(&settings, argc, argv); - } else if (false) { - - //return 0; + } else if (strncmp(argv[1], "info", strlen(argv[1])) == 0) { + argv[1][0] = '\0'; + return unterOption_info(&settings, argc, argv); } else { std::cout << "Error: Invalid option " << argv[1] << ", but not detected in compare-Function" << std::endl; @@ -70,9 +72,9 @@ int manageParameter(Settings &settings, int argc, char **argv) } } -int unterOption_help(Settings *, char * argv0) +int unterOption_help() { - std::cout << "Aufruf: " << getProgramName(argv0) << " [Unteroption] [PARAMETER]" << std::endl << std::endl; + std::cout << "Aufruf: " << getProgramName() << " [Unteroption] [PARAMETER]" << std::endl << std::endl; std::cout << "Unteroptionen:" << std::endl << "\t„--help“\tListe aller Unteroptionen" << std::endl << "\t„--version“\tVersion des Programmes" << std::endl @@ -253,11 +255,11 @@ int unterOption_default(Settings *settings, int argc, char ** argv) std::cout << "Debug Modus: true" << std::endl; break; case 'h': - unterOption_default_help(settings, argv[0]); + unterOption_default_help(); return -1; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " default [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " default --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " default --help“ liefert weitere Informationen." << std::endl; return -1; } } @@ -279,9 +281,9 @@ int unterOption_default(Settings *settings, int argc, char ** argv) return 0; } -void unterOption_default_help(Settings *, char * argv0) +void unterOption_default_help() { - std::cout << "Usage: " << getProgramName(argv0) << " default [OPTION]... [NAME]..." << std::endl + std::cout << "Usage: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl << "Parameter:" << std::endl << std::endl << " > Auswahloptionen:" << std::endl << "\t-g [Hoster1,Hoster2,...], --genauer-hoster [Hoster1,Hoster2,...]" << std::endl @@ -395,11 +397,11 @@ int unterOption_url(Settings *settings, int argc, char **argv) std::cout << "Debug Modus: true" << std::endl; break; case 'h': - unterOption_url_help(settings, argv[0]); + unterOption_url_help(); return -1; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " url [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " url --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl; + std::cout << "„" << getProgramName() << " url --help“ liefert weitere Informationen." << std::endl; return 21; } } @@ -423,9 +425,9 @@ int unterOption_url(Settings *settings, int argc, char **argv) return 0; } -void unterOption_url_help(Settings *, char * argv0) +void unterOption_url_help() { - std::cout << "Usage: " << getProgramName(argv0) << " url [OPTION]... [URL]..." << std::endl + std::cout << "Usage: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl << "Parameter:" << std::endl << "\t-p [ProxyAddresse], --socks5-proxy [ProxyAddresse]" << std::endl << "\t -> Type: Socks5, Default: 127.0.0.1:9050" << std::endl @@ -438,22 +440,10 @@ void unterOption_url_help(Settings *, char * argv0) } -int compare(std::string All_Options_with_komma_between, std::string input) -{ - std::istringstream iStrStream( All_Options_with_komma_between + "\n"); - std::string line; - int allFounds = 0; - while (getline(iStrStream, line).good()) - if(strncmp(line.c_str(), input.c_str(), input.length()) == 0) { - allFounds++; - //std::cout << "Unteroption '" << input << "' stimmt mit '" << line << "' überein." << std::endl; - } - return allFounds; -} int unterOption_search(Settings *settings, int argc, char **argv) { - settings->modus = Modus::Search_MODUS; + settings->modus = Modus::SEARCH_MODUS; int c = 0; const option long_opts[] = { @@ -462,7 +452,6 @@ int unterOption_search(Settings *settings, int argc, char **argv) {"help", no_argument, nullptr, 'h'}, {"colorless", no_argument, nullptr, 'c'}, {"debug-mode", no_argument, nullptr, 'd'}, - {"debug-mode", no_argument, nullptr, 'd'}, {"exactly-writing", no_argument, nullptr, 'e'}, {"update", no_argument, nullptr, 'u'}, @@ -497,7 +486,7 @@ int unterOption_search(Settings *settings, int argc, char **argv) } break; case 'h': - unterOption_search_help(settings, argv[0]); + unterOption_search_help(); return -1; case 'c': settings->colorless = true; @@ -520,8 +509,8 @@ int unterOption_search(Settings *settings, int argc, char **argv) std::cout << "Update die Liste: true" << std::endl; break; default: - std::cout << "Aufruf: " << getProgramName(argv[0]) << " search [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(argv[0]) << " search --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " search --help“ liefert weitere Informationen." << std::endl; return 21; } } @@ -543,10 +532,10 @@ int unterOption_search(Settings *settings, int argc, char **argv) return 0; } -void unterOption_search_help(Settings *, char *argv0) +void unterOption_search_help() { - std::cout << "Usage: " << getProgramName(argv0) << " search [OPTION]... [NAME]" << std::endl - << " " << getProgramName(argv0) << " search [-u, --update]" << std::endl + std::cout << "Usage: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl + << " " << getProgramName() << " search [-u, --update]" << std::endl << "Parameter:" << std::endl << "\t-p [Socks5Proxy], --socks5-proxy [Socks5Proxy]" << std::endl << "\t -> Verwende diesen Socks5-Proxy. Default: 127.0.0.1:9050" << std::endl @@ -564,13 +553,147 @@ void unterOption_search_help(Settings *, char *argv0) } +int compare(std::string All_Options_with_komma_between, std::string input) +{ + std::istringstream iStrStream( All_Options_with_komma_between + "\n"); + std::string line; + int allFounds = 0; + while (getline(iStrStream, line).good()) + if(strncmp(line.c_str(), input.c_str(), input.length()) == 0) { + allFounds++; + //std::cout << "Unteroption '" << input << "' stimmt mit '" << line << "' überein." << std::endl; + } + return allFounds; +} + bool dirExists(std::string dir) { struct stat sb; return (stat(dir.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) ? true : false; } -std::string getProgramName(const char *argv0) +std::string getProgramName() { - return std::string(argv0).erase(0, ( (std::string(argv0).find_last_of("/\\") != std::string::npos ) ? std::string(argv0).find_last_of("/\\") +1 : 0 ) ); + return getexepath().erase(0, ( getexepath().find_last_of("/\\") != std::string::npos ) ? getexepath().find_last_of("/\\") +1 : 0 ); +} + + +int unterOption_info(Settings *settings, int argc, char **argv) +{ + settings->modus = Modus::INFO_MODUS; + + int c = 0; + const option long_opts[] = { + {"socks5-proxy", required_argument, nullptr, 'p'}, + + {"help", no_argument, nullptr, 'h'}, + {"colorless", no_argument, nullptr, 'c'}, + {"debug-mode", no_argument, nullptr, 'd'}, + + {nullptr, no_argument, nullptr, 0} + + }; + + while( ( c = getopt_long (argc, argv, "n:p:hcdeu", long_opts, nullptr) ) != -1 ) { + switch(c) { + case 'p': { + if(!optarg || std::string(optarg) == "") + break; + std::string optarg = ::optarg; + if(optarg.find(":") == std::string::npos) { + std::cout << "Invalid Socks5 Proxy: " << optarg << std::endl; + return 31; + } + std::string ip = optarg.substr(0, optarg.find(":")); + std::string portStr = optarg.substr(optarg.find(":") + 1, optarg.length() - optarg.find(":")); + int port = atoi(portStr.c_str()); + if(std::to_string(port) != portStr || port <= 0) { + std::cout << "[-p]: Invalid Port: " << portStr << std::endl; + return 32; + } else if (ip == "") { + std::cout << "[-p]: Invalid Ip Addresse: " << ip << std::endl; + return 34; + } else if(settings->debugMode) { + std::cout << "Proxy Addresse: "<< ip << ":" << port << std::endl; + } + settings->proxy_ip = ip; + settings->proxy_port = port; + } + break; + case 'h': + unterOption_info_help(); + return -1; + case 'c': + settings->colorless = true; + if(settings->debugMode) + std::cout << "Farblos: true" << std::endl; + break; + case 'd': + settings->debugMode = true; + if(settings->debugMode) + std::cout << "Debug Modus: true" << std::endl; + break; + default: + std::cout << "Aufruf: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " info --help“ liefert weitere Informationen." << std::endl; + return 21; + } + } + + //Alle nicht verwendeten Parameter == Name + while (optind < argc) { + if(argv[optind][0]) { + settings->name.append(argv[optind++]).append(" "); + } else + optind++; + } + if(settings->name.length() > 0) + settings->name.pop_back(); + if(settings->debugMode) { + std::cout << "Name: " << settings->name << std::endl; + std::cout << "Modus: Search_MODUS" << std::endl; + } + + return 0; +} + +void unterOption_info_help() +{ + std::cout << "Usage: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl + << "Parameter:" << std::endl + << "\t-p [Socks5Proxy], --socks5-proxy [Socks5Proxy]" << std::endl + << "\t -> Verwende diesen Socks5-Proxy. Default: 127.0.0.1:9050" << std::endl + << "\t-c, --colorless" << std::endl + << "\t -> Gib keine Farbigen Infos aus. Default: false" << std::endl + << "\t-d, --debug-mode" << std::endl + << "\t -> Debug Nachrichten an. Default: false" << std::endl + << "\t-h, --help" << std::endl + << "\t -> Gibt dieses Helpmenü aus." << std::endl; +} + + +std::string getexepath() +{ +#ifdef linux + char result[ PATH_MAX ]; + ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX ); + return std::string( result, (count > 0) ? static_cast(count) : 0 ); +#endif +#ifdef ABC ///_WIN32 + wchar_t result[ MAX_PATH ]; + char buffer[MAX_PATH]; + return std::string( result, GetModuleFileName( NULL, buffer, MAX_PATH ) ); + //GetModuleFileName(NULL, result, MAX_PATH) ; + //return reinterpret_cast(result); +#endif +} + +void setPathSymbol(Settings &settings) +{ +#ifdef linux + settings.pathSymbol = '/'; +#endif +#ifdef _WIN32 + settings.pathSymbol = '\\'; +#endif } diff --git a/parameterManager.h b/parameterManager.h index 1a201ce..2d2f23c 100644 --- a/parameterManager.h +++ b/parameterManager.h @@ -7,11 +7,19 @@ #include #include +#include // PATH_MAX +#include // readlink() + +#ifdef _WIN32 +#include +#endif + enum Modus { EXIT = -1, DEFAULT_MODUS = 0, DIRECT_LINK_MODUS = 1, - Search_MODUS = 2, + SEARCH_MODUS = 2, + INFO_MODUS = 3 }; @@ -31,8 +39,7 @@ struct Settings { version = "2.1.2", outputFilePath = "", default_checkDirPath = "", - default_Searchmuster = "S%Staffel%E%Folge%", - argv0 = ""; + default_Searchmuster = "S%Staffel%E%Folge%"; Modus modus = Modus::DEFAULT_MODUS; bool colorless = false, @@ -45,27 +52,33 @@ struct Settings { stopSeason = 0, proxy_port = 9050, default_maxDirs = 20; - const char pathSymbol = '/'; + char pathSymbol = '/'; }; int manageParameter(Settings &settings, int argc, char ** argv); -std::string getProgramName(const char * argv0); +std::string getProgramName(); int compare(std::string All_Options_with_komma_between, std::string input); -void setPaths(Settings &settings, std::string executablePathTo); +void setPaths(Settings &settings); bool dirExists(std::string dir); -int unterOption_help(Settings * settings, char *argv0); +std::string getexepath(); +void setPathSymbol(Settings &settings); + + +int unterOption_help(); int unterOption_default(Settings * settings, int argc, char **argv); -void unterOption_default_help(Settings * settings, char * argv0); +void unterOption_default_help(); int unterOption_url(Settings * settings, int argc, char **argv); -void unterOption_url_help(Settings * settings, char *argv0); +void unterOption_url_help(); int unterOption_search(Settings * settings, int argc, char **argv); -void unterOption_search_help(Settings * settings, char *argv0); +void unterOption_search_help(); +int unterOption_info(Settings * settings, int argc, char **argv); +void unterOption_info_help(); #endif // PARAMETERMANAGER_H diff --git a/programManager.cpp b/programManager.cpp index 72e7869..ef60211 100644 --- a/programManager.cpp +++ b/programManager.cpp @@ -21,8 +21,10 @@ int ProgramManager::start(Settings *settings) return defaultModus(settings); case Modus::DIRECT_LINK_MODUS: return directLinkModus(settings); - case Modus::Search_MODUS: + case Modus::SEARCH_MODUS: return searchModus(settings); + case Modus::INFO_MODUS: + return infoModus(settings); default: return -1; } @@ -45,8 +47,8 @@ int ProgramManager::defaultModus(Settings *settings) } } if(settings->name == "") { std::cout << " => Error: Kein Name angegeben." << std::endl; - std::cout << "Aufruf: " << getProgramName(settings->argv0.c_str()) << " default [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(settings->argv0.c_str()) << " default --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " default [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " default --help“ liefert weitere Informationen." << std::endl; return 27; } } @@ -156,8 +158,8 @@ int ProgramManager::directLinkModus(Settings *settings) if(settings->name == "") { std::cout << " => Error: Kein(e) Link(s) angegeben." << std::endl; - std::cout << "Aufruf: " << getProgramName(settings->argv0.c_str()) << " url [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(settings->argv0.c_str()) << " url --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " url [OPTION]... [URL]..." << std::endl; + std::cout << "„" << getProgramName() << " url --help“ liefert weitere Informationen." << std::endl; return 76; } @@ -191,8 +193,8 @@ int ProgramManager::searchModus(Settings *settings) } else if(settings->name == "") { std::cout << " => Error: Kein Name angegeben." << std::endl; - std::cout << "Aufruf: " << getProgramName(settings->argv0.c_str()) << " search [PARAMETER]" << std::endl; - std::cout << "„" << getProgramName(settings->argv0.c_str()) << " search --help“ liefert weitere Informationen." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " search [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " search --help“ liefert weitere Informationen." << std::endl; return 27; } @@ -243,6 +245,129 @@ int ProgramManager::searchModus(Settings *settings) return 0; } +int ProgramManager::infoModus(Settings *settings) +{ + if(settings->name == "") { + std::cout << " => Error: Kein Name angegeben." << std::endl; + std::cout << "Aufruf: " << getProgramName() << " info [OPTION]... [NAME]..." << std::endl; + std::cout << "„" << getProgramName() << " info --help“ liefert weitere Informationen." << std::endl; + return 27; + } + + //Führe Function aus, die überprüft ob die serie existiert + std::string nameInUrl = pageManager.checkName(settings->name); + if(nameInUrl == "-1") { + //Wenn nicht, dann fühe noch eine Suche nach ähnlichen durch. + searchModus(settings); + return 25; + } + + //Finde Anzahl der Staffel heraus: + Reply tmp_reply = pageManager.getServerRequest(pageManager.UrlPraefix + nameInUrl); + if(tmp_reply.html == "-1") + return 32; + + //speicher (zahl -1), ab da wo /staffel-x nicht mehr vorkommt + int maxStaffel = pageManager.counterContains(tmp_reply.html, "/staffel-%i"); + + //Um namen der Folge für jede Staffel zu bekommen + for (int staffel = 1; staffel <= maxStaffel; ++staffel) { + Reply tmpReply = pageManager.getServerRequest(pageManager.UrlPraefix + nameInUrl + "/staffel-" + std::to_string(staffel)); + if(tmpReply.html == "-1") + return 40; + std::cout << " > Die Staffel " << staffel << " hat " << pageManager.counterContains(tmp_reply.html, "/episode-%i") << " Folge(n)." << std::endl; + + } + + //Datum & FSK + std::string line = pageManager.grep(tmp_reply.html, " ( Error: Konnte ' ( Error: Konnte 'href=' nicht finden." << std::endl; + return 84; + } else + line.erase(0, pos + 5); + + if( (pos = line.find(">")) == std::string::npos ) { + std::cout << " => Error: Konnte '>' nicht finden." << std::endl; + return 85; + } else if ((pos2 = line.find("")) == std::string::npos ) { + std::cout << " => Error: Konnte '' nicht finden." << std::endl; + return 86; + } + startStopDates[i] = line.substr(pos + 1, pos2 - pos -1); + } + + if( (pos = line.find("data-fsk=\"")) == std::string::npos ) { + std::cout << " => Error: Konnte 'data-fsk=\"' nicht finden." << std::endl; + return 87; + } else if ((pos2 = line.find("\" class=\"fsk")) == std::string::npos ) { + std::cout << " => Error: Konnte '\" class=\"fsk' nicht finden." << std::endl; + return 86; + } + std::string fsk = line.substr(pos + 10, pos2 -pos - 10); + + //Deskription + if( (pos = tmp_reply.html.find("data-full-description=")) == std::string::npos) { + std::cout << " => Error: Konnte 'data-full-description=' nicht finden." << std::endl; + return 83; + } else if ((pos2 = tmp_reply.html.find("\">", pos)) == std::string::npos ) { + std::cout << " => Error: Konnte '\">' nicht finden." << std::endl; + return 86; + } + std::string description = pageManager.replace( pageManager.replace( tmp_reply.html.substr(pos + 23, pos2 - pos - 23), "\n", "" ), "
", "" ); + + //Genres + std::vector genres; + line = pageManager.grep(tmp_reply.html, "\"genre\">"); + if(line == "") { + std::cout << " => Error: Konnte '\"genre\">' nicht finden." << std::endl; + return 87; + } + for (pos = line.find("\"genre\">"); pos != std::string::npos; pos = line.find("\"genre\">", pos + 7)) { + if( (pos2 = line.find("", pos)) == std::string::npos) { + std::cout << " => Error: Konnte '' nicht finden." << std::endl; + return 89; + } + genres.push_back(line.substr(pos + 8, pos2 - pos - 8)); + } + + //CoverLink + line = pageManager.grep(tmp_reply.html, "title=\"Cover"); + if( (pos = line.find("data-src=\"")) == std::string::npos) { + std::cout << " => Error: Konnte 'data-src=\"' nicht finden." << std::endl; + return 90; + } else if ((pos2 = line.find("\"", pos + 10)) == std::string::npos ) { + std::cout << " => Error: Konnte '\"' nicht finden." << std::endl; + return 86; + } + std::string coverLink = line.substr(pos + 10, pos2 - pos -10); + + + + + std::cout << "Produktion von " << startStopDates[0] << " bis " << startStopDates[1] << std::endl + << "FSK: " << fsk << std::endl + << "Cover Bild: " << coverLink << std::endl + << "Genre(s): " << std::flush; + for( const auto &e : genres) + std::cout << e << " "; + + std::cout << std::endl << "\nBeschreibung: " << description << std::endl; + + + + return 0; +} + int ProgramManager::searchModus_update(Settings *settings) { Reply reply = pageManager.getServerRequest("https://s.to/serien"); diff --git a/programManager.h b/programManager.h index 10d6371..35ac267 100644 --- a/programManager.h +++ b/programManager.h @@ -1,8 +1,8 @@ #ifndef MANAGEPROGRAM_H #define MANAGEPROGRAM_H -#include "parameterManager.h" #include "pageManager.h" +#include "parameterManager.h" #include "accountManager.h" #include @@ -21,6 +21,7 @@ private: int defaultModus(Settings * settings); int directLinkModus(Settings * settings); int searchModus(Settings * settings); + int infoModus(Settings * settings); PageManager pageManager; diff --git a/release/LIBCURL.DLL b/release/LIBCURL.DLL new file mode 100755 index 0000000..fee2bf0 Binary files /dev/null and b/release/LIBCURL.DLL differ