2019-07-06 18:47:29 +00:00
# include "programManager.h"
2019-08-15 12:20:06 +00:00
2019-07-06 18:47:29 +00:00
ProgramManager : : ProgramManager ( )
2019-08-15 12:20:06 +00:00
: nextThread ( 0 )
2019-07-06 18:47:29 +00:00
{
}
2019-08-03 16:23:12 +00:00
ProgramManager : : ~ ProgramManager ( )
2019-07-06 18:47:29 +00:00
{
2019-08-16 18:12:25 +00:00
for ( auto e : threadList ) {
delete e - > pageManager ;
delete e ;
e = nullptr ;
}
2019-08-03 16:23:12 +00:00
}
2019-08-11 17:15:33 +00:00
int ProgramManager : : start ( Settings * settings )
2019-08-03 16:23:12 +00:00
{
2019-08-11 17:15:33 +00:00
pageManager . setProxy ( settings - > proxy_ip , settings - > proxy_port ) ;
pageManager . setDebugMode ( settings - > debugMode ) ;
2019-08-17 12:04:53 +00:00
pageManager . setCookieFilePath ( settings - > cookieFilePath ) ;
if ( dirExists ( settings - > cookieFilePath ) ) {
std : : cout < < " => Error: Kann Cokkie-File nicht erstellen: Es existiert bereits ein Ordner mit diesem Namen: \n ' "
< < settings - > cookieFilePath < < " '. " < < std : : endl ;
return 174 ;
}
2019-08-03 16:23:12 +00:00
2019-08-11 17:15:33 +00:00
switch ( settings - > modus ) {
2019-09-20 19:47:02 +00:00
case Modus : : DEFAULT_MODUS :
return defaultModus ( settings ) ;
case Modus : : DIRECT_LINK_MODUS :
return directLinkModus ( settings ) ;
case Modus : : SEARCH_MODUS :
return searchModus ( settings ) ;
case Modus : : INFO_MODUS :
return infoModus ( settings ) ;
case Modus : : NEWS_MODUS :
return newsModus ( settings ) ;
2019-10-13 12:28:53 +00:00
case Modus : : UPDATE_MODUS :
return updateModus ( settings ) ;
2019-09-20 19:47:02 +00:00
default :
return - 1 ;
2019-07-06 18:47:29 +00:00
}
}
2019-08-17 14:06:33 +00:00
void * threadFunction ( void * data ) {
ThreadData * myThreadData = reinterpret_cast < struct ThreadData * > ( data ) ;
myThreadData - > returnValue = " " ;
myThreadData - > exitState = 0 ;
2019-08-15 12:20:06 +00:00
2019-08-17 14:06:33 +00:00
Reply tmp_reply = myThreadData - > pageManager - > getServerRequest ( myThreadData - > pageManager - > UrlPraefix + myThreadData - > nameInUrl
+ " /staffel- " + std : : to_string ( myThreadData - > staffel ) + " /episode- " + std : : to_string ( myThreadData - > folge ) ) ;
2019-10-08 18:03:15 +00:00
if ( tmp_reply . html = = " -1 " ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : getServerRequest Function reurns -1. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 10 ) ;
2019-10-08 18:03:15 +00:00
}
2019-08-17 14:06:33 +00:00
std : : string allLinks = myThreadData - > pageManager - > getLinks ( tmp_reply . html ) ;
std : : string Link = myThreadData - > pageManager - > chooseHosterLink ( allLinks , myThreadData - > settings - > genaueHoster , myThreadData - > settings - > languages ) ;
2019-08-15 12:20:06 +00:00
2019-08-17 14:06:33 +00:00
if ( myThreadData - > settings - > debugMode )
std : : cout < < " > Thread " < < myThreadData - > id < < allLinks < < std : : endl < < ( ( Link = = " " ) ? " " : " -> Link: 'https://s.to " ) < < Link < < ( ( Link = = " " ) ? " " : " ' \n " ) ;
2019-08-15 12:20:06 +00:00
2019-10-08 18:03:15 +00:00
std : : string folgenID = std : : string ( ( myThreadData - > staffel = = - 1 | | myThreadData - > folge = = - 1 ) ? " " : " S "
+ std : : string ( ( myThreadData - > staffel < 10 ) ? " 0 " : " " ) + std : : to_string ( myThreadData - > staffel )
2019-08-17 14:06:33 +00:00
+ " E " + std : : string ( ( myThreadData - > folge < 10 ) ? " 0 " : " " ) + std : : to_string ( myThreadData - > folge ) ) ;
std : : string green = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [32m " ) ,
red = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [31m " ) ,
orange = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [33m " ) ,
blue = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [34m " ) ;
2019-08-15 12:20:06 +00:00
if ( Link = = " " ) {
2019-10-08 18:03:15 +00:00
//Wenn gar keine Links vorhanden sind:
2019-08-15 12:20:06 +00:00
if ( allLinks = = " " ) {
2019-08-17 14:06:33 +00:00
myThreadData - > returnValue = " => " + red + " KEINEN Hoster für die Folge " + folgenID + " gefunden. " + " \033 [0m " ;
2019-10-08 18:03:15 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePath , std : : string ( " KEINEN Hoster für die Folge " ) + folgenID + std : : string ( " gefunden. " ) ) ! = 0 ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : writeToFile Function failed. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 14 ) ;
2019-10-08 18:03:15 +00:00
}
//Wenn nur kein passender Link gefunden wurde:
} else {
2019-08-17 14:06:33 +00:00
myThreadData - > returnValue = " => " + orange + " Keinen PASSENDEN Hoster für die Folge " + folgenID + " gefunden. " + " \033 [0m " + " \n "
2019-08-15 12:20:06 +00:00
+ " Alle Links: " + " \n "
2019-10-08 18:03:15 +00:00
+ myThreadData - > pageManager - > replace (
myThreadData - > pageManager - > replace ( myThreadData - > pageManager - > replace ( allLinks , " data-lang-key= \" 1 \" " , " language= \" GerDub \" " ) ,
2019-08-15 12:20:06 +00:00
" data-lang-key= \" 2 \" " , " language= \" Eng \" " ) , " data-lang-key= \" 3 \" " , " language= \" GerSub \" " ) ;
2019-10-08 18:03:15 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePath ,
std : : string ( " Keinen PASSENDEN Hoster für die Folge " ) + folgenID + std : : string ( " gefunden. " ) ) ! = 0 ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : writeToFile Function failed. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 15 ) ;
2019-10-08 18:03:15 +00:00
}
2019-08-15 12:20:06 +00:00
}
2019-10-08 18:03:15 +00:00
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : closeThread, no (good) Link was found. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 0 ) ;
2019-08-15 12:20:06 +00:00
}
for ( int i = 1 ; i < = 3 ; + + i ) {
2019-08-17 14:06:33 +00:00
std : : string newUrl = myThreadData - > pageManager - > getUrlAfterRedirect ( " https://s.to " + Link ) ;
2019-08-15 12:20:06 +00:00
if ( newUrl = = " -1 " ) {
2019-10-08 18:03:15 +00:00
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : getUrlAfterRedirect Function failed: returned -1. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 16 ) ;
2019-10-08 18:03:15 +00:00
// Get redirect link after getUrlAfterRedirect function
2019-08-15 12:20:06 +00:00
} else if ( newUrl . find ( " /s.to/redirect/ " ) ! = std : : string : : npos ) {
2019-08-17 14:06:33 +00:00
if ( myThreadData - > settings - > debugMode )
std : : cout < < " > Thread " < < myThreadData - > id < < " Warnung: Redirect Link nach umwandlung (Capcha?) --> Neuer Account " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( myThreadData - > pageManager - > login ( myThreadData - > accountManager - > getNextAccount ( ) ) ! = 0 ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : login Function failed. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 17 ) ;
2019-10-08 18:03:15 +00:00
}
2019-08-15 12:20:06 +00:00
continue ;
2019-10-08 18:03:15 +00:00
// get NO-Redirect Link after getUrlAfterRedirect Function
2019-08-15 12:20:06 +00:00
} else {
2019-08-17 14:06:33 +00:00
myThreadData - > returnValue = " => " + folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + green + newUrl + " \033 [0m " ;
2019-10-08 18:03:15 +00:00
if ( myThreadData - > settings - > outputFilePath ! = " " ) {
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePath , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + newUrl ) ! = 0 ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : writeToFile Function failed. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 18 ) ;
2019-10-08 18:03:15 +00:00
}
}
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : get a NO Redirect Link after function: Good! => return 0. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 0 ) ;
2019-08-15 12:20:06 +00:00
}
}
2019-10-08 18:03:15 +00:00
2019-08-17 14:06:33 +00:00
myThreadData - > returnValue = " => " + folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + red + " https://s.to " + Link + " \033 [0m " ;
if ( myThreadData - > settings - > outputFilePath ! = " " )
2019-10-08 18:03:15 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePath , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + Link ) ! = 0 ) {
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : writeToFile Function failed. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 19 ) ;
2019-10-08 18:03:15 +00:00
}
if ( myThreadData - > settings - > debugMode )
std : : cerr < < " => Debug: In Thread: " < < myThreadData - > id < < " : 3 Times to convert fails, but return 0. " < < std : : endl ;
2019-08-17 14:06:33 +00:00
return myThreadData - > setState ( 0 ) ;
2019-08-15 12:20:06 +00:00
}
2019-08-21 14:31:17 +00:00
int ProgramManager : : waitForThreads ( )
{
for ( auto & e : threadList ) {
if ( e - > exitState ! = - 1 & & pthread_join ( e - > thread , nullptr ) = = 0 ) {
if ( e - > exitState ! = 0 ) {
std : : cout < < " \33 [2K \r => Error: Thread gab error zurück. " < < std : : endl ;
return e - > exitState ;
} else
if ( e - > returnValue ! = " " )
std : : cout < < ( " \33 [2K \r (T " + std : : to_string ( e - > id ) + " ) " + e - > returnValue ) < < std : : endl ;
}
e - > exitState = - 1 ;
e - > returnValue = " " ;
e - > setData ( 0 , 0 ) ;
e - > thread = 0 ;
}
return 0 ;
}
2019-08-15 12:20:06 +00:00
2019-08-22 17:56:22 +00:00
int ProgramManager : : sucheNach_1_Serien ( Settings * settings , PageManager & pageManager , std : : string & newName )
{
2019-10-08 18:10:12 +00:00
std : : string finds , line ;
2019-10-10 15:39:57 +00:00
//Führe unterfunction zum suchen von Serien aus, aber ohne suche auszugeben und speichere datein in variable
if ( searchModus ( settings , & finds , true ) ! = 0 ) {
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Function searchModus returned error. " < < std : : endl ;
2019-08-22 17:56:22 +00:00
return 24 ;
2019-10-10 15:39:57 +00:00
// Wenn der Rückgabe wert ungültig ist brich ab...
} else if ( finds . find ( " / " ) = = std : : string : : npos | | finds . find ( " | " ) = = std : : string : : npos ) { // ||
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-10 15:39:57 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : searchModus's returnValue contains no / or | => error " < < std : : endl ;
2019-08-22 17:56:22 +00:00
return 45 ;
2019-10-10 15:39:57 +00:00
// Wenn der Rückgabewert mehrene newlines enthält gibt es mehrere Möglichkeiten
} else if ( finds . find ( " \n " ) ! = std : : string : : npos ) {
//Gib alle gefundenen Serien Zeilenweise aus und schreibe davor die Zeile:
std : : stringstream myStrStream ( finds + " \n " ) ;
std : : cout < < " \n Wähle eine der folgenden Serien, oder nur [Enter] um Forgang abzubrechen. " < < std : : endl ;
for ( unsigned i = 1 ; std : : getline ( myStrStream , line ) . good ( ) ; + + i ) {
if ( line . find_last_of ( " | " ) = = std : : string : : npos ) {
std : : cout < < " => Error: Invalid Line: " < < line < < std : : endl ;
return - 21 ;
}
std : : cout < < i < < " : " < < line . erase ( 0 , line . find_last_of ( " | " ) + 1 ) < < std : : endl ;
}
//Lass Benutzer Zeile auswählen:
std : : cout < < " Zeile: " < < std : : flush ;
std : : string input ;
std : : getline ( std : : cin , input ) ;
//Wenn kein Input, brich ab
if ( input = = " " ) {
2019-10-11 13:24:14 +00:00
std : : cout < < " => Abbruch... " < < std : : endl ;
2019-10-10 15:39:57 +00:00
return - 1 ;
}
//Wähle Zeile aus
myStrStream . clear ( ) ;
myStrStream . str ( finds + " \n " ) ;
bool hasNewName = false ;
//Geh die Liste nochmal durch
for ( unsigned i = 1 ; std : : getline ( myStrStream , line ) . good ( ) ; + + i ) {
if ( line . find_last_of ( " | " ) = = std : : string : : npos ) {
std : : cout < < " => Error: Invalid Line: " < < line < < std : : endl ;
return - 22 ;
// Wenn die Zeile gleich der ausgewählten ist:
} else if ( static_cast < int > ( i ) = = atoi ( input . c_str ( ) ) ) {
//Speichere den Namen der Serie und setzte hasName auf true und brich schleife ab
if ( ( finds = line . substr ( line . find ( " / " ) + 1 , line . find ( " | " , line . find ( " / " ) ) - line . find ( " / " ) - 1 ) ) = = " " ) {
std : : cout < < " => Error: Konnte den Namen aus der zurückgegebenen Zeile nicht extrahieren. In ausWahlVariante " < < std : : endl ;
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Return value from searchModus.subStr(pos(/)-> next |, after /) is ''. " < < std : : endl ;
return 48 ;
}
hasNewName = true ;
break ;
}
}
//Wenn keine der Zeilen gelcih dem Input war, input invali -> brich ab...
if ( ! hasNewName ) {
std : : cout < < " => Error: Ungültige Eingabe: ' " < < input < < " ' " < < std : : endl ;
return 123 ;
}
//Wenn nur 1 Serie gefunden wurde:
} else {
//Speicher die Zeile für Namenausgabe:
line = finds ;
//Überschreibe eine Zeile mit nur dem url Namen
if ( ( finds = finds . substr ( finds . find ( " / " ) + 1 , finds . find ( " | " , finds . find ( " / " ) ) - finds . find ( " / " ) - 1 ) ) = = " " ) {
std : : cout < < " => Error: Konnte den Namen aus der zurückgegebenen Zeile nicht extrahieren. " < < std : : endl ;
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Return value from searchModus.subStr(pos(/)-> next |, after /) is ''. " < < std : : endl ;
return 46 ;
}
//Frag den User ob das die Richtige Serie ist:
std : : cout < < " -> Ist das deine gewünschte Serie: ' " < < line . erase ( 0 , line . find_last_of ( " | " ) + 1 ) < < " ' " < < std : : endl
< < " Drücke nur [Enter] um fortzufahren: " < < std : : flush ;
std : : getline ( std : : cin , line ) ;
//Wenn input => abbruch
if ( line ! = " " ) {
std : : cout < < " => Abbruch... " < < std : : endl ;
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : User tipped an Value => wrong serie. " < < std : : endl ;
return 48 ;
}
2019-08-22 17:56:22 +00:00
}
2019-10-08 18:10:12 +00:00
2019-10-10 15:39:57 +00:00
//Überprüfe ob es die serie gibt wenn ja speicher ihn in newname und beende Function
if ( ( newName = pageManager . checkName ( finds ) ) = = " -1 " ) {
2019-10-08 18:03:15 +00:00
std : : cout < < " => Error: Konnte die von der Suche vorgeschlagene Serie nicht finden. " < < std : : endl ;
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Extracted Name from searchModus is invalid. " < < std : : endl ;
2019-10-08 18:03:15 +00:00
return 47 ;
} else {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Use new SerienName: ' " < < newName < < " '. " < < std : : endl ;
2019-10-08 18:03:15 +00:00
return 0 ;
2019-08-22 17:56:22 +00:00
}
}
2019-10-04 18:11:01 +00:00
int ProgramManager : : checkLastUpdate ( Settings * settings )
{
2019-10-08 18:03:15 +00:00
if ( settings - > updateWarningDays = = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : In settings: upDateWaring is deaktivated(seted to 0). " < < std : : endl ;
2019-10-04 18:11:01 +00:00
return 0 ;
2019-10-08 18:03:15 +00:00
}
2019-10-04 18:11:01 +00:00
std : : ifstream ifs ( settings - > lastUpdateDateFilePath ) ;
if ( ! ifs . is_open ( ) ) {
perror ( ( " Konnte die Datei ' " + settings - > lastUpdateDateFilePath + " ' nicht öffnen " ) . c_str ( ) ) ;
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Failed to open Last Update Date File:' " < < settings - > lastUpdateDateFilePath < < " '. " < < std : : endl ;
2019-10-04 18:11:01 +00:00
return 1 ;
}
std : : string line ;
2019-10-04 18:24:51 +00:00
ssize_t difDays = 0 ;
2019-10-04 18:11:01 +00:00
if ( ! std : : getline ( ifs , line ) . good ( ) ) {
perror ( " GetLine from Date failed " ) ;
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Get the first Line of the LastUpdateDate File failed. " < < std : : endl ;
2019-10-04 18:11:01 +00:00
return 2 ;
2019-10-04 18:24:51 +00:00
} else if ( ( ( difDays = static_cast < long long > ( pageManager . getDate ( ) ) - atoll ( line . c_str ( ) ) ) ) > = settings - > updateWarningDays ) {
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [93m " ) < < " => Warnung: SerienListe wurde zuletzt vor " < < difDays < < " Tagen aktualisiert. "
2019-10-04 18:11:01 +00:00
< < std : : endl < < " Mit ' " < < settings - > programName < < " search -u' kannst du die Liste aktualisieren. " < < " \033 [0m " < < std : : endl ; ;
}
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Exit with success. " < < std : : endl ;
2019-10-04 18:11:01 +00:00
return 0 ;
}
2019-07-06 18:47:29 +00:00
int ProgramManager : : defaultModus ( Settings * settings )
{
2019-07-08 18:17:11 +00:00
AccountManager accountManager ( settings - > accountFilePath , settings - > accountNumberPath ) ;
2019-08-11 14:52:23 +00:00
//Wenn kein Name mit -n Angegeben wurde:
2019-07-08 18:17:11 +00:00
if ( settings - > name = = " " ) {
2019-08-21 14:59:22 +00:00
if ( settings - > default_checkPath ! = " " ) {
if ( settings - > default_checkPath [ settings - > default_checkPath . length ( ) - 1 ] = = settings - > pathSymbol )
settings - > default_checkPath . pop_back ( ) ;
size_t pos = settings - > default_checkPath . find_last_of ( std : : string ( 1 , settings - > pathSymbol ) ) ;
2019-08-11 14:52:23 +00:00
if ( pos ! = std : : string : : npos ) {
2019-08-21 14:59:22 +00:00
settings - > name = settings - > default_checkPath . substr ( pos + 1 ) ;
2019-08-11 14:52:23 +00:00
if ( settings - > debugMode )
2019-08-21 14:59:22 +00:00
std : : cout < < " > Use Path from -C for Name: " < < settings - > default_checkPath < < " -> " < < settings - > name < < std : : endl ;
2019-08-11 14:52:23 +00:00
}
} if ( settings - > name = = " " ) {
2019-08-11 17:44:37 +00:00
std : : cout < < " => Error: Kein Name angegeben. " < < std : : endl ;
2019-09-04 09:04:20 +00:00
std : : cout < < " Aufruf: " < < settings - > programName < < " default [OPTION]... [NAME]... " < < std : : endl ;
std : : cout < < " \" " < < settings - > programName < < " default --help \" liefert weitere Informationen. " < < std : : endl ;
2019-08-11 14:52:23 +00:00
return 27 ;
}
2019-07-08 18:17:11 +00:00
}
2019-07-07 16:30:37 +00:00
2019-08-11 17:44:37 +00:00
//Überprüfe ob ein Muster existiert:
2019-08-21 14:59:22 +00:00
if ( settings - > default_checkPath ! = " " & & settings - > default_Searchmuster = = " " ) {
2019-08-11 17:44:37 +00:00
std : : cout < < " => Error: [-m]: Kein Muster angegeben. " < < std : : endl ;
return 31 ;
}
2019-08-11 18:15:35 +00:00
2019-08-11 14:52:23 +00:00
//Liste alle Dateien in dem Ornder von -C auf und speichere diese
2019-08-03 19:48:27 +00:00
std : : string dirFiles ;
2019-08-21 14:59:22 +00:00
if ( settings - > default_checkPath ! = " " )
2019-10-08 18:03:15 +00:00
if ( listDir ( dirFiles , settings - > default_checkPath , settings - > default_maxDirs ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : listDir failed. " < < std : : endl ;
2019-08-03 19:48:27 +00:00
return 28 ;
2019-10-08 18:03:15 +00:00
}
2019-08-21 14:59:22 +00:00
if ( dirFiles . length ( ) > 0 ) //Entferne von der liste das \n am ende
2019-08-11 14:52:23 +00:00
dirFiles . pop_back ( ) ;
2019-08-21 14:59:22 +00:00
if ( settings - > debugMode & & settings - > default_checkPath ! = " " ) //Wenn Debug Mode, gib die Liste aus
2019-08-11 14:52:23 +00:00
std : : cout < < " > [-C] Files: \n " < < dirFiles < < std : : endl ;
2019-08-03 19:48:27 +00:00
2019-08-21 14:59:22 +00:00
2019-08-11 14:52:23 +00:00
//Führe Function aus, die überprüft ob die serie existiert
2019-07-06 18:47:29 +00:00
std : : string nameInUrl = pageManager . checkName ( settings - > name ) ;
2019-08-03 16:23:12 +00:00
if ( nameInUrl = = " -1 " ) {
2019-08-22 17:56:22 +00:00
//Wenn nicht, dann fühe noch eine Suche nach ähnlichen durch && Wenn nur 1ne dacnn frag ob es diese ist.
2019-10-08 18:03:15 +00:00
if ( sucheNach_1_Serien ( settings , pageManager , nameInUrl ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : sucheNach_1_Serien failed or found more options. " < < std : : endl ;
2019-08-22 17:56:22 +00:00
return 202 ;
2019-10-08 18:03:15 +00:00
}
2019-08-03 16:23:12 +00:00
}
2019-08-15 12:20:06 +00:00
2019-08-16 18:15:35 +00:00
/* Wenn multihtreading seaktiviert ist, normal login sonst bereite threads vor
2019-08-16 11:32:13 +00:00
if ( settings - > maxThreads = = 0 ) {
// melde bei s.to an und speicher cookies.
if ( pageManager . login ( accountManager . getNextAccount ( ) ) ! = 0 ) //----------------------------------------
return 29 ;
2019-08-16 18:15:35 +00:00
} */
if ( settings - > maxThreads > 0 ) {
2019-08-16 11:32:13 +00:00
for ( unsigned i = 0 ; i < settings - > maxThreads ; + + i ) {
2019-08-17 12:04:53 +00:00
if ( dirExists ( settings - > cookieFilePath + std : : to_string ( i ) ) ) {
std : : cout < < " => Error: Kann Cokkie-File nicht erstellen: Es existiert bereits ein Ordner mit diesem Namen: \n ' "
< < settings - > cookieFilePath + std : : to_string ( i ) < < " '. " < < std : : endl ;
return 174 ;
}
2019-08-31 18:35:11 +00:00
PageManager * pm = new PageManager ( settings - > proxy_ip + " : " + std : : to_string ( settings - > proxy_port ) , settings - > cookieFilePath + std : : to_string ( i ) ) ;
2019-08-16 11:32:13 +00:00
pm - > setDebugMode ( settings - > debugMode ) ;
2019-08-16 18:12:25 +00:00
//pm->setProxy(settings->proxy_ip, settings->proxy_port);
//pm->setCookieFilePath(settings->cookieFilePath + std::to_string( i ));
2019-08-17 14:06:33 +00:00
ThreadData * newThreadData = new ThreadData ( i , 0 , nameInUrl , - 1 , settings , & accountManager , pm ) ;
threadList . push_back ( newThreadData ) ;
2019-08-16 11:32:13 +00:00
}
2019-08-15 12:20:06 +00:00
}
2019-08-21 15:12:52 +00:00
//Write Name to File if -o is set und kein TXT-FILE angegeben wird
if ( settings - > outputFilePath ! = " " & & ! fileExists ( settings - > default_checkPath ) )
2019-10-08 18:03:15 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePath , " Name: " + settings - > name ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile Function fails when write Name. " < < std : : endl ;
2019-08-21 20:02:41 +00:00
return 31 ;
2019-10-08 18:03:15 +00:00
}
2019-07-06 18:47:29 +00:00
2019-08-11 14:52:23 +00:00
//Finde die anzahl der staffel heraus:
//download html von der startpage einer serie
2019-07-06 18:47:29 +00:00
Reply tmp_reply = pageManager . getServerRequest ( pageManager . UrlPraefix + nameInUrl ) ;
2019-10-08 18:03:15 +00:00
if ( tmp_reply . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest failed, when download startpage. " < < std : : endl ;
2019-07-07 16:30:37 +00:00
return 32 ;
2019-10-08 18:03:15 +00:00
}
2019-08-11 14:52:23 +00:00
//speicher zahl -1, ab da wo /staffel-x nicht mehr vorkommt
2019-07-06 18:47:29 +00:00
int maxStaffel = pageManager . counterContains ( tmp_reply . html , " /staffel-%i " ) ;
2019-07-08 18:17:11 +00:00
if ( settings - > debugMode )
2019-08-11 14:52:23 +00:00
std : : cout < < " > Die Serie " < < settings - > name < < " hat " < < maxStaffel < < " Staffeln. " < < std : : endl ;
2019-10-08 18:03:15 +00:00
//wenn starterstaffel 0 ist, also letzte staffel, dann ersetzte variable mit maxStaffeln
2019-08-21 20:02:41 +00:00
if ( settings - > startSeason = = 0 )
settings - > startSeason = maxStaffel ;
2019-10-08 18:03:15 +00:00
//For every season
2019-07-08 18:17:11 +00:00
for ( int staffel = settings - > startSeason ; staffel < = maxStaffel ; + + staffel ) {
2019-08-21 10:50:50 +00:00
//Test for stopping Program caused -E, -S
2019-08-21 14:59:22 +00:00
if ( staffel > settings - > stopSeason & & settings - > stopSeason > 0 ) {
2019-10-08 16:56:53 +00:00
if ( settings - > maxThreads ! = 0 )
2019-10-08 18:03:15 +00:00
if ( waitForThreads ( ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Wait for the Threads failed. " < < std : : endl ;
2019-10-08 16:56:53 +00:00
return 261 ;
2019-10-08 18:03:15 +00:00
}
2019-08-21 10:50:50 +00:00
if ( settings - > debugMode )
std : : cout < < " > Stoppe, weil Staffel: " < < staffel < < " > StopStaffel " < < settings - > stopSeason < < std : : endl ;
std : : cout < < " > Fertig, da Staffel " < < staffel < < " größer ist als StopStaffel " < < settings - > stopSeason < < std : : endl ;
return 0 ;
}
2019-07-06 18:47:29 +00:00
//Find out number of all episodes
2019-10-08 18:03:15 +00:00
if ( ( tmp_reply = pageManager . getServerRequest ( pageManager . UrlPraefix + nameInUrl + " /staffel- " + std : : to_string ( staffel ) ) ) . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest failed when download season page. " < < std : : endl ;
2019-07-07 16:30:37 +00:00
return 40 ;
2019-10-08 18:03:15 +00:00
}
2019-07-06 18:47:29 +00:00
int maxFolge = pageManager . counterContains ( tmp_reply . html , " /episode-%i " ) ;
2019-07-08 18:17:11 +00:00
2019-10-08 18:03:15 +00:00
//Print seasons
2019-07-08 18:17:11 +00:00
if ( settings - > debugMode )
2019-08-11 14:52:23 +00:00
std : : cout < < " > Die Staffel " < < staffel < < " hat " < < maxFolge < < " Folgen. " < < std : : endl ;
2019-07-06 18:47:29 +00:00
//for every episode
2019-07-08 18:17:11 +00:00
for ( int folge = settings - > startEpisode ; folge < = maxFolge ; + + folge ) {
2019-10-08 18:03:15 +00:00
2019-08-21 14:59:22 +00:00
// stoppe wenn stopfolge größer der folge ist und stopstaffel nicht gesetzt wurde. und stopepisode gröser 0, also aktiv ist
if ( folge > settings - > stopEpisode & & settings - > stopSeason < 1 & & settings - > stopEpisode > 0 ) {
2019-08-21 10:50:50 +00:00
if ( settings - > maxThreads ! = 0 )
2019-10-08 18:03:15 +00:00
if ( waitForThreads ( ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Wait for the Threads failed. " < < std : : endl ;
2019-08-21 10:50:50 +00:00
return 261 ;
2019-10-08 18:03:15 +00:00
}
2019-08-21 10:50:50 +00:00
std : : cout < < " > Fertig, da Folge " < < folge < < " größer ist als Stopfolge " < < settings - > stopEpisode < < " . " < < std : : endl ;
return 0 ;
2019-10-08 18:03:15 +00:00
// stoppe wenn stopfolge > folge && stopstaffel >= staffel und stopepisode gröser 0, also aktiv ist
} else if ( folge > settings - > stopEpisode & & staffel > = settings - > stopSeason & & settings - > stopEpisode > 0 ) {
2019-08-21 10:50:50 +00:00
if ( settings - > maxThreads ! = 0 )
2019-10-08 18:03:15 +00:00
if ( waitForThreads ( ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Wait for the Threads failed. " < < std : : endl ;
2019-08-21 10:50:50 +00:00
return 267 ;
2019-10-08 18:03:15 +00:00
}
2019-08-21 10:50:50 +00:00
std : : cout < < " > Fertig, da Folge " < < folge < < " größer ist als Stopfolge " < < settings - > stopEpisode < < std : : endl
< < " und Staffel " < < staffel < < " größer gleich Stopstaffel " < < settings - > stopSeason < < " ist. " < < std : : endl ;
return 0 ;
}
2019-07-06 18:47:29 +00:00
2019-08-11 14:52:23 +00:00
//Überprüfe ob, wenn -C vorhanden, die Folge in dem Ordner bereits vorkommt.
2019-08-21 14:59:22 +00:00
if ( settings - > default_checkPath ! = " " ) {
2019-08-03 19:48:27 +00:00
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 )
2019-08-11 14:52:23 +00:00
std : : cout < < " > Skippe Folge: S " < < staffel < < " E " < < folge < < std : : endl ;
2019-08-03 19:48:27 +00:00
continue ;
}
}
2019-08-16 11:32:13 +00:00
//Multihreading Mode
if ( settings - > maxThreads > 0 ) {
//Wenn nex Thread noch in den Vector passt(weniger Threads als Max), dann Starte neuen mit data aus dem Vector...
if ( nextThread < threadList . size ( ) ) {
threadList [ nextThread ] - > exitState = 0 ;
threadList [ nextThread ] - > setData ( staffel , folge ) ;
if ( pthread_create ( & threadList [ nextThread ] - > thread , nullptr , threadFunction , reinterpret_cast < void * > ( threadList [ nextThread ] ) ) ! = 0 ) {
perror ( " pthread_creat failed " ) ;
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Create thread for redirect converting failed. " < < std : : endl ;
2019-08-16 11:32:13 +00:00
return 48 ;
2019-08-15 12:20:06 +00:00
}
2019-09-04 20:05:41 +00:00
+ + nextThread ;
2019-08-16 11:32:13 +00:00
} else { // Sonnst warte bis alle Fertig sind und restarte die Folge
2019-10-08 18:03:15 +00:00
if ( waitForThreads ( ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Wait for the Threads failed. " < < std : : endl ;
2019-08-16 11:32:13 +00:00
return 231 ;
2019-10-08 18:03:15 +00:00
}
2019-08-16 11:32:13 +00:00
nextThread = 0 ;
folge - - ;
continue ;
2019-08-15 12:20:06 +00:00
}
2019-10-08 18:03:15 +00:00
// Default Mode
} else {
2019-08-16 11:32:13 +00:00
tmp_reply = pageManager . getServerRequest ( pageManager . UrlPraefix + nameInUrl + " /staffel- " + std : : to_string ( staffel ) + " /episode- " + std : : to_string ( folge ) ) ;
2019-10-08 18:03:15 +00:00
if ( tmp_reply . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest failed when download episoden page. " < < std : : endl ;
2019-08-16 11:32:13 +00:00
return 50 ;
2019-10-08 18:03:15 +00:00
}
2019-08-16 11:32:13 +00:00
std : : string allLinks = pageManager . getLinks ( tmp_reply . html ) ;
2019-10-04 19:29:37 +00:00
if ( settings - > genaueHoster = = " *, " & & settings - > debugMode ) {
if ( settings - > debugMode )
std : : cout < < allLinks < < std : : endl ;
std : : stringstream strstrem ( allLinks ) ;
std : : string line ;
while ( std : : getline ( strstrem , line ) . good ( ) ) {
size_t pos = line . find ( " /redirect/ " ) ;
if ( pos = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte den Redirect Link in der Zeile aus LinksListe nicht finden. " < < std : : endl ;
return 400 ;
} else
line . erase ( 0 , pos ) ;
line . erase ( line . find ( " \" " ) ) ;
2019-10-08 18:03:15 +00:00
if ( convertLink ( line , & accountManager , settings , staffel , folge , allLinks ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : convertLink failed. " < < std : : endl ;
2019-10-04 19:29:37 +00:00
return 51 ;
2019-10-08 18:03:15 +00:00
}
2019-10-04 19:29:37 +00:00
}
//Stop beacause same episode every account can only 2 videos not 10-12
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Stop Program, because '*'-Hoster is inperformatnt: Every Account can only 2 Vidoes not 10-12. " < < std : : endl ;
2019-10-04 19:29:37 +00:00
return 0 ;
} else {
std : : string Link = pageManager . chooseHosterLink ( allLinks , settings - > genaueHoster , settings - > languages ) ;
if ( settings - > debugMode )
std : : cout < < allLinks < < std : : endl < < ( ( Link = = " " ) ? " " : " -> Link: 'https://s.to " ) < < Link < < ( ( Link = = " " ) ? " " : " ' \n " ) ;
2019-10-08 18:03:15 +00:00
if ( convertLink ( Link , & accountManager , settings , staffel , folge , allLinks ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : convert Link failed. " < < std : : endl ;
2019-10-04 19:29:37 +00:00
return 51 ;
2019-10-08 18:03:15 +00:00
}
2019-10-04 19:29:37 +00:00
}
2019-08-15 12:20:06 +00:00
2019-08-16 11:32:13 +00:00
}
2019-07-08 18:17:11 +00:00
}
//Setzte Startepisode zurück für nächste Staffel
settings - > startEpisode = 1 ;
2019-07-06 18:47:29 +00:00
}
2019-08-16 11:32:13 +00:00
if ( settings - > maxThreads ! = 0 )
2019-10-08 18:03:15 +00:00
if ( waitForThreads ( ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Wait for the Threads failed. " < < std : : endl ;
2019-08-16 11:32:13 +00:00
return 292 ;
2019-10-08 18:03:15 +00:00
}
2019-08-15 12:37:16 +00:00
2019-08-16 11:32:13 +00:00
std : : cout < < " > Fertig " < < std : : endl ;
return 0 ;
}
2019-07-06 18:47:29 +00:00
int ProgramManager : : directLinkModus ( Settings * settings )
{
2019-07-08 18:17:11 +00:00
AccountManager accountManager ( settings - > accountFilePath , settings - > accountNumberPath ) ;
if ( settings - > name = = " " ) {
2019-08-11 17:15:33 +00:00
std : : cout < < " => Error: Kein(e) Link(s) angegeben. " < < std : : endl ;
2019-09-04 09:04:20 +00:00
std : : cout < < " Aufruf: " < < settings - > programName < < " url [OPTION]... [URL]... " < < std : : endl ;
std : : cout < < " \" " < < settings - > programName < < " url --help \" liefert weitere Informationen. " < < std : : endl ;
2019-07-08 18:17:11 +00:00
return 76 ;
}
2019-07-06 18:47:29 +00:00
std : : istringstream iStrStream ( pageManager . replace ( settings - > name , " , " , " \n " ) + " \n " ) ;
std : : string line ;
2019-08-16 18:15:35 +00:00
//if(pageManager.login(accountManager.getNextAccount()) != 0)
// return 71;
2019-07-07 16:30:37 +00:00
2019-07-06 18:47:29 +00:00
while ( getline ( iStrStream , line ) . good ( ) ) {
2019-09-30 16:23:34 +00:00
if ( line . find ( " /redirect/ " ) = = std : : string : : npos ) {
2019-08-11 14:52:23 +00:00
std : : cout < < " => Error: Invalid Redirect Link: ' " < < line < < " ' " < < std : : endl ;
2019-07-06 18:47:29 +00:00
continue ;
2019-09-30 16:23:34 +00:00
2019-10-08 18:03:15 +00:00
} else if ( convertLink ( line . erase ( 0 , ( ( line . find ( " s.to " ) = = std : : string : : npos ) ? 0 : line . find ( " s.to " ) + 4 ) ) , & accountManager , settings ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : convert Link failed. " < < std : : endl ;
2019-07-06 18:47:29 +00:00
return 78 ;
2019-10-08 18:03:15 +00:00
}
2019-07-06 18:47:29 +00:00
}
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Success. " < < std : : endl ;
2019-07-06 18:47:29 +00:00
return 0 ;
}
2019-10-10 15:39:57 +00:00
int ProgramManager : : searchModus ( Settings * settings , std : : string * saveTo , bool noPrint )
2019-08-03 16:23:12 +00:00
{
if ( settings - > search_wantUpdate ) {
int res = searchModus_update ( settings ) ;
2019-10-04 18:24:51 +00:00
if ( res = = 0 ) {
2019-08-03 16:23:12 +00:00
std : : cout < < " Erfolgreich geupdatet: Die Serienliste ist nun auf dem neusten Stand. " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( settings - > name = = " " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : Stop after Update: No Name => Only Updating. " < < std : : endl ;
2019-10-04 18:24:51 +00:00
return 0 ;
2019-10-08 18:03:15 +00:00
}
2019-10-04 18:24:51 +00:00
} else {
2019-08-22 11:11:00 +00:00
std : : cout < < " => Error: Das updaten der Serienliste ist fehlgeschlagen. " < < std : : endl ;
2019-10-04 18:24:51 +00:00
return res ;
}
2019-08-03 16:23:12 +00:00
} else if ( settings - > name = = " " ) {
2019-08-11 17:15:33 +00:00
std : : cout < < " => Error: Kein Name angegeben. " < < std : : endl ;
2019-09-04 09:04:20 +00:00
std : : cout < < " Aufruf: " < < settings - > programName < < " search [OPTION]... [NAME]... " < < std : : endl ;
std : : cout < < " \" " < < settings - > programName < < " search --help \" liefert weitere Informationen. " < < std : : endl ;
2019-08-03 16:23:12 +00:00
return 27 ;
}
std : : ifstream ifs ( settings - > serienListPath ) ;
if ( ! ifs . is_open ( ) ) {
2019-10-04 18:11:01 +00:00
std : : cout < < " => Keine SerienListe vorhanden. Erstelle eine neue... " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( searchModus_update ( settings ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : searchModus_update function failed. " < < std : : endl ;
2019-08-03 16:23:12 +00:00
return 354 ;
2019-10-08 18:03:15 +00:00
}
2019-08-03 16:23:12 +00:00
else {
ifs . open ( settings - > serienListPath ) ;
if ( ! ifs . is_open ( ) ) {
2019-08-11 14:52:23 +00:00
perror ( " => Error: Couldn't open SerienList file after update again. " ) ;
2019-08-03 16:23:12 +00:00
return 434 ;
}
std : : cout < < " Erfolgreich gedownloadet. " < < std : : endl ;
}
}
2019-10-04 18:11:01 +00:00
//Check for last Update..
2019-10-08 18:03:15 +00:00
if ( checkLastUpdate ( settings ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : checkLastUpdate function failed. " < < std : : endl ;
2019-10-04 18:11:01 +00:00
return - 1 ;
2019-10-08 18:03:15 +00:00
}
2019-10-04 18:11:01 +00:00
2019-08-03 16:23:12 +00:00
//Save file in string:
std : : string serienListe ( ( std : : istreambuf_iterator < char > ( ifs ) ) , std : : istreambuf_iterator < char > ( ) ) ;
2019-08-11 14:52:23 +00:00
//Suche alle Möglichkeiten
2019-08-03 16:23:12 +00:00
std : : string finds = pageManager . grep ( serienListe , settings - > name , settings - > search_IgnoreUpperLower ) ;
2019-08-11 14:52:23 +00:00
serienListe . clear ( ) ; // Speicher freigeben
2019-08-03 16:23:12 +00:00
2019-08-17 11:54:24 +00:00
/*//Text mit Farben versehen
2019-08-03 16:23:12 +00:00
if ( ! settings - > colorless ) {
for ( size_t pos = pageManager . upper_string ( finds ) . find ( pageManager . upper_string ( settings - > name ) , 0 ) ;
pos ! = std : : string : : npos ;
pos = pageManager . upper_string ( finds ) . find ( pageManager . upper_string ( settings - > name ) , pos + settings - > name . length ( ) + strlen ( " \033 [37m \033 [0m " ) ) )
finds . insert ( pos , ( ( finds . find ( settings - > name , pos ) = = pos ) ? " \033 [32m " : " \033 [36m " ) ) . insert ( pos + settings - > name . length ( ) + strlen ( " \033 [37m " ) , " \033 [0m " ) ;
2019-08-17 11:54:24 +00:00
} */
2019-08-03 16:23:12 +00:00
2019-08-22 17:56:22 +00:00
if ( saveTo ) {
//Save List to Variable if set
* saveTo = finds ;
2019-10-10 15:39:57 +00:00
} if ( noPrint ) {
return 0 ;
2019-08-22 17:56:22 +00:00
}
2019-08-17 11:54:24 +00:00
//Text mit Farben versehen
if ( ! settings - > colorless ) {
std : : string UpperFinds = pageManager . upper_string ( finds ) ;
std : : string UpperName = pageManager . upper_string ( settings - > name ) ;
for ( size_t pos = UpperFinds . find ( UpperName , 0 ) ; pos ! = std : : string : : npos ; pos = UpperFinds . find ( UpperName , pos + settings - > name . length ( ) + strlen ( " \033 [37m \033 [0m " ) ) ) {
bool exaktGeschrieben = ( finds . find ( settings - > name , pos ) = = pos ) ;
finds . insert ( pos , ( ( exaktGeschrieben ) ? " \033 [32m " : " \033 [36m " ) ) . insert ( pos + settings - > name . length ( ) + strlen ( " \033 [37m " ) , " \033 [0m " ) ;
UpperFinds . insert ( pos , ( ( exaktGeschrieben ) ? " \033 [32m " : " \033 [36m " ) ) . insert ( pos + settings - > name . length ( ) + strlen ( " \033 [37m " ) , " \033 [0m " ) ;
}
}
2019-08-11 14:52:23 +00:00
//Ausgabe
if ( finds = = " " ) {
2019-08-11 17:44:37 +00:00
std : : cout < < " => Für ' " < < settings - > name < < " ' wurde(n) keine Serie(n) gefunden. " < < std : : endl ;
2019-08-11 14:52:23 +00:00
return 0 ;
}
2019-08-03 16:23:12 +00:00
std : : stringstream strstream ( finds ) ;
std : : string line ;
2019-08-11 14:52:23 +00:00
std : : cout < < " => Für ' " < < settings - > name < < " ' wurde(n) folgende Serie(n) gefunden: " < < std : : endl ;
2019-08-03 16:23:12 +00:00
while ( getline ( strstream , line ) ) {
2019-08-11 17:15:33 +00:00
std : : cout < < " > " < < line . substr ( line . find ( " | " , line . find ( " / " ) ) + 1 , line . length ( ) - line . find ( " | " , line . find ( " / " ) ) - 1 )
2019-08-03 16:23:12 +00:00
< < " \t [ " < < line . substr ( line . find ( " / " ) + 1 , line . find ( " | " , line . find ( " / " ) ) - line . find ( " / " ) - 1 ) < < " ] "
< < ( ( line [ 0 ] = = ' | ' ) ? " " : " \t ( " + line . substr ( 0 , line . find ( " | " ) ) + " ) " ) < < std : : endl ;
}
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : success. " < < std : : endl ;
2019-08-03 16:23:12 +00:00
return 0 ;
}
2019-08-13 16:59:01 +00:00
int ProgramManager : : infoModus ( Settings * settings )
{
if ( settings - > name = = " " ) {
std : : cout < < " => Error: Kein Name angegeben. " < < std : : endl ;
2019-09-04 09:04:20 +00:00
std : : cout < < " Aufruf: " < < settings - > programName < < " info [OPTION]... [NAME]... " < < std : : endl ;
std : : cout < < " \" " < < settings - > programName < < " info --help \" liefert weitere Informationen. " < < std : : endl ;
2019-08-13 16:59:01 +00:00
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.
2019-10-08 18:03:15 +00:00
if ( sucheNach_1_Serien ( settings , pageManager , nameInUrl ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : sucheNach_1_Serien function failed. " < < std : : endl ;
2019-08-22 17:56:22 +00:00
return 28 ;
2019-10-08 18:03:15 +00:00
}
2019-08-13 16:59:01 +00:00
}
//Finde Anzahl der Staffel heraus:
Reply tmp_reply = pageManager . getServerRequest ( pageManager . UrlPraefix + nameInUrl ) ;
2019-10-08 18:03:15 +00:00
if ( tmp_reply . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed: at homepage. " < < std : : endl ;
2019-08-13 16:59:01 +00:00
return 32 ;
2019-10-08 18:03:15 +00:00
}
2019-08-13 16:59:01 +00:00
//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 ) ) ;
2019-10-08 18:03:15 +00:00
if ( tmpReply . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed: at season page. " < < std : : endl ;
2019-08-13 16:59:01 +00:00
return 40 ;
2019-10-08 18:03:15 +00:00
}
2019-09-01 18:21:06 +00:00
std : : cout < < " Die Staffel " < < staffel < < " hat " < < pageManager . counterContains ( tmpReply . html , " /episode-%i " ) < < " Folge(n). " < < std : : endl ;
2019-08-13 16:59:01 +00:00
2019-09-01 18:21:06 +00:00
std : : string html = tmpReply . html ;
size_t pos = 0 ;
if ( ( pos = html . find ( " <tr " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<tr ' nicht finden. " < < std : : endl ;
return 41 ;
} else
html . erase ( 0 , pos ) ;
if ( ( pos = html . find ( " </tbody> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '</tbody>' nicht finden. " < < std : : endl ;
return 42 ;
} else
html . erase ( pos , std : : string : : npos ) ;
html = pageManager . replace ( html , " \n " , " " ) ;
html = pageManager . replace ( html , " </tr> " , " \n " ) ;
std : : stringstream folgenListe ( html ) ;
std : : string line ;
while ( std : : getline ( folgenListe , line ) . good ( ) ) {
std : : string titel ;
if ( ( pos = line . find ( " \" > Folge " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von ' \" > Folge' nicht finden. " < < std : : endl ;
return 43 ;
} else
line . erase ( 0 , pos + 3 ) ;
if ( ( pos = line . find ( " </a> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von ' </a>' nicht finden. " < < std : : endl ;
return 44 ;
}
std : : cout < < " Staffel " < < staffel < < " " < < line . substr ( 0 , pos ) < < " : " < < std : : endl ;
2019-08-21 14:31:17 +00:00
2019-09-01 18:21:06 +00:00
if ( ( pos = line . find ( " <strong> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<strong>' nicht finden. " < < std : : endl ;
return 43 ;
} else
line . erase ( 0 , pos + 8 ) ;
if ( ( pos = line . find ( " </strong> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '</strong>' nicht finden. " < < std : : endl ;
return 44 ;
}
titel = line . substr ( 0 , pos ) ;
if ( titel ! = " " )
std : : cout < < " > Titel1: " < < titel < < std : : endl ;
if ( ( pos = line . find ( " <span> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<span>' nicht finden. " < < std : : endl ;
return 43 ;
} else
line . erase ( 0 , pos + 6 ) ;
if ( ( pos = line . find ( " </span> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '</span>' nicht finden. " < < std : : endl ;
return 44 ;
}
titel = line . substr ( 0 , pos ) ;
if ( titel ! = " " )
std : : cout < < " > Titel2: " < < titel < < std : : endl ;
}
2019-08-21 14:31:17 +00:00
2019-08-13 16:59:01 +00:00
}
//Datum & FSK
std : : string line = pageManager . grep ( tmp_reply . html , " <small> (<span itemprop= \" startDate \" ><a " ) ;
if ( line = = " " ) {
std : : cout < < " => Error: Konnte '<small> (<span itemprop= \" startDate \" ><a' nicht finden. " < < std : : endl ;
return 83 ;
}
std : : string startStopDates [ 2 ] ;
size_t pos = 0 , pos2 = 0 ;
2019-08-21 14:31:17 +00:00
//Date
2019-08-13 16:59:01 +00:00
for ( int i = 0 ; i < 2 ; + + i ) {
if ( ( pos = line . find ( " href= " ) ) = = std : : string : : npos ) {
std : : cout < < " => 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 ( " </a> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte '</a>' nicht finden. " < < std : : endl ;
return 86 ;
}
startStopDates [ i ] = line . substr ( pos + 1 , pos2 - pos - 1 ) ;
}
2019-08-21 14:31:17 +00:00
//FSK
2019-08-13 16:59:01 +00:00
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 " , " " ) , " <br /> " , " " ) ;
2019-10-17 17:47:19 +00:00
//remove bug text: &quot;
2019-08-13 16:59:01 +00:00
//Genres
std : : vector < std : : string > 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 ( " </a> " , pos ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte '</a>' 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 < < " \n Beschreibung: " < < description < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : success exit. " < < std : : endl ;
2019-08-13 16:59:01 +00:00
return 0 ;
}
2019-09-20 19:47:02 +00:00
int ProgramManager : : newsModus ( Settings * settings )
{
size_t pos = 0 ;
std : : string html = pageManager . getServerRequest ( " https://s.to/neue-episoden " ) . html ;
2019-10-08 18:03:15 +00:00
if ( html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed. " < < std : : endl ;
2019-09-20 19:47:02 +00:00
return 1 ;
2019-10-08 18:03:15 +00:00
}
2019-09-20 19:47:02 +00:00
if ( ( pos = html . find ( " <div class= \" row \" > " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<div class= \" row \" >'' nicht finden " < < std : : endl ;
return 2 ;
} else
html . erase ( 0 , pos + 17 ) ;
if ( ( pos = html . find ( " <div class= \" cf \" ></div> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<div class= \" cf \" ></div>' nicht finden " < < std : : endl ;
return 2 ;
} else
html . erase ( pos + 12 ) ;
html = pageManager . replace ( html , " \n " , " " ) ;
html = pageManager . replace ( html , " class= \" row \" " , " \n " ) ;
std : : stringstream strstream ( html + " \n " ) ;
html . clear ( ) ;
std : : string line ;
while ( std : : getline ( strstream , line ) . good ( ) ) {
size_t pos = line . find ( " <strong> " ) ;
size_t pos2 = line . find ( " </strong> " ) ;
if ( pos = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '<strong>' nicht finden " < < std : : endl ;
return 3 ;
} else if ( pos2 = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '</strong>' nicht finden " < < std : : endl ;
return 4 ;
}
std : : string name = line . substr ( pos + 8 , pos2 - pos - 8 ) ;
if ( ( pos = line . find ( " blue2 \" > " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von 'blue2 \" >' nicht finden " < < std : : endl ;
return 5 ;
} else if ( ( pos2 = line . find ( " </span> " , pos ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '' nicht finden " < < std : : endl ;
return 6 ;
}
std : : string id = pageManager . replace ( line . substr ( pos + 7 , pos2 - pos - 7 ) , " " , " " ) ;
if ( ( pos = line . find ( " Right \" > " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von 'Right \" >' nicht finden " < < std : : endl ;
return 5 ;
} else if ( ( pos2 = line . find ( " </span> " , pos ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von '</span>' nicht finden " < < std : : endl ;
return 6 ;
}
std : : string date = line . substr ( pos + 7 , pos2 - pos - 7 ) ;
std : : cout < < " > " < < ( ( settings - > colorless ) ? " " : " \033 [97m " ) < < date < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < " : "
< < ( ( settings - > colorless ) ? " " : " \033 [96m " ) < < name < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < " : "
< < ( ( settings - > colorless ) ? " " : " \033 [92m " ) < < id < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
}
2019-10-13 12:28:53 +00:00
return 0 ;
}
int ProgramManager : : updateModus ( Settings * settings )
{
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Suche nach der neusten Version... " < < std : : endl ;
2019-10-14 16:27:14 +00:00
std : : string html = pageManager . getServerRequest ( settings - > VersionFileUrl ) . html ;
2019-10-13 12:28:53 +00:00
2019-10-17 16:10:13 +00:00
if ( html = = " -1 " | | html = = " " | | html . find ( " \n " ) = = std : : string : : npos ) {
2019-10-15 17:32:27 +00:00
// Wenn debug mode print error
2019-10-13 12:28:53 +00:00
if ( settings - > debugMode )
2019-10-14 15:59:59 +00:00
std : : cerr < < " => Error: Download newst Version failed. " < < std : : endl ;
2019-10-15 17:32:27 +00:00
// no error output in pagemanager => print error
else if ( html = = " " )
std : : cout < < " => Error: Das herunterladen der neusten Version ist fehlgeschlagen. " < < std : : endl ;
2019-10-14 16:27:14 +00:00
return 1 ;
2019-10-13 12:28:53 +00:00
} else {
html = pageManager . replace ( html , " \r " , " " ) ;
}
2019-10-17 16:10:13 +00:00
2019-10-13 12:28:53 +00:00
// Get newst Version
2019-10-17 16:10:13 +00:00
std : : string neusteVersion = html . substr ( 0 , html . find ( " \n " ) ) ;
html . erase ( 0 , html . find ( " \n " ) + 1 ) ;
2019-10-13 12:28:53 +00:00
2019-10-15 17:32:27 +00:00
//Gib Versionenunterschie aus
2019-10-14 16:27:14 +00:00
std : : cout < < " => INFO: Jetzige Version: ' " < < settings - > version < < " ' - Neueste Version: ' " < < neusteVersion < < " ' " < < std : : endl ;
2019-10-13 12:28:53 +00:00
2019-10-14 16:34:14 +00:00
//Print INFOs
std : : cout < < " => Infos (zur Version): " < < std : : endl ;
std : : string line ;
2019-10-17 16:10:13 +00:00
std : : stringstream strstream ( html + " \n " ) ;
2019-10-14 16:34:14 +00:00
while ( std : : getline ( strstream , line ) . good ( ) ) {
2019-10-14 16:46:51 +00:00
if ( line ! = " " )
2019-10-14 16:57:48 +00:00
std : : cout < < " > " < < line < < std : : endl ;
2019-10-14 16:34:14 +00:00
}
//Vergleiche Versionen:
2019-10-17 16:10:13 +00:00
switch ( pageManager . compareVersions ( settings - > version , neusteVersion ) ) {
case 0 :
2019-10-14 16:57:48 +00:00
std : : cout < < " \n => Du benützt bereits die neuste Release-Version. " < < std : : endl ;
2019-10-13 12:28:53 +00:00
return 0 ;
2019-10-17 16:10:13 +00:00
case 1 :
//Diese Version ist klleienr als aktuelle Version => Updatete
break ;
case 2 :
std : : cout < < " \n => Du benützt bereits eine Aktuellere Version als die neuste Release-Version. " < < std : : endl ;
return 0 ;
default :
//Error
return 2 ;
2019-10-13 12:28:53 +00:00
}
2019-10-15 17:32:27 +00:00
//lege pfad zum speichern fest
2019-10-13 12:28:53 +00:00
std : : string downloadedFilePath = settings - > cacheDir + " NeusteVersion " + ( ( settings - > pathSymbol = = ' \\ ' ) ? " .exe " : " " ) ;
2019-10-15 17:32:27 +00:00
//wenn dort schon eine datei existiert, lösche diese
std : : cout < < " => INFO: Lösche Download-Datei, fallst bereits eine vorhanden ist... " < < std : : endl ;
if ( fileExists ( downloadedFilePath ) ) {
2019-10-14 17:49:53 +00:00
if ( remove ( downloadedFilePath . c_str ( ) ) ! = 0 ) {
2019-10-15 17:32:27 +00:00
perror ( ( " => Error: Das löschen der Datei ' " + downloadedFilePath + " ' ist fehlgeschlagen " ) . c_str ( ) ) ;
2019-10-14 17:49:53 +00:00
return 13 ;
2019-10-15 17:32:27 +00:00
} else if ( settings - > debugMode ) {
std : : cout < < " => DEBUG: Erfolgreich alte gedownloadete Datei ' " < < downloadedFilePath < < " ' gelöscht. " < < std : : endl ;
2019-10-14 17:49:53 +00:00
}
2019-10-15 17:32:27 +00:00
}
//Download new Version of Program
std : : cout < < " => INFO: Lade neue Version herunter... " < < std : : endl ;
2019-10-14 17:49:53 +00:00
2019-10-14 13:16:15 +00:00
if ( pageManager . downLoadToFile ( downloadedFilePath , settings - > ProgrammFileUrl ) ! = 0 ) {
2019-10-15 17:32:27 +00:00
std : : cout < < " \n => Error: Das herunterladen der neuen Version ist fehlgeschlagen. " < < std : : endl ;
2019-10-13 12:28:53 +00:00
return 3 ;
2019-10-14 17:49:53 +00:00
} std : : cout < < std : : endl ;
2019-10-13 12:28:53 +00:00
2019-10-14 16:34:14 +00:00
//Make ist executable for test execution
2019-10-13 12:28:53 +00:00
# ifdef __linux__
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Mache das Programm ausführbar... " < < std : : endl ;
if ( chmod ( downloadedFilePath . c_str ( ) , S_IRWXU ) ! = 0 ) {
perror ( " => Error: Chmod failed " ) ;
return 4 ;
}
2019-10-13 12:28:53 +00:00
# endif
2019-10-14 16:34:14 +00:00
//Führe neue Version aus und überprüfe rückgabewert
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Überprüfe die Funktionalität der neuen Version... " < < std : : endl ;
2019-10-13 12:28:53 +00:00
if ( system ( ( downloadedFilePath + " --version " ) . c_str ( ) ) ! = 0 ) {
2019-10-14 15:59:59 +00:00
perror ( " => Error: Ausführen der neuen Version ist fehlgeschlagen " ) ;
2019-10-14 16:27:14 +00:00
return 5 ;
2019-10-13 12:28:53 +00:00
}
2019-10-15 17:32:27 +00:00
//find exePath heraus
2019-10-14 13:34:49 +00:00
std : : string exePath = pageManager . getExePath ( ) ;
if ( exePath = = " " ) {
2019-10-14 15:59:59 +00:00
std : : cout < < " => Error: Function getExepath() ist fehlgeschlagen. " < < std : : endl ;
2019-10-14 16:27:14 +00:00
return 6 ;
2019-10-13 12:28:53 +00:00
}
2019-10-15 17:32:27 +00:00
//lege pfad für alte version fest
std : : string oldVersionPah = settings - > cacheDir + " oldVersion " + ( ( settings - > pathSymbol = = ' \\ ' ) ? " .exe " : " " ) ;
//lösche falls vorhanden altes backup
std : : cout < < " => INFO: Lösche alte Nofall Version falls vorhanden... " < < std : : endl ;
if ( fileExists ( oldVersionPah ) ) {
if ( remove ( oldVersionPah . c_str ( ) ) ! = 0 ) {
perror ( ( " => Error: Das löschen der Datei ' " + oldVersionPah + " ' ist fehlgeschlagen. " ) . c_str ( ) ) ;
2019-10-14 17:49:53 +00:00
return 14 ;
2019-10-15 17:32:27 +00:00
} else if ( settings - > debugMode ) {
std : : cout < < " => DEBUG: Erfolgreich Notfall Version ' " < < oldVersionPah < < " ' gelöscht. " < < std : : endl ;
2019-10-14 17:49:53 +00:00
}
}
2019-10-15 17:32:27 +00:00
//verschiebe neue jetzige version zu backup
std : : cout < < " => INFO: Verschiebe alte Version für Notfälle zu: ' " < < oldVersionPah < < " '. " < < std : : endl ;
2019-10-14 17:49:53 +00:00
2019-10-15 17:32:27 +00:00
if ( rename ( exePath . c_str ( ) , oldVersionPah . c_str ( ) ) ! = 0 ) {
perror ( ( " => Error das Verschieben von ' " + exePath + " ' -> ' " + oldVersionPah + " ' ist fehlgeschlagen " ) . c_str ( ) ) ;
return 7 ;
}
2019-10-14 17:49:53 +00:00
2019-10-15 17:32:27 +00:00
//verschibe neue Version
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Ersetzte alte Version mit neuer Version des Programms... " < < std : : endl ;
2019-10-13 12:28:53 +00:00
2019-10-14 13:16:15 +00:00
if ( rename ( downloadedFilePath . c_str ( ) , exePath . c_str ( ) ) ! = 0 ) {
2019-10-15 17:32:27 +00:00
perror ( ( " => Error: Das Verschieben von ' " + downloadedFilePath + " ' nach ' " + exePath + " ' ist fehlgeschlagen " ) . c_str ( ) ) ;
2019-10-14 16:27:14 +00:00
return 7 ;
2019-10-13 12:28:53 +00:00
} else {
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Erfolgreich verschoben und ersetzt: \n ' "
< < downloadedFilePath < < " ' -> ' " < < exePath < < " ' " < < std : : endl ;
2019-10-13 12:28:53 +00:00
}
2019-10-14 16:57:48 +00:00
std : : cout < < " \n => Update Erfolgreich ausgeführt: ' " < < settings - > version < < " ' -> ' " < < neusteVersion < < " ' " < < std : : endl ;
2019-10-13 12:28:53 +00:00
2019-09-20 19:47:02 +00:00
return 0 ;
}
2019-08-03 16:23:12 +00:00
int ProgramManager : : searchModus_update ( Settings * settings )
{
Reply reply = pageManager . getServerRequest ( " https://s.to/serien " ) ;
2019-10-08 18:03:15 +00:00
if ( reply . html = = " -1 " ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed. " < < std : : endl ;
2019-08-03 16:23:12 +00:00
return 21 ;
2019-10-08 18:03:15 +00:00
}
2019-08-11 17:20:32 +00:00
else if ( reply . html . find ( " </html> " ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte </html> in searchModus_update() nicht finden. " < < std : : endl ;
return 22 ;
}
2019-08-03 16:23:12 +00:00
std : : string serienListe = pageManager . replace ( pageManager . grep ( reply . html , " data-alternative-title " ) , " </li> " , " \n " ) ;
if ( reply . html . find ( " \" href= \" " ) = = std : : string : : npos | |
reply . html . find ( " <li><a data-alternative-title= \" " ) = = std : : string : : npos | |
reply . html . find ( " /serie/stream/ " ) = = std : : string : : npos | |
2019-10-08 18:03:15 +00:00
reply . html . find ( " </a> " ) = = std : : string : : npos ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__
2019-10-08 18:03:15 +00:00
< < " : hatml doesnt contain:' \" href= \" or <li><a data-alternative-title= \" or /serie/stream/ or </a> ' after preparing. " < < std : : endl ;
2019-08-03 16:23:12 +00:00
return 51 ;
2019-10-08 18:03:15 +00:00
}
2019-08-03 16:23:12 +00:00
//...\n<li><a data-alternative-title="" href="/serie/stream/2012-das-jahr-null" title="2012 - Das Jahr Null Stream anschauen">2012 - Das Jahr Null</a>\n...
serienListe = pageManager . replace ( serienListe , " <li><a data-alternative-title= \" " , " " ) ;
//...\n" href="/serie/stream/2012-das-jahr-null" title="2012 - Das Jahr Null Stream anschauen">2012 - Das Jahr Null</a>\n...
serienListe = pageManager . replace ( serienListe , " \" href= \" " , " | " ) ;
//...\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/ " , " |/ " ) ;
std : : stringstream strstream ( serienListe ) ;
std : : string line ;
serienListe . clear ( ) ;
while ( getline ( strstream , line ) ) {
if ( line . find ( " title= \" " ) = = std : : string : : npos )
continue ;
line . erase ( line . find ( " title= " ) , line . find ( " > " ) - line . find ( " title= " ) ) ;
//...\n|/serie/stream/2012-das-jahr-null"_weg_>2012 - Das Jahr Null</a>\n...
line = pageManager . replace ( line , " \" > " , " | " ) ;
//...\n|/serie/stream/2012-das-jahr-null|2012 - Das Jahr Null</a>\n...
line = pageManager . replace ( line , " </a> " , " " ) ;
//...\n|/serie/stream/2012-das-jahr-null"_weg_>2012 - Das Jahr Null|\n...
serienListe + = line + " \n " ;
2019-08-11 17:15:33 +00:00
}
if ( serienListe . length ( ) > 0 )
serienListe . pop_back ( ) ;
2019-08-03 16:23:12 +00:00
2019-08-11 17:15:33 +00:00
//Anzahl der Serien/Zeilen vorher:
ssize_t countBef = 0 ;
std : : ifstream myFileBef ( settings - > serienListPath ) ;
2019-10-04 11:38:59 +00:00
std : : string alteListe ;
if ( myFileBef . is_open ( ) ) {
for ( countBef = 0 ; std : : getline ( myFileBef , line ) ; + + countBef ) {
//Speicher alteListe für verglkeich nach Update
alteListe . append ( line + " \n " ) ;
//Vergeliche neue und alte list => entfernte Serien
if ( line ! = " " & & serienListe . find ( line ) = = std : : string : : npos ) {
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [91m " ) < < " Entfernt: ' " < < line . substr ( line . find_last_of ( " | " ) + 1 ) < < " ' " < < " \033 [0m " < < std : : endl ;
}
}
myFileBef . close ( ) ;
2019-10-02 20:13:15 +00:00
}
2019-08-11 17:15:33 +00:00
//Schreibe die Liste in das TextFile
2019-08-03 16:23:12 +00:00
std : : ofstream ofs ( settings - > serienListPath , std : : ios : : trunc ) ;
if ( ! ofs . is_open ( ) ) {
perror ( " Konnte SerienListe-Datei nicht öffnen " ) ;
return 111 ;
2019-10-04 11:38:59 +00:00
} else {
//Schreibe Liste in das TextFile
ofs < < serienListe < < std : : endl ;
ofs . close ( ) ;
2019-08-03 16:23:12 +00:00
}
2019-08-03 20:01:58 +00:00
2019-08-11 17:15:33 +00:00
//Anzahl der Zeile nachher
ssize_t countAf = 0 ;
std : : ifstream myFileAf ( settings - > serienListPath ) ;
2019-10-04 11:38:59 +00:00
if ( myFileAf . is_open ( ) ) {
for ( countAf = 0 ; std : : getline ( myFileAf , line ) ; + + countAf ) {
//Vergeliche neu mit Alt => gib neue Serien aus
if ( line ! = " " & & alteListe . find ( line ) = = std : : string : : npos ) {
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [92m " ) < < " Neu: ' " < < line . substr ( line . find_last_of ( " | " ) + 1 ) < < " ' " < < " \033 [0m " < < std : : endl ;
}
2019-10-02 20:13:15 +00:00
}
2019-10-04 11:38:59 +00:00
myFileAf . close ( ) ;
} else {
perror ( " Konnte SerienListe-Datei nicht öffnen " ) ;
return 112 ;
2019-10-02 20:13:15 +00:00
}
2019-10-04 11:38:59 +00:00
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [93m " ) < < " Serienunterschied: " < < ( ( ( countAf - countBef ) > 0 ) ? " + " : " " ) < < countAf - countBef < < " Serien. " < < " \033 [0m " < < std : : endl ;
2019-10-04 18:11:01 +00:00
//Speicher Dateim des Updates...
ofs . open ( settings - > lastUpdateDateFilePath , std : : ios : : trunc ) ;
if ( ! ofs . is_open ( ) ) {
perror ( " Konnte UpdateDate-Datei nicht öffnen " ) ;
return 113 ;
} else {
//Schreibe Liste in das TextFile
ofs < < pageManager . getDate ( ) < < std : : endl ;
ofs . close ( ) ;
}
2019-08-03 16:23:12 +00:00
return 0 ;
}
2019-08-03 19:48:27 +00:00
int ProgramManager : : listDir ( std : : string & list , std : : string path , int maxDepth )
{
2019-08-21 14:59:22 +00:00
//Wenn Pfad zu einem TextFile geht
if ( fileExists ( path ) ) {
std : : ifstream ifs ( path ) ;
if ( ! ifs . is_open ( ) ) {
perror ( " => Error: Konnte Textdatei nicht öffnen. " ) ;
return - 1 ;
}
list = std : : string ( ( std : : istreambuf_iterator < char > ( ifs ) ) , std : : istreambuf_iterator < char > ( ) ) ;
2019-10-08 18:03:15 +00:00
2019-08-21 14:59:22 +00:00
return 0 ;
} // Sonst normal Ordner listen
else if ( maxDepth < = 0 )
2019-08-03 19:48:27 +00:00
return 0 ;
2019-08-21 19:22:40 +00:00
else if ( nothingExists ( path ) ) {
std : : cout < < " => Warnug: Datei oder Verzeichnis existiert nicht: ' " < < path < < " ' " < < std : : endl ;
return 0 ;
2019-08-11 14:52:23 +00:00
}
2019-08-21 19:22:40 +00:00
//verkleiner varibable um 1, um zu verhindern, das endlose schleife entsteht
maxDepth - - ;
2019-08-03 19:48:27 +00:00
if ( path [ path . length ( ) - 1 ] ! = ' / ' )
path . push_back ( ' / ' ) ;
DIR * dirp = opendir ( path . c_str ( ) ) ;
if ( ! dirp ) {
2019-08-11 14:52:23 +00:00
perror ( std : : string ( " => Error: Konnte Verzeichnis nicht öffnen: " + path ) . c_str ( ) ) ;
2019-08-03 19:48:27 +00:00
return - 1 ;
}
struct dirent * dp ;
while ( ( dp = readdir ( dirp ) ) ! = nullptr ) {
if ( strcmp ( dp - > d_name , " . " ) = = 0 | | strcmp ( dp - > d_name , " .. " ) = = 0 )
continue ;
2019-08-11 14:52:23 +00:00
else if ( dirExists ( ( path + dp - > d_name + " / " ) ) ) { //if(dp->d_type == DT_DIR) {
2019-08-03 19:48:27 +00:00
listDir ( list , ( path + dp - > d_name + " / " ) , maxDepth ) ;
} else
list . append ( std : : string ( dp - > d_name ) + " \n " ) ;
}
closedir ( dirp ) ;
return 0 ;
}
2019-08-03 16:23:12 +00:00
int ProgramManager : : convertLink ( std : : string redirectLink , AccountManager * accountManager ,
Settings * settings , int Staffel , int Folge , std : : string allLinks )
2019-07-06 18:47:29 +00:00
{
std : : string folgenID = std : : string ( ( Staffel = = - 1 | | Folge = = - 1 ) ? " " : " S " + std : : string ( ( Staffel < 10 ) ? " 0 " : " " ) + std : : to_string ( Staffel )
2019-08-11 14:52:23 +00:00
+ " E " + std : : string ( ( Folge < 10 ) ? " 0 " : " " ) + std : : to_string ( Folge ) ) ;
2019-08-03 16:23:12 +00:00
std : : string green = ( ( settings - > colorless ) ? " " : " \033 [32m " ) ,
red = ( ( settings - > colorless ) ? " " : " \033 [31m " ) ,
2019-08-31 18:35:11 +00:00
orange = ( ( settings - > colorless ) ? " " : " \033 [33m " ) ;
2019-07-07 16:30:37 +00:00
if ( redirectLink = = " " & & settings - > modus = = Modus : : DEFAULT_MODUS ) {
2019-07-08 18:17:11 +00:00
if ( allLinks = = " " ) {
std : : cout < < " => " < < red < < " KEINEN Hoster für die Folge " < < folgenID < < " gefunden. " < < " \033 [0m " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePath , std : : string ( " KEINEN Hoster für die Folge " ) + folgenID + std : : string ( " gefunden. " ) ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
2019-07-08 18:17:11 +00:00
return 130 ;
2019-10-08 18:03:15 +00:00
}
} else {
2019-07-08 18:17:11 +00:00
std : : cout < < " => " < < orange < < " Keinen PASSENDEN Hoster für die Folge " < < folgenID < < " gefunden. " < < " \033 [0m " < < std : : endl
< < " Alle Links: " < < std : : endl
2019-08-11 17:44:37 +00:00
< < 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 ;
2019-10-08 18:03:15 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePath , std : : string ( " Keinen PASSENDEN Hoster für die Folge " ) + folgenID + std : : string ( " gefunden. " ) ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
2019-07-08 18:17:11 +00:00
return 138 ;
2019-10-08 18:03:15 +00:00
}
2019-07-08 18:17:11 +00:00
}
2019-10-08 18:03:15 +00:00
//Remove this return ??
2019-07-06 18:47:29 +00:00
return 0 ;
}
2019-07-07 16:30:37 +00:00
for ( int i = 1 ; i < = 3 ; + + i ) {
2019-07-06 18:47:29 +00:00
std : : string newUrl = pageManager . getUrlAfterRedirect ( " https://s.to " + redirectLink ) ;
if ( newUrl = = " -1 " ) {
2019-10-08 18:03:15 +00:00
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getUrlAfterRedirect f() failed. " < < std : : endl ;
2019-07-06 18:47:29 +00:00
return 102 ;
} else if ( newUrl . find ( " /s.to/redirect/ " ) ! = std : : string : : npos ) {
2019-07-08 18:17:11 +00:00
if ( settings - > debugMode )
2019-08-11 14:52:23 +00:00
std : : cout < < " Warnung: Redirect Link nach umwandlung (Capcha?) --> Neuer Account " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( pageManager . login ( accountManager - > getNextAccount ( ) ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : login f() failed. " < < std : : endl ;
2019-07-06 18:47:29 +00:00
return - 1 ;
2019-10-08 18:03:15 +00:00
}
2019-07-06 18:47:29 +00:00
continue ;
2019-08-11 14:52:23 +00:00
} else {
2019-08-11 17:15:33 +00:00
std : : cout < < " => " < < folgenID < < ( ( folgenID = = " " ) ? " " : " : " ) < < green < < newUrl < < " \033 [0m " < < std : : endl ;
2019-07-07 16:30:37 +00:00
if ( settings - > outputFilePath ! = " " )
2019-10-08 18:03:15 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePath , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + newUrl ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
2019-07-07 16:30:37 +00:00
return 108 ;
2019-10-08 18:03:15 +00:00
}
2019-07-06 18:47:29 +00:00
return 0 ;
}
}
2019-08-11 17:15:33 +00:00
std : : cout < < " => " < < folgenID < < ( ( folgenID = = " " ) ? " " : " : " ) < < red < < " https://s.to " < < redirectLink < < " \033 [0m " < < std : : endl ;
2019-10-08 18:03:15 +00:00
if ( settings - > outputFilePath ! = " " ) {
if ( pageManager . writeToFile ( settings - > outputFilePath , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + redirectLink ) ! = 0 ) {
if ( settings - > debugMode )
2019-10-08 18:10:12 +00:00
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
2019-07-07 16:30:37 +00:00
return 114 ;
2019-10-08 18:03:15 +00:00
}
}
2019-07-06 18:47:29 +00:00
return 0 ;
}