#include "parameterManager.h" Settings manageParameter(int argc, char **argv) { Settings settings; if(argc < 2) { std::cout << "Keine Optionen angegeben." << std::endl; std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; std::cout << "„" << getProgramName(argv[0]) << " (Unteroption) --help“ liefert weitere Informationen." << std::endl; settings.modus = Modus::EXIT; return settings; } if(strcmp(argv[1], "--help") == 0) { argv[1][0] = '\0'; unterOption_help(&settings, argv[0]); return settings; } else if (strcmp(argv[1], "default") == 0) { argv[1][0] = '\0'; unterOption_default(&settings, argc, argv); return settings; } else if (strcmp(argv[1], "url") == 0) { argv[1][0] = '\0'; unterOption_url(&settings, argc, argv); return settings; } else if (strcmp(argv[1], "--version") == 0) { std::cout << "Version 0.1.0" << std::endl; settings.modus = Modus::EXIT; return settings; } else { std::cout << "Unbekannte Unteroption: '" << argv[1] << "'" << std::endl; std::cout << "Aufruf: " << getProgramName(argv[0]) << " [Unteroption] [PARAMETER]" << std::endl; std::cout << "„" << getProgramName(argv[0]) << " (Unteroption) --help“ liefert weitere Informationen." << std::endl; settings.modus = Modus::EXIT; return settings; } if(argc < 2) { std::cout << " => Kein Name angegeben" << std::endl; settings.modus = Modus::EXIT; return settings; } settings.name = argv[1]; const option long_opts[] = { {"name", required_argument, nullptr, 'n'}, {"output-file", required_argument, nullptr, 'o'}, {"genau", required_argument, nullptr, 'g'}, {"ip", required_argument, nullptr, 'i'}, {"port", required_argument, nullptr, 'p'}, {"episode", required_argument, nullptr, 'e'}, {"end-episode", required_argument, nullptr, 'E'}, {"season", required_argument, nullptr, 's'}, {"end-season", required_argument, nullptr, 'S'}, {"depth", required_argument, nullptr, 'D'}, {"check-path", required_argument, nullptr, 'c'}, {"muster", required_argument, nullptr, 'm'}, {"infos", required_argument, nullptr, 'y'}, {"list", required_argument, nullptr, 'l'}, {"file", required_argument, nullptr, 'f'}, {"search", required_argument, nullptr, 'b'}, {"limit-dir", required_argument, nullptr, 'L'}, {"languages", required_argument, nullptr, 't'}, {"only-one", no_argument, nullptr, 'd'}, {"window", no_argument, nullptr, 'w'}, {"hide", no_argument, nullptr, 'h'}, {"remove-number", no_argument, nullptr, 'H'}, {"no-color", no_argument, nullptr, 'C'}, {"version", no_argument, nullptr, 'v'}, {"v-check", no_argument, nullptr, 'V'}, {"help", no_argument, nullptr, 'M'}, {nullptr, no_argument, nullptr, 0} }; /* int c = 0; while( ( c = getopt_long (argc, argv, "n:o:g:i:p:e:E:s:S:D:c:m:y:l:f:b:L:t:dwhHCvVM", long_opts, nullptr) ) != -1 ) { switch(c) { case 'n': //Name der Serie if(optarg) { settings.name=optarg; if(settings.name.find("/") != std::string::npos || settings.name.find("@") != std::string::npos || settings.name == "" ) { std::cout << " => Error: -n: Invalid Name: \"" << settings.Name.toStdString() << "\"." << std::endl; se; } } break; case 'o': //Path zu Outputfile if(optarg) settings.OutputFile= optarg; break; case 'g': //Genaue Hoster if(optarg) { if(!hasRevomedDefauldHoster) { settings.GenaueHoster.clear(); hasRevomedDefauldHoster=true; } settings.GenaueHoster+= QString(optarg).replace("\n",",") + QString(","); } break; case 'i': //Ip Addresse for own Proxy settings if(optarg) settings.Proxy_IP= optarg; settings.Proxy_IP.replace("localhost","127.0.0.1"); if(!settings.Proxy_IP.contains(".")) { std::cout << " => Error: -i: Invalid Ip Addresse: \"" << settings.Proxy_IP.toStdString() << "\"." << std::endl; return 38; } break; case 'p': //Port for own Proxy settings if(optarg) { settings.Proxy_Port= QString(optarg); char* p; strtol(settings.Proxy_Port.toStdString().c_str(), &p, 10); if (*p) { std::cout << "\33[2K\r" << " => Error: -p: Invalid Port: "<< settings.Proxy_Port.toStdString() << " ist keine Zahl." << std::endl; return 75; } else if(settings.Proxy_Port.toInt() < 0) { std::cout << "\33[2K\r" << " => Error: -p: Port ist negativ: \"" << settings.Proxy_Port.toStdString() << "\"." << std::endl; return 79; } } break; case 'w': //Shows the MainWindow settings.show=true; break; case 'h': //Verbirgt ein Paar Infos(auch die redirect Links) settings.hide=true; break; case 'e': //Startet mit dieser Episode if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.StarteMitDieserFolge=static_cast(L); if (*p) { std::cout << " => Error: -e: Starterfolge ist keine Zahl: \"" << optarg << "\"." << std::endl; return 56; } else if(settings.StarteMitDieserFolge==0) { std::cout << " => Error: -e: Starterfolge ist 0." << std::endl; return 78; } else if(settings.StarteMitDieserFolge < 0) { std::cout << " => Error: -e: Starterfolge ist negativ: \"" << settings.StarteMitDieserFolge << "\"."<< std::endl; return 91; } } break; case 's': //Startet mit dieser Staffel if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.StarteMitDieserStaffel=static_cast(L); if (*p) { std::cout << " => Error: -s: Starterstaffel ist keine Zahl: \"" << optarg << "\"." << std::endl; return 57; } else if(settings.StarteMitDieserStaffel==0) { std::cout << " => Error: -s: Starterstaffel ist 0." << std::endl; return 79; } else if(settings.StarteMitDieserStaffel < 0) { std::cout << " => Error: -s: Starterstaffel ist negativ: \"" << settings.StarteMitDieserStaffel << "\"." << std::endl; return 92; } } break; case 'E': //Stop mit dieser Folge if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.StopNachFolge=static_cast(L); if (*p) { std::cout << " => Error: -E: Folge zum Stoppen ist keine Zahl: \"" << optarg << "\"." << std::endl; return 58; } else if(settings.StopNachFolge <= 0) { std::cout << " => Warnung: -E: Unmögliche Folge zum Stoppen: \"" << settings.StopNachFolge << "\"." << std::endl; } } break; case 'S': //Stopt mit dieser Staffel if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.StopNachStaffel=static_cast(L); if (*p ) { std::cout << " => Error: -S: Staffel zum Stoppen ist keine Zahl: \"" << optarg << "\"." << std::endl; return 59; } else if(settings.StopNachStaffel <= 0) { std::cout << " => Warnung: -S: Unmögliche Staffel zum Stoppen: \"" << settings.StopNachStaffel << "\"."<< std::endl; } } break; case 'd': //Macht nur 1nen genuaen Hoster pro Folge settings.OnlyOneHoster=true; break; case 'f': //Nimmt die Redirect Links von Parameter oder dem Path zu TextFile //UseFile=true; if(optarg) settings.PathToFile=optarg; break; case 'c': //Überprüft ob die Folge schon in dem Path exestiert if(optarg) { settings.CheckDir = optarg; } settings.use_default_with_check=true; break; case 'm': //Muster für das überprüfen ob ide Folge schon exestiert if(optarg) { if(std::string(optarg) == "all") { settings.Muster="S#Staffel#E#Folge#"; break; } settings.Muster = optarg; } break; case 'l': //Listet alle Fehlenden Folgen in diesem Pfad auf if(optarg) { settings.CheckDir = optarg; } settings.use_checkmissing=true; break; case 'y': //Listet alle Staffel und deren Folgenanzahl einer Staffel auf settings.ShowSeans=true; if(optarg) { settings.Name=optarg; if(settings.Name.contains("/") || settings.Name.contains("@") || settings.Name.toStdString() == "") { std::cout << " => Error: -y: Invalid Name: \"" << settings.Name.toStdString() << "\"." << std::endl; return 2; } } break; case 'b': settings.SearchWindow=true; if(optarg) { settings.Name=optarg; if(settings.Name.contains("/") || settings.Name.contains("@") || settings.Name.toStdString() == "" ) { std::cout << " => Error: -b: Invalid Name: \"" << settings.Name.toStdString() << "\"." << std::endl; return 2; } } break; case 'L': if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.maxdir=static_cast(L); if (*p) { std::cout << " => Error: -L: Maximale Anzahl zu durchsuchende Ordner ist keine Zahl: \"" << optarg << "\"." << std::endl; return 56; } else if(settings.maxdir==0) { std::cout << " => Error: -L: Maximale Anzahl zu durchsuchende Ordner ist 0." << std::endl; return 78; } else if(settings.maxdir < 0) { std::cout << " => Error: -L: Maximale Anzahl zu durchsuchende Ordner ist negativ: \"" << settings.StarteMitDieserFolge << "\"."<< std::endl; return 91; } } break; case 'v': std::cout << " => Version: " << Version.toStdString() << std::endl; return 0; case 'D': if(optarg) { char* p; long L = strtol(optarg, &p, 10); settings.Searchdepth=static_cast(L); if (*p ) { std::cout << " => Error: Suchtiefe ist keine Zahl: \"" << optarg << "\"." << std::endl; return 29; } else if(settings.Searchdepth <= 0) { std::cout << " => Error: Suchtiefe ist kleiner gleich 0: \"" << settings.Searchdepth << "\"." << std::endl; return 96; } } break; case 'V': settings.CheckVersion=true; break; case 'C': settings.Color=false; break; case 'H': settings.BigHide=true; break; case 't': if(optarg) { settings.Languages=QString(optarg); } break; case 'M': listHelpmenue(); return 0; default: //Falsche eingabe std::cout << "Aufruf: S_New2 [PARAMETER]" << std::endl; std::cout << "„S_New2 --help“ liefert weitere Informationen." << std::endl; return 0; } } if(settings.GenaueHoster.lastIndexOf(',') != -1 && hasRevomedDefauldHoster) settings.GenaueHoster.remove(settings.GenaueHoster.lastIndexOf(','),1); return settings;*/ } void listHelpmenue() { std::cout << "Aufruf: S_New2 [PARAMETER]" << std::endl << std::endl << "ALGEMEINE PARAMETER:" << std::endl << std::endl << "\t-n [Name], --name [Name] " << std::endl << "\t\tMit diesem Paramter gibt man den Namen einer Serie an." << std::endl << "\t\tBei -c oder -l kann dieser Parameter weggelassen werden," << std::endl << "\t\tfalls der Ordnername gleicher des Seriennamens ist." << std::endl << std::endl << "\t-o [Pfad], --output-file [Pfad]" << std::endl << "\t\tMit diesem Parameter gibt man den Pfad zu einem Text File an," << std::endl << "\t\tdas nicht exestieren muss, in das alle genauen Links" << std::endl << "\t\tgeschrieben werden sollen." << std::endl << std::endl << "\t-g [Hoster Name], --genau [Hoster Name]" << std::endl << "\t\tMit diesem Paramter gibt man die genauen Hoster, also die" << std::endl << "\t\tRedirect Links, die zu den Links der Hoster umgewandelt" </dev/null am Ende verbirgt zusätzlich Infos." << std::endl << std::endl << "\t-H, --remove-number" << std::endl << "\t\tMit diesem Parameter werden die Staffel und Folgenangaben" << std::endl << "\t\tbei den genauen Links verborgen. Auch bei: -o" << std::endl << std::endl << "\t-D [Tiefe], --depth [Tiefe]" << std::endl << "\t\tMit diesem Parameter kann man die Maximale Suchtiefe" << std::endl << "\t\tvom durchsuchen der Ordner festlgen. Default: 4" << std::endl << std::endl << "\t-C, --no-color" << std::endl << "\t\tMit diesem Parameter kann man die Farbe ausschalten." << std::endl << std::endl << "\t-m [Muster], --muster [Muster]" << std::endl << "\t\tMit diesem Parameter kann man das Muster verändern, mit dem" << std::endl << "\t\tÜberprüft wird, ob eine Folge exestiert." << std::endl << "\t\t#Staffel# == Variable für die Staffel." << std::endl << "\t\t#Folge# == Variable für die Folge." << std::endl << "\t\tStandert Muster ist: S#Staffel#E#Folge#.mp4" << std::endl << "\t\tonly \"all\" == ignore Format bei Deafault ==> S#Staffel#E#Folge#" << std::endl << std::endl << "\t-L [Anzahl], --limit-dir [Anzahl]" << std::endl << "\t\tMit diesem Parameter kann man die maximale Anzahl an" << std::endl << "\t\tOrdnern angeben, die bei -c oder -l durchsucht werden." << std::endl << "\t\tDefault: 100" << std::endl << std::endl << "\t-t [Languages], --languages [Languages]" << std::endl << "\t\tMit diesem Parameter kann man die Sprachen festlegen." << std::endl << "\t\tDie Wichtigste zuert. [ GerDub | GerSub | Eng ] möglich." << std::endl << "\t\tKommagetrennt schreiben. Default: GerDub,GerSub,Eng" << std::endl << std::endl << "FUNKTIONEN:" << std::endl << std::endl << "\t-n [Name], --name [Name]" << std::endl << "\t\tDefault Modus:" << std::endl << "\t\tParams: -n -o -g -d -i -p -w -e -E -s -S -h -H -C -t" << std::endl << std::endl << "\t-c [Pfad], --check-path [Pfad]" << std::endl << "\t\tMit diesem Parameter kann man einen Ordner angeben, indem" << std::endl << "\t\tbereits gedownloadetet Folgen sind. Das Programm überprüft dann," << std::endl << "\t\tbevor es einen Redirect Link zu einem Hoster Link macht, ob" << std::endl << "\t\tdiese Folge in dem Ordner ist. Kein -n nötig, falls der" << std::endl << "\t\tOrdnername gleich dem Seriennamen ist. Es verwendet beim" << std::endl << "\t\tüberprüfen, ob eine Folge exestiert, das Muster von -m." << std::endl << "\t\tAuch verwendbar mit *: /hom*/*/Dow*/ für /home/User/Downloads/." << std::endl << "\t\tParams: -n -o -g -d -i -p -w -e -E -s -S -h -H -D -C -m -L -t" << std::endl << std::endl << "\t-y [Name], --infos [Name]" << std::endl << "\t\tMit diesem Parameter werden alle Staffeln einer Serie und deren" << std::endl << "\t\tFolgen aufgelistet. Zusätzlich werden alle Namen der Folgen" << std::endl << "\t\taufgelistet.Namen werden verborgen mit -h." << std::endl << "\t\tParams: -n -o -i -p -w -h" << std::endl << std::endl << "\t-l [Pfad], --list [Pfad]" << std::endl << "\t\tMit diesem Parameter werden alle fehlenden Folgen in einem" << std::endl << "\t\tOrdner aufgelistet. Kein -n nötig, falls der Ordnername gleich" << std::endl << "\t\tdem Seriennamen ist." << std::endl << "\t\tAuch verwendbar mit *: /hom*/*/Dow*/ für /home/User/Downloads/." << std::endl << "\t\tParams: -n -o -i -p -w -e -E -s -S -h -D -C -m -L" << std::endl << std::endl << "\t-f [Pfad/Url], --file [Pfad/Url] " << std::endl << "\t\tMit diesem Parameter werden entweder alle Redirect-Links aus dem" << std::endl << "\t\tim Parameter angegedenen Text File umgewandelt, oder direkt der" << std::endl << "\t\tim Parameter angegebene Redirect-Link. Mehrere mit Komma" << std::endl << "\t\tgetrennt schreiben." << std::endl << "\t\tParams: -o -i -p -w -h" << std::endl << std::endl << "\t-b [Name], --search [Name]" << std::endl << "\t\tSucht Serien mit diesem Namen." << std::endl << "\t\tParams: -n -i -p -w -C" << std::endl << std::endl << "\t-v, --version" << std::endl << "\t\tGibt die Verison des Programmes aus." << std::endl << std::endl << "\t-V, --v-check" << std::endl << "\t\tGibt die Version des Programmes & die neuste Version" << std::endl <<"\t\tdes Programmes aus." << std::endl << std::endl << "\t-M, --help" << std::endl << "\t\tGibt diese Helpmenü aus." << std::endl << std::endl << std::endl << std::endl << "EINSTELLUNGEN/ACCOUNTS:" << std::endl << std::endl << "In dem Pfad " << getenv("HOME") << "/.config/S_New2/ sind Folgene Dateien:" << std::endl << " => */Accounts:" << std::endl << " In diesem File werden die s.to Accounts gespeichert." << std::endl << " Eigene Accounts können hinzugefügt werden." << std::endl << " => */Account_Number:" << std::endl << " In diesem File wird die Nummer des zuletzt verwendeten" << std::endl << " Accounts gespeichert, um zu verhindern, dass 1 Account" << std::endl << " die ganze Zeit verwendet wird und dann Captchas kommen." << std::endl << " => */Defaults:" << std::endl << " In diesem File kann man standert einstellungen festlegen." << std::endl << " Zeilen ohne = werden ignoriert. Wenn nach dem = nichts ist," << std::endl << " Wird die Einstellung auch ignoriert." << std::endl << " Mit noD als erstem Parameter kann man das Default File ignorieren." << std::endl << std::endl; } void unterOption_help(Settings *settings, char * argv0) { std::cout << "Aufruf: " << getProgramName(argv0) << " [Unteroption] [PARAMETER]" << std::endl << std::endl; std::cout << "Unteroptionen:" << std::endl << "\t„--help“" << std::endl << "\t„default“" << std::endl << "\t„url“" << std::endl << "\t„--version“" << std::endl; settings->modus = Modus::EXIT; } void unterOption_default(Settings *settings, int argc, char ** argv) { settings->modus = Modus::DEFAULT_MODUS; int c = 0; const option long_opts[] = { {"name", required_argument, nullptr, 'n'}, {"ip-addresse", required_argument, nullptr, 'i'}, {"port", required_argument, nullptr, 'p'}, {"genauer-hoster", required_argument, nullptr, 'g'}, {"languages", required_argument, nullptr, 'l'}, {"output-file", required_argument, nullptr, 'o'}, {"help", no_argument, nullptr, 'h'}, {"colorless", no_argument, nullptr, 'c'}, {nullptr, no_argument, nullptr, 0} }; while( ( c = getopt_long (argc, argv, "n:i:p:g:l:o:hc", long_opts, nullptr) ) != -1 ) { switch(c) { case 'n': if(optarg) settings->name = optarg; break; case 'i': if(optarg) settings->proxy_ip = optarg; break; case 'p': if(optarg) settings->proxy_port = std::to_string( atoi( optarg ) ); if(settings->proxy_port != optarg) { std::cout << "Invalid Port: " << optarg << std::endl; settings->modus = Modus::EXIT; return; } break; case 'g': if(optarg) settings->genaueHoster =+ optarg + std::string(","); break; case 'l': if(optarg) settings->languages =+ optarg + std::string(","); break; case 'o': if(optarg) settings->outputFilePath = optarg; break; case 'c': settings->colorless = true; break; case 'h': unterOption_default_help(settings, argv[0]); return; default: std::cout << "Aufruf: " << getProgramName(argv[0]) << " default [PARAMETER]" << std::endl; std::cout << "„" << getProgramName(argv[0]) << " default --help“ liefert weitere Informationen." << std::endl; settings->modus = Modus::EXIT; return; } } } void unterOption_default_help(Settings *settings, char * argv0) { std::cout << getProgramName(argv0) << " default: " << std::endl << "\t-n, --name \t\t[Name]" << std::endl << "\t-i, --ip-addresse \t[IP]\t\t\t Default: 127.0.0.1" << std::endl << "\t-p, --port \t\t[Port]\t\t\t Default: 9050" << std::endl << "\t-g, --genauer-hoster \t[Hoster1,Hoster2,...]" << std::endl << "\t-l, --languages \t[GerSub/GerDub/Eng,...]\t Default: GerDub,GerSub,Eng" << std::endl << "\t-o, --output-file \t[Pfad]" << std::endl << "\t-c, --colorless\t\t\t\t\t Default: false" << std::endl << "\t-h, --help" << std::endl; settings->modus = Modus::EXIT; } void unterOption_url(Settings *settings, int argc, char **argv) { settings->modus = Modus::DIRECT_LINK_MODUS; int c = 0; const option long_opts[] = { {"url", required_argument, nullptr, 'u'}, {"help", no_argument, nullptr, 'h'}, {nullptr, no_argument, nullptr, 0} }; while( ( c = getopt_long (argc, argv, "u:h", long_opts, nullptr) ) != -1 ) { switch(c) { case 'u': if(optarg) settings->name = optarg; break; case 'h': unterOption_url_help(settings, argv[0]); return; default: std::cout << "Aufruf: " << getProgramName(argv[0]) << " url [PARAMETER]" << std::endl; std::cout << "„" << getProgramName(argv[0]) << " url --help“ liefert weitere Informationen." << std::endl; settings->modus = Modus::EXIT; return; } } } void unterOption_url_help(Settings *settings, char * argv0) { std::cout << getProgramName(argv0) <<" url: " << std::endl << "\t-u, --url [Url1,Url2]" << std::endl << "\t-h, --help" << std::endl; settings->modus = Modus::EXIT; } 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 ) ); }