forked from markus/S_New4
11_8_19
This commit is contained in:
BIN
g++/S_New4
BIN
g++/S_New4
Binary file not shown.
@ -41,12 +41,11 @@ Reply PageManager::getServerRequest(std::string Url, bool useCookies, std::strin
|
||||
char *url;
|
||||
std::string returnUrl;
|
||||
|
||||
std::cout << "Lade: '" << Url << "'...";
|
||||
std::cout.flush();
|
||||
std::cout << "Lade: '" << Url << "'..." << std::flush;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(!curl) {
|
||||
perror("\33[2K\rError: Curl easy init failed");
|
||||
perror("\33[2K\r => Error: Curl easy init failed");
|
||||
return Reply("-1");
|
||||
}
|
||||
|
||||
@ -68,16 +67,14 @@ Reply PageManager::getServerRequest(std::string Url, bool useCookies, std::strin
|
||||
for (int timeout = 1; timeout <= maxTimeout; ++timeout) {
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
std::cout << "\33[2K\r";
|
||||
std::cout.flush();
|
||||
std::cout << "\33[2K\r" << std::flush;
|
||||
|
||||
if(res != CURLE_OK) {
|
||||
if(timeout == maxTimeout) {
|
||||
perror((std::string("Error: curl_easy_perform() failed: ") + curl_easy_strerror(res)).c_str());
|
||||
perror((std::string(" => Error: curl_easy_perform() failed: ") + curl_easy_strerror(res)).c_str());
|
||||
return Reply("-1");
|
||||
} else {
|
||||
std::cout << "\33[2K\r" << "Warning: Versuch " << timeout << " von " << maxTimeout << ": curl_easy_perform() failed: " << curl_easy_strerror(res);
|
||||
std::cout.flush();
|
||||
std::cout << "\33[2K\r" << " => Warning: Versuch " << timeout << " von " << maxTimeout << ": curl_easy_perform() failed: " << curl_easy_strerror(res) << std::flush;
|
||||
sleep(1);
|
||||
}
|
||||
} else {
|
||||
@ -89,7 +86,7 @@ Reply PageManager::getServerRequest(std::string Url, bool useCookies, std::strin
|
||||
//Get Url
|
||||
res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
|
||||
if( res != CURLE_OK || !url ) {
|
||||
perror((std::string("Error: curl_easy_getinfo failed: ") + curl_easy_strerror(res)).c_str());
|
||||
perror((std::string(" => Error: curl_easy_getinfo failed: ") + curl_easy_strerror(res)).c_str());
|
||||
return Reply("-1");
|
||||
} else
|
||||
returnUrl=url;
|
||||
@ -104,24 +101,24 @@ Reply PageManager::getServerRequest(std::string Url, bool useCookies, std::strin
|
||||
int PageManager::login(Account account)
|
||||
{
|
||||
if(debugMode)
|
||||
std::cout << "Melde mit neuem Account an: Email: " << account.Email << " Passowort: " << account.Password << std::endl;
|
||||
std::cout << " > Melde mit neuem Account an: Email: " << account.Email << " Passowort: " << account.Password << std::endl;
|
||||
|
||||
std::string html = getServerRequest("https://s.to/login", false, std::string("email=" + account.Email + "&password=" + account.Password), true ).html;
|
||||
if(html == "" )
|
||||
return 0;
|
||||
else if (html.find("Das Feld Email muss eine gültige E-Mail-Adresse enthalten.") != std::string::npos)
|
||||
std::cout << "Error: Login failed: Das Feld Email muss eine gültige E-Mail-Adresse enthalten." << std::endl
|
||||
std::cout << " => Error: Login failed: Das Feld Email muss eine gültige E-Mail-Adresse enthalten." << std::endl
|
||||
<< " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl;
|
||||
else if (html.find("Das Passwort ist nicht korrekt") != std::string::npos)
|
||||
std::cout << "Error: Login failed: Das Passwort ist nicht korrekt." << std::endl
|
||||
std::cout << " => Error: Login failed: Das Passwort ist nicht korrekt." << std::endl
|
||||
<< " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl;
|
||||
else if (html.find("Ein Account mit dieser E-Mail Adresse wurde nicht gefunden.") != std::string::npos)
|
||||
std::cout << "Error: Login failed: Ein Account mit dieser E-Mail Adresse wurde nicht gefunden." << std::endl
|
||||
std::cout << " => Error: Login failed: Ein Account mit dieser E-Mail Adresse wurde nicht gefunden." << std::endl
|
||||
<< " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl;
|
||||
else if(html == "-1")
|
||||
return -1;
|
||||
else
|
||||
std::cout << "Error: Login failed: Keine Weiterleitung bei Login." << std::endl
|
||||
std::cout << " => Error: Login failed: Keine Weiterleitung bei Login." << std::endl
|
||||
<< " Email: '" << account.Email << "' Passwort: '" << account.Password << "'" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
@ -134,14 +131,14 @@ std::string PageManager::getUrlAfterRedirect(std::string Url)
|
||||
std::string PageManager::checkName(std::string Name)
|
||||
{
|
||||
std::string name = replace(Name, " ", "-");
|
||||
std::cout << "Name: " << name << std::endl;
|
||||
std::cout << " > Name: " << name << std::endl;
|
||||
|
||||
std::string html = getServerRequest("https://s.to/serie/stream/" + name).html;
|
||||
if(html.find("Die gewünschte Serie wurde nicht gefunden oder ist im Moment deaktiviert.") != std::string::npos) {
|
||||
std::cout << "Die gewünschte Serie wurde nicht gefunden oder ist im Moment deaktiviert: " << Name << std::endl;
|
||||
std::cout << " => Error: Die gewünschte Serie wurde nicht gefunden oder ist im Moment deaktiviert: " << Name << std::endl;
|
||||
return "-1";
|
||||
} else if (html.find("404 - Seite nicht gefunden") != std::string::npos) {
|
||||
std::cout << "Ungültiger Name: " << Name << std::endl;
|
||||
std::cout << " => Error: Ungültiger Name: " << Name << std::endl;
|
||||
return "-1";
|
||||
} else if (html == "-1") {
|
||||
return "-1";
|
||||
@ -155,7 +152,7 @@ std::string PageManager::getLinks(std::string HTML)
|
||||
{
|
||||
size_t pos = HTML.find("<ul class=\"row\">");
|
||||
if(pos == std::string::npos) {
|
||||
std::cout << "Konnte Position von \"" << "<ul class=\"row\">" << " nicht finden" <<std::endl;
|
||||
std::cout << " => Error: Konnte Position von \"" << "<ul class=\"row\">" << " nicht finden" <<std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -163,7 +160,7 @@ std::string PageManager::getLinks(std::string HTML)
|
||||
|
||||
pos = HTML.find("<script async=");
|
||||
if(pos == std::string::npos) {
|
||||
std::cout << "Konnte Position von \"" << "<script async=" << "\" nicht finden" <<std::endl;
|
||||
std::cout << " => Error: Konnte Position von \"" << "<script async=" << "\" nicht finden" <<std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
@ -222,11 +219,10 @@ std::string PageManager::getLinks(std::string HTML)
|
||||
line.erase(pos,line.length()-pos);
|
||||
|
||||
line = replace(line, "title=\"Hoster ", "hoster=\"");
|
||||
|
||||
ReturnValue+=line+"\n";
|
||||
}
|
||||
|
||||
if(ReturnValue.size() > 0)
|
||||
if(ReturnValue.length() > 0)
|
||||
return ReturnValue.erase( ReturnValue.size()-1 , 1);
|
||||
else
|
||||
return "";
|
||||
@ -278,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("Konnte output Datei nicht öffnen");
|
||||
perror(" => Error: Konnte output Datei nicht öffnen");
|
||||
return -1;
|
||||
}
|
||||
of << text << std::endl;
|
||||
@ -306,7 +302,7 @@ std::string PageManager::chooseHosterLink(std::string HosterList, std::string Ho
|
||||
else if ( langId == "GerSub" )
|
||||
LangId=3;
|
||||
else {
|
||||
std::cout << "Unbekannte Sprache: " << langId << std::endl;
|
||||
std::cout << " => Error: Unbekannte Sprache: " << langId << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -328,14 +324,14 @@ std::string PageManager::chooseHosterLink(std::string HosterList, std::string Ho
|
||||
Line = grep(LanguageSortedHoster, ("hoster=\"" + hoster + "\"" ) );
|
||||
pos = Line.find("href=\"");
|
||||
if(pos == std::string::npos) {
|
||||
std::cout << "Error: Konnte 'href=\"' nicht finden." << std::endl;
|
||||
std::cout << "Error: Konnte 'href=\"' in chooseHosterLink() nicht finden." << std::endl;
|
||||
continue;
|
||||
}
|
||||
Line.erase(0, pos + static_cast<int>(strlen("href=\"")));
|
||||
|
||||
pos = Line.find("\"");
|
||||
if(pos == std::string::npos) {
|
||||
std::cout << "Error: Konnte '\"' nicht finden." << std::endl;
|
||||
std::cout << "Error: Konnte '\"' in chooseHosterLink() nicht finden." << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
#include <iostream>
|
||||
// if complied for windows; everything is in */projectfolder/curl/
|
||||
#include <curl/curl.h>
|
||||
#include </home/markus/Qt/S_New4/curl/curl.h>
|
||||
#include <string.h>
|
||||
#include <sstream>
|
||||
#include <unistd.h>
|
||||
|
@ -3,12 +3,12 @@
|
||||
void setPaths(Settings &settings, std::string executablePathTo)
|
||||
{
|
||||
//Path settings
|
||||
executablePathTo.erase(executablePathTo.find_last_of("/\\") + 1 , executablePathTo.length() - ( executablePathTo.find_last_of("/\\") + 1) );
|
||||
executablePathTo.erase(executablePathTo.find_last_of(settings.pathSymbol) + 1 , executablePathTo.length() - ( executablePathTo.find_last_of(settings.pathSymbol) + 1) );
|
||||
|
||||
if(!dirExists(executablePathTo + "src/"))
|
||||
system(std::string("mkdir \"" + executablePathTo + "src/\"").c_str());
|
||||
if(dirExists(executablePathTo + "src/"))
|
||||
executablePathTo+="src/";
|
||||
if(!dirExists(executablePathTo + "src" + settings.pathSymbol))
|
||||
system(std::string("mkdir \"" + executablePathTo + "src" + settings.pathSymbol + "\"").c_str());
|
||||
if(dirExists(executablePathTo + "src" + settings.pathSymbol))
|
||||
executablePathTo+="src" + std::string(1, settings.pathSymbol);
|
||||
|
||||
settings.cookieFilePath = executablePathTo + "S_New4_cookies";
|
||||
settings.accountFilePath = executablePathTo + "Accounts";
|
||||
@ -89,8 +89,7 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
int c = 0;
|
||||
const option long_opts[] = {
|
||||
{"name", required_argument, nullptr, 'n'},
|
||||
{"ip-addresse", required_argument, nullptr, 'i'},
|
||||
{"port", required_argument, nullptr, 'p'},
|
||||
{"socks5-proxy", required_argument, nullptr, 'p'},
|
||||
{"genauer-hoster", required_argument, nullptr, 'g'},
|
||||
{"languages", required_argument, nullptr, 'l'},
|
||||
{"output-file", required_argument, nullptr, 'o'},
|
||||
@ -100,6 +99,10 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
{"start-season", required_argument, nullptr, 's'},
|
||||
{"stop-season", required_argument, nullptr, 'S'},
|
||||
|
||||
{"check-dir", required_argument, nullptr, 'C'},
|
||||
{"check-muster", required_argument, nullptr, 'm'},
|
||||
{"check-max-dirs", required_argument, nullptr, 't'},
|
||||
|
||||
|
||||
{"help", no_argument, nullptr, 'h'},
|
||||
{"colorless", no_argument, nullptr, 'c'},
|
||||
@ -109,7 +112,7 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
|
||||
};
|
||||
|
||||
while( ( c = getopt_long (argc, argv, "n:i:p:g:l:o:e:E:s:S:hcd", long_opts, nullptr) ) != -1 ) {
|
||||
while( ( c = getopt_long (argc, argv, "n:p:g:l:o:e:E:s:S:C:m:t:hcd", long_opts, nullptr) ) != -1 ) {
|
||||
switch(c) {
|
||||
case 'n':
|
||||
if(optarg)
|
||||
@ -117,20 +120,29 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
if(settings->debugMode)
|
||||
std::cout << "Name: " << settings->name << std::endl;
|
||||
break;
|
||||
case 'i':
|
||||
if(optarg)
|
||||
settings->proxy_ip = optarg;
|
||||
if(settings->debugMode)
|
||||
std::cout << "Proxy Ip Addresse: " << settings->proxy_ip << std::endl;
|
||||
break;
|
||||
case 'p':
|
||||
if(optarg)
|
||||
settings->proxy_port = atoi( optarg ) ;
|
||||
if(std::to_string(settings->proxy_port) != optarg) {
|
||||
std::cout << "Invalid Port: " << optarg << std::endl;
|
||||
return 10;
|
||||
} else if(settings->debugMode)
|
||||
std::cout << "Proxy Port: " << settings->proxy_port << std::endl;
|
||||
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 'g':
|
||||
if(optarg)
|
||||
@ -151,7 +163,6 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
std::cout << "Pfad zu Output-Datei: " << settings->outputFilePath << std::endl;
|
||||
break;
|
||||
|
||||
|
||||
case 'e':
|
||||
if(!optarg)
|
||||
break;
|
||||
@ -205,7 +216,31 @@ int unterOption_default(Settings *settings, int argc, char ** argv)
|
||||
} else if(settings->debugMode)
|
||||
std::cout << "StopSeason: " << settings->stopSeason << std::endl;
|
||||
break;
|
||||
case 'm':
|
||||
if(optarg)
|
||||
settings->default_Searchmuster = optarg;
|
||||
if(settings->debugMode)
|
||||
std::cout << "SearchMuster: " << settings->default_Searchmuster << std::endl;
|
||||
break;
|
||||
case 't':
|
||||
if(!optarg)
|
||||
break;
|
||||
settings->default_maxDirs = atoi(optarg);
|
||||
if(std::to_string(settings->default_maxDirs) != std::string(optarg) ) {
|
||||
std::cout << "[-t]: Invalid Count: " << optarg << std::endl;
|
||||
return 18;
|
||||
}
|
||||
if(settings->debugMode)
|
||||
std::cout << "SearchMuster: " << settings->default_Searchmuster << std::endl;
|
||||
|
||||
break;
|
||||
case 'C':
|
||||
if(!optarg)
|
||||
break;
|
||||
settings->default_checkDirPath = optarg;
|
||||
if(settings->debugMode)
|
||||
std::cout << "To check Dir: " << settings->default_checkDirPath << std::endl;
|
||||
break;
|
||||
case 'c':
|
||||
settings->colorless = true;
|
||||
if(settings->debugMode)
|
||||
@ -245,10 +280,8 @@ void unterOption_default_help(Settings *, char * argv0)
|
||||
<< "\t -> Die Sprache(n) die du willst. Die wichtigsten zuerst. Default: GerDub,GerSub,Eng" << std::endl
|
||||
<< std::endl
|
||||
<< " > Proxy-Optionen:" << std::endl
|
||||
<< "\t-i [ProxyIPAddresse], --ip-addresse [ProxyIPAddresse]" << std::endl
|
||||
<< "\t -> Ip Addresse eines Socks5-Proxys angeben. Default: 127.0.0.1" << std::endl
|
||||
<< "\t-p [ProxyPort], --port [ProxyPort]" << std::endl
|
||||
<< "\t -> Port eines Socks5-Proxy angeben. Default: 9050" << std::endl
|
||||
<< "\t-p [ProxyAddresse], --socks5-proxy [ProxyAddresse]" << std::endl
|
||||
<< "\t -> Ip Addresse eines Socks5-Proxys angeben. Default: 127.0.0.1:9050" << std::endl
|
||||
<< std::endl
|
||||
<< " > Outputoptionen:" << std::endl
|
||||
<< "\t-o [Pfad], --output-file [Pfad]" << std::endl
|
||||
@ -258,6 +291,17 @@ void unterOption_default_help(Settings *, char * argv0)
|
||||
<< "\t-d, --debug-mode" << std::endl
|
||||
<< "\t -> Debug Nachrichten an. Default: false" << std::endl
|
||||
<< std::endl
|
||||
<< " > Check-Dir Optionen:" << std::endl
|
||||
<< "\t-C [Pfad], --check-dir [Pfad]" << std::endl
|
||||
<< "\t -> Überprüfe ob in diesem, oder in einen der Unterordnern die Folge vorkommt." << std::endl
|
||||
<< "\t -> Wenn ja, dann überspringe diese." << std::endl
|
||||
<< "\t-m, --check-muster" << std::endl
|
||||
<< "\t -> Muster mit dem Überprüft wird, ob diese Folge in einem Ordner ist. Default: S%Staffel%E%Folge%" << std::endl
|
||||
<< "\t -> %Staffel% ist eine Variable für die Staffel mit 0 + Staffel, wenn Staffel < 10. " << std::endl
|
||||
<< "\t -> %Folge% ist eine Variable für die Folge mit 0 + Folge, wenn Folge < 10. " << std::endl
|
||||
<< "\t-t, --check-max-dirs" << std::endl
|
||||
<< "\t -> Maximale Anzahl der Ordner, die auf Dateien untersucht werden. Default: 20" << std::endl
|
||||
<< std::endl
|
||||
<< " > Durchlaufoptionen:" << std::endl
|
||||
<< "\t-e [Folge], --start-episode [Folge]" << std::endl
|
||||
<< "\t -> Das Programm startet mit dieser Folge." << std::endl
|
||||
@ -287,8 +331,7 @@ int unterOption_url(Settings *settings, int argc, char **argv)
|
||||
int c = 0;
|
||||
const option long_opts[] = {
|
||||
{"url", required_argument, nullptr, 'u'},
|
||||
{"ip-addresse", required_argument, nullptr, 'i'},
|
||||
{"port", required_argument, nullptr, 'p'},
|
||||
{"socks5-proxy", required_argument, nullptr, 'p'},
|
||||
{"output-file", required_argument, nullptr, 'o'},
|
||||
|
||||
{"help", no_argument, nullptr, 'h'},
|
||||
@ -299,7 +342,7 @@ int unterOption_url(Settings *settings, int argc, char **argv)
|
||||
|
||||
};
|
||||
|
||||
while( ( c = getopt_long (argc, argv, "u:i:p:o:hcd", long_opts, nullptr) ) != -1 ) {
|
||||
while( ( c = getopt_long (argc, argv, "u:p:o:hcd", long_opts, nullptr) ) != -1 ) {
|
||||
switch(c) {
|
||||
case 'u':
|
||||
if(optarg)
|
||||
@ -308,21 +351,29 @@ int unterOption_url(Settings *settings, int argc, char **argv)
|
||||
std::cout << "Urls: " << settings->name << std::endl;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
if(optarg)
|
||||
settings->proxy_ip = optarg;
|
||||
if(settings->debugMode)
|
||||
std::cout << "Proxy Ip Addresse: " << settings->proxy_ip << std::endl;
|
||||
break;
|
||||
case 'p':
|
||||
if(optarg)
|
||||
settings->proxy_port = atoi( optarg );
|
||||
if(std::to_string(settings->proxy_port) != optarg) {
|
||||
std::cout << "Invalid Port: " << optarg << std::endl;
|
||||
return 20;
|
||||
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;
|
||||
}
|
||||
if(settings->debugMode)
|
||||
std::cout << "Proxy Port: " << settings->proxy_port << std::endl;
|
||||
break;
|
||||
case 'o':
|
||||
if(optarg)
|
||||
@ -360,10 +411,8 @@ void unterOption_url_help(Settings *, char * argv0)
|
||||
<< "Parameter:" << std::endl
|
||||
<< "\t-u [Url1,Url2,...], --url [Url1,Url2,...]" << std::endl
|
||||
<< "\t -> Die zu umwandelnden redirect-Links." << std::endl
|
||||
<< "\t-i [ProxyIPAddresse], --ip-addresse [ProxyIPAddresse]" << std::endl
|
||||
<< "\t -> Default: 127.0.0.1." << std::endl
|
||||
<< "\t-p [ProxyPort], --port [ProxyPort]" << std::endl
|
||||
<< "\t -> Default: 9050." << 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
|
||||
@ -411,7 +460,7 @@ int unterOption_search(Settings *settings, int argc, char **argv)
|
||||
{nullptr, no_argument, nullptr, 0}
|
||||
|
||||
};
|
||||
std::string optarg2;
|
||||
|
||||
while( ( c = getopt_long (argc, argv, "n:p:hcdeu", long_opts, nullptr) ) != -1 ) {
|
||||
switch(c) {
|
||||
case 'n':
|
||||
@ -421,15 +470,15 @@ int unterOption_search(Settings *settings, int argc, char **argv)
|
||||
std::cout << "Name: " << settings->name << std::endl;
|
||||
break;
|
||||
case 'p': {
|
||||
optarg2 = optarg;
|
||||
if(!optarg || optarg2 == "")
|
||||
if(!optarg || std::string(optarg) == "")
|
||||
break;
|
||||
else if(optarg2.find(":") == std::string::npos) {
|
||||
std::string optarg = ::optarg;
|
||||
if(optarg.find(":") == std::string::npos) {
|
||||
std::cout << "Invalid Socks5 Proxy: " << optarg << std::endl;
|
||||
return 31;
|
||||
}
|
||||
std::string ip = optarg2.substr(0, optarg2.find(":"));
|
||||
std::string portStr = optarg2.substr(optarg2.find(":") + 1, optarg2.length() - optarg2.find(":"));
|
||||
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;
|
||||
@ -441,7 +490,7 @@ int unterOption_search(Settings *settings, int argc, char **argv)
|
||||
std::cout << "Proxy Addresse: "<< ip << ":" << port << std::endl;
|
||||
}
|
||||
settings->proxy_ip = ip;
|
||||
settings->proxy_port = port;
|
||||
settings->proxy_port = port;
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
|
@ -11,7 +11,8 @@ enum Modus {
|
||||
EXIT = -1,
|
||||
DEFAULT_MODUS = 0,
|
||||
DIRECT_LINK_MODUS = 1,
|
||||
Search_MODUS = 2
|
||||
Search_MODUS = 2,
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -27,8 +28,11 @@ struct Settings {
|
||||
proxy_ip = "127.0.0.1",
|
||||
languages = "GerDub,GerSub,Eng",
|
||||
genaueHoster = "",
|
||||
version = "1.0.1",
|
||||
outputFilePath;
|
||||
version = "2.0.0",
|
||||
outputFilePath = "",
|
||||
default_checkDirPath = "",
|
||||
default_Searchmuster = "S%Staffel%E%Folge%";
|
||||
|
||||
Modus modus = Modus::DEFAULT_MODUS;
|
||||
bool colorless = false,
|
||||
debugMode = false,
|
||||
@ -38,8 +42,9 @@ struct Settings {
|
||||
stopEpisode = 0,
|
||||
startSeason = 1,
|
||||
stopSeason = 0,
|
||||
proxy_port = 9050;
|
||||
|
||||
proxy_port = 9050,
|
||||
default_maxDirs = 20;
|
||||
const char pathSymbol = '/';
|
||||
|
||||
};
|
||||
|
||||
|
@ -32,28 +32,59 @@ int ProgramManager::defaultModus(Settings *settings)
|
||||
{
|
||||
AccountManager accountManager(settings->accountFilePath, settings->accountNumberPath);
|
||||
|
||||
//Wenn kein Name mit -n Angegeben wurde:
|
||||
if(settings->name == "") {
|
||||
std::cout << "Kein Name angegeben: Missing Parameter -n [Name]." << std::endl;
|
||||
return 27;
|
||||
if(settings->default_checkDirPath != "") {
|
||||
if(settings->default_checkDirPath[settings->default_checkDirPath.length()-1] == settings->pathSymbol)
|
||||
settings->default_checkDirPath.pop_back();
|
||||
size_t pos = settings->default_checkDirPath.find_last_of(std::string(1, settings->pathSymbol));
|
||||
if( pos != std::string::npos) {
|
||||
settings->name = settings->default_checkDirPath.substr(pos + 1);
|
||||
if(settings->debugMode)
|
||||
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;
|
||||
return 27;
|
||||
}
|
||||
}
|
||||
|
||||
//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)
|
||||
std::cout << " > [-C] Files:\n" << dirFiles << std::endl;
|
||||
|
||||
//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;
|
||||
}
|
||||
//Sonst melde sich bei s.to an und speicher cookies.
|
||||
else if (pageManager.login(accountManager.getNextAccount()) != 0)
|
||||
return 29;
|
||||
pageManager.writeToFile(settings->outputFilePath, "Name: " + settings->name);
|
||||
|
||||
//Find out number of all seasons
|
||||
//Finde die anzahl der staffel heraus:
|
||||
//download html von der startpage einer serie
|
||||
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");
|
||||
|
||||
if(settings->debugMode)
|
||||
std::cout << "Die Serie " << settings->name << " hat " << maxStaffel << " Staffeln." << std::endl;
|
||||
std::cout << " > Die Serie " << settings->name << " hat " << maxStaffel << " Staffeln." << std::endl;
|
||||
|
||||
//For every season
|
||||
for (int staffel = settings->startSeason; staffel <= maxStaffel; ++staffel) {
|
||||
|
||||
@ -64,10 +95,21 @@ int ProgramManager::defaultModus(Settings *settings)
|
||||
int maxFolge = pageManager.counterContains(tmp_reply.html, "/episode-%i");
|
||||
|
||||
if(settings->debugMode)
|
||||
std::cout << "Die Staffel " << staffel << " hat " << maxFolge << " Folgen." << std::endl;
|
||||
std::cout << " > Die Staffel " << staffel << " hat " << maxFolge << " Folgen." << std::endl;
|
||||
|
||||
//for every episode
|
||||
for (int folge = settings->startEpisode; folge <= maxFolge; ++folge) {
|
||||
|
||||
//Überprüfe ob, wenn -C vorhanden, die Folge in dem Ordner bereits vorkommt.
|
||||
if(settings->default_checkDirPath != "") {
|
||||
if(dirFiles.find(pageManager.replace( pageManager.replace( settings->default_Searchmuster, "%Staffel%", ((staffel < 10) ? "0" : "") + std::to_string(staffel) ),
|
||||
"%Folge%", ((folge < 10) ? "0" : "") + std::to_string(folge) ) ) != std::string::npos) {
|
||||
if(settings->debugMode)
|
||||
std::cout << " > Skippe Folge: S" << staffel << "E" << folge << std::endl;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
tmp_reply =pageManager.getServerRequest(pageManager.UrlPraefix + nameInUrl + "/staffel-" + std::to_string(staffel) + "/episode-" + std::to_string(folge));
|
||||
if(tmp_reply.html == "-1")
|
||||
return 47;
|
||||
@ -75,7 +117,7 @@ int ProgramManager::defaultModus(Settings *settings)
|
||||
std::string Link = pageManager.chooseHosterLink(allLinks, settings->genaueHoster, settings->languages);
|
||||
|
||||
if(settings->debugMode)
|
||||
std::cout << allLinks << std::endl << " -> Link: '" << ( (Link == "") ? "" : "https://s.to") << Link << "'" << std::endl;
|
||||
std::cout << allLinks << std::endl << ( (Link == "") ? "" : " -> Link: 'https://s.to") << Link << ( (Link == "") ? "" : "'\n" );
|
||||
if(convertLink(Link, &accountManager, settings, staffel, folge, allLinks) != 0)
|
||||
return 51;
|
||||
|
||||
@ -89,11 +131,12 @@ int ProgramManager::defaultModus(Settings *settings)
|
||||
|
||||
if(staffel == settings->stopSeason) {
|
||||
if(settings->debugMode)
|
||||
std::cout << "Stoppe, weil Staffel: " << staffel << " == StopStaffel " << settings->stopSeason << std::endl;
|
||||
std::cout << " > Stoppe, weil Staffel: " << staffel << " == StopStaffel " << settings->stopSeason << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << " > Fertig" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -202,9 +245,6 @@ int ProgramManager::searchModus_update(Settings *settings)
|
||||
//...\n|/serie/stream/2012-das-jahr-null" title="2012 - Das Jahr Null Stream anschauen">2012 - Das Jahr Null</a>\n...
|
||||
serienListe = pageManager.replace(serienListe, "|/serie/stream/", "|/");
|
||||
|
||||
//Performanze:
|
||||
serienListe = pageManager.grep(serienListe, settings->name, true);
|
||||
|
||||
std::stringstream strstream(serienListe);
|
||||
std::string line;
|
||||
serienListe.clear();
|
||||
@ -229,6 +269,41 @@ int ProgramManager::searchModus_update(Settings *settings)
|
||||
}
|
||||
ofs << serienListe << std::endl;
|
||||
ofs.close();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ProgramManager::listDir(std::string &list,std::string path, int maxDepth)
|
||||
{
|
||||
if(maxDepth == 0)
|
||||
return 0;
|
||||
else if(!dirExists(path)) {
|
||||
std::cout << " => Error: Verzeichnis '" << path << "' existiert nicht oder ist kein Ordner." << std::endl;
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
maxDepth--;
|
||||
|
||||
if(path[path.length()-1] != '/')
|
||||
path.push_back('/');
|
||||
|
||||
DIR* dirp = opendir(path.c_str());
|
||||
if(!dirp) {
|
||||
perror(std::string(" => Error: Konnte Verzeichnis nicht öffnen: " + path).c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct dirent * dp;
|
||||
while ((dp = readdir(dirp)) != nullptr) {
|
||||
if(strcmp( dp->d_name, "." ) == 0 || strcmp ( dp->d_name, ".." ) == 0)
|
||||
continue;
|
||||
|
||||
else if(dirExists((path + dp->d_name + "/"))) { //if(dp->d_type == DT_DIR) {
|
||||
listDir(list, (path + dp->d_name + "/"), maxDepth);
|
||||
} else
|
||||
list.append( std::string(dp->d_name) + "\n" );
|
||||
}
|
||||
closedir(dirp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -236,7 +311,7 @@ int ProgramManager::convertLink(std::string redirectLink, AccountManager * accou
|
||||
Settings * settings, int Staffel, int Folge, std::string allLinks)
|
||||
{
|
||||
std::string folgenID = std::string((Staffel == -1 || Folge == -1 ) ? "" : "S" + std::string( (Staffel < 10) ? "0" : "" ) + std::to_string(Staffel)
|
||||
+ "E" + std::string( (Folge < 10) ? "0" : "" ) + std::to_string( Folge ) + ": ");
|
||||
+ "E" + std::string( (Folge < 10) ? "0" : "" ) + std::to_string( Folge ) );
|
||||
std::string green = ((settings->colorless) ? "" : "\033[32m"),
|
||||
red = ((settings->colorless) ? "" : "\033[31m"),
|
||||
orange =((settings->colorless) ? "" : "\033[33m"),
|
||||
@ -264,20 +339,20 @@ int ProgramManager::convertLink(std::string redirectLink, AccountManager * accou
|
||||
return 102;
|
||||
} else if(newUrl.find("/s.to/redirect/") != std::string::npos ) {
|
||||
if(settings->debugMode)
|
||||
std::cout << "Redirect Link nach umwandlung --> Neuer Account" << std::endl;
|
||||
std::cout << "Warnung: Redirect Link nach umwandlung (Capcha?) --> Neuer Account" << std::endl;
|
||||
if(pageManager.login(accountManager->getNextAccount()) != 0)
|
||||
return -1;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
std::cout << " => " << folgenID << green << newUrl << "\033[0m" << std::endl;
|
||||
|
||||
} else {
|
||||
std::cout << " => " << folgenID << ": " << green << newUrl << "\033[0m" << std::endl;
|
||||
if(settings->outputFilePath != "")
|
||||
if(pageManager.writeToFile(settings->outputFilePath,folgenID + newUrl) != 0)
|
||||
return 108;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
std::cout << " => " << folgenID << red << "https://s.to" << redirectLink << "\033[0m" << std::endl;
|
||||
std::cout << " => " << folgenID << ": " << red << "https://s.to" << redirectLink << "\033[0m" << std::endl;
|
||||
if(settings->outputFilePath != "")
|
||||
if(pageManager.writeToFile(settings->outputFilePath, folgenID + redirectLink) != 0)
|
||||
return 114;
|
||||
|
@ -6,24 +6,26 @@
|
||||
#include "accountManager.h"
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
|
||||
class ProgramManager
|
||||
{
|
||||
public:
|
||||
ProgramManager();
|
||||
~ProgramManager();
|
||||
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 searchModus_update(Settings * settings);
|
||||
|
||||
|
||||
PageManager pageManager;
|
||||
|
||||
|
||||
int convertLink(std::string redirectLink, AccountManager *accountManager, Settings * settings, int Staffel = -1, int Folge = -1, std::string allLinks = "NOT_EMPTY");
|
||||
int searchModus_update(Settings * settings);
|
||||
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user