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 . setDebugMode ( settings - > debugMode ) ;
2019-10-31 14:09:09 +00:00
pageManager . setProxy ( settings - > proxy_ip , settings - > proxy_port ) ;
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-10-27 09:55:53 +00:00
case Modus : : REMOVE_SETTINGS_AND_CACHE_MODUS :
return cleanUpSettingsAndCache ( settings ) ;
2019-09-20 19:47:02 +00:00
default :
2019-10-27 09:55:53 +00:00
std : : cout < < " => Error: Keine Unteroption ausgewählt. " < < std : : endl ;
2019-09-20 19:47:02 +00:00
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 ) ;
2019-12-16 16:41:07 +00:00
std : : string Link = myThreadData - > pageManager - > chooseHosterLink ( allLinks , myThreadData - > settings - > genaueHoster , myThreadData - > settings - > languages , myThreadData - > settings - > debugMode ) ;
2019-08-15 12:20:06 +00:00
2019-08-17 14:06:33 +00:00
if ( myThreadData - > settings - > debugMode )
2020-05-30 11:21:48 +00:00
std : : cout < < " > Thread " < < myThreadData - > id < < allLinks < < std : : endl < < ( ( Link = = " " ) ? " " : " -> Link: 'https://serienstream.sx " ) < < 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 " ) ,
2019-12-18 14:34:06 +00:00
blue = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [34m " ) ,
clearColor = ( ( myThreadData - > settings - > colorless ) ? " " : " \033 [0m " ) ;
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 = = " " ) {
2020-02-23 14:38:31 +00:00
myThreadData - > returnValue = " => " + red + " KEINEN Hoster für die Folge " + replace ( folgenID , " E " , " E " ) + " gefunden. " + clearColor ;
2020-02-22 22:06:04 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePaths , std : : string ( " KEINEN Hoster für die Folge " )
2020-02-23 14:38:31 +00:00
+ replace ( folgenID , " E " , " E " ) + std : : string ( " gefunden. " ) ) ! = 0 ) {
2019-10-08 18:03:15 +00:00
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 {
2020-02-23 14:38:31 +00:00
myThreadData - > returnValue = " => " + orange + " Keinen PASSENDEN Hoster für die Folge " + replace ( folgenID , " E " , " E " ) + " gefunden. " + clearColor + " \n "
2019-08-15 12:20:06 +00:00
+ " Alle Links: " + " \n "
2020-02-23 14:38:31 +00:00
+ replace (
replace ( 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 \" " ) ;
2020-02-22 14:26:24 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePaths ,
2020-02-23 14:38:31 +00:00
std : : string ( " Keinen PASSENDEN Hoster für die Folge " ) + replace ( folgenID , " E " , " E " )
2020-02-22 22:06:04 +00:00
+ std : : string ( " gefunden. " ) ) ! = 0 ) {
2019-10-08 18:03:15 +00:00
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 ) {
2020-05-30 11:21:48 +00:00
std : : string newUrl = myThreadData - > pageManager - > getUrlAfterRedirect ( " https://serienstream.sx " + 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
2020-05-30 11:21:48 +00:00
} else if ( newUrl . find ( " /serienstream.sx/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 {
2020-04-06 12:31:34 +00:00
if ( ( newUrl = myThreadData - > pageManager - > getLinkAfterHosterBasedOperation ( newUrl ) ) = = " " ) {
if ( myThreadData - > settings - > debugMode )
std : : cout < < " => Error in getLinkAfterHosterBasedOperation() -> exit threadFunction() " < < std : : endl ;
return myThreadData - > setState ( 22 ) ;
}
2020-04-04 13:52:29 +00:00
2019-12-18 14:34:06 +00:00
myThreadData - > returnValue = " => " + folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + green + newUrl + clearColor ;
2020-02-22 14:26:24 +00:00
if ( myThreadData - > settings - > outputFilePaths . size ( ) ! = 0 ) {
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePaths , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + newUrl ) ! = 0 ) {
2019-10-08 18:03:15 +00:00
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
2020-02-22 22:06:04 +00:00
//error at 3 time
2020-05-30 11:21:48 +00:00
myThreadData - > returnValue = " => " + replace ( folgenID , " E " , " E " ) + ( ( folgenID = = " " ) ? " " : " : " ) + red + " https://serienstream.sx " + Link + clearColor ;
2020-02-22 14:26:24 +00:00
if ( myThreadData - > settings - > outputFilePaths . size ( ) ! = 0 )
2020-02-23 14:38:31 +00:00
if ( myThreadData - > pageManager - > writeToFile ( myThreadData - > settings - > outputFilePaths , replace ( folgenID , " E " , " E " ) + ( ( folgenID = = " " ) ? " " : " : " ) + Link ) ! = 0 ) {
2019-10-08 18:03:15 +00:00
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-31 13:28:30 +00:00
std : : string finds ;
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...
2019-10-27 20:34:03 +00:00
} else if ( 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 ;
2020-06-05 11:28:53 +00:00
return - 10101 ;
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 " ) ;
2019-10-31 13:28:30 +00:00
std : : string line ;
2019-10-10 15:39:57 +00:00
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 ;
}
2019-10-31 13:16:27 +00:00
std : : cout < < i < < " : " < < line . substr ( line . find_last_of ( " | " ) + 1 ) < < ( ( line [ 0 ] ! = ' | ' ) ? " ( " + line . substr ( 0 , line . find ( " | " ) ) + " ) " : " " ) < < std : : endl ;
2019-10-10 15:39:57 +00:00
}
//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 ;
2021-01-12 17:17:23 +00:00
return - 10101 ;
2019-10-10 15:39:57 +00:00
}
//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
2019-10-27 20:34:03 +00:00
if ( ( finds = line . substr ( line . find ( " |/ " ) + 2 , // beginn: nach dem |/
line . find ( " | " , line . find ( " |/ " ) + 2 ) // Bis zu dem | ab dem ende von |/
- line . find ( " |/ " ) - 2 ) ) = = " " ) { // wegen nicht bi sondern länge, suptrahiere Pos 1
2019-10-10 15:39:57 +00:00
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 {
//Frag den User ob das die Richtige Serie ist:
2019-10-31 13:28:30 +00:00
std : : cout < < " -> Ist das deine gewünschte Serie: ' "
< < finds . substr ( finds . find_last_of ( " | " ) + 1 ) < < " ' " < < ( ( finds [ 0 ] ! = ' | ' ) ? " ( " + finds . substr ( 0 , finds . find ( " | " ) ) + " ) " : " " ) < < std : : endl
2019-10-10 15:39:57 +00:00
< < " Drücke nur [Enter] um fortzufahren: " < < std : : flush ;
2019-10-31 13:28:30 +00:00
std : : string line ;
2019-10-10 15:39:57 +00:00
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 ;
2021-01-12 17:17:23 +00:00
return - 10101 ;
2019-10-10 15:39:57 +00:00
}
2019-10-31 13:28:30 +00:00
//Überschreibe eine Zeile mit nur dem url Namen
if ( ( finds = finds . substr ( finds . find ( " |/ " ) + 2 , finds . find ( " | " , finds . find ( " |/ " ) + 2 ) - finds . find ( " |/ " ) - 2 ) ) = = " " ) {
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 ;
}
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
2021-02-28 13:59:33 +00:00
//<>/newName = pageManager.checkName(finds);
2019-10-31 14:25:45 +00:00
if ( newName = = " -2 " )
return 23 ;
else if ( newName = = " -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-11-11 18:01:15 +00:00
int ProgramManager : : checkLastUpdate ( Settings * settings , ssize_t * days = nullptr )
2019-10-04 18:11:01 +00:00
{
2019-11-11 18:01:15 +00:00
//Wenn die Funktion deaktiviert ist brich ab, wenn nicht nur diffdays verlangt wird
if ( settings - > updateWarningDays = = 0 & & ! days ) {
2019-10-08 18:03:15 +00:00
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 ) {
2019-11-11 18:01:15 +00:00
//Gib nachricht nicht aus wenn nur diffday verlangt wird
if ( ! days ) {
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [93m " ) < < " => Warnung: SerienListe wurde zuletzt vor " < < difDays < < " Tagen aktualisiert. "
2019-12-18 14:34:06 +00:00
< < std : : endl < < " Mit ' " < < settings - > programName < < " search -u' kannst du die Liste aktualisieren. " < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
2019-11-11 18:01:15 +00:00
}
2019-10-04 18:11:01 +00:00
}
2019-11-11 18:01:15 +00:00
//Wenn keine Ausgabe, sondern nur Tage gespeichgtert werden sollen(days != nullptr), speicher diffdays darin
if ( days )
* days = difDays ;
2019-10-04 18:11:01 +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__ < < " : 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 ! = " " ) {
2021-01-12 19:41:58 +00:00
if ( settings - > default_checkPath . find ( settings - > pathSymbol ) = = std : : string : : npos & & settings - > default_checkPath . find ( settings - > wrongPathSymbol ) ! = std : : string : : npos ) {
char t = settings - > wrongPathSymbol ;
settings - > wrongPathSymbol = settings - > pathSymbol ;
settings - > pathSymbol = t ;
}
2019-08-21 14:59:22 +00:00
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 ) ) ;
2021-01-12 19:41:58 +00:00
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 = = " " ) {
2020-06-05 11:28:53 +00:00
std : : cout < < " => 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 ;
2020-06-05 11:28:53 +00:00
return 0 ;
2019-08-11 14:52:23 +00:00
}
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 ;
2020-06-05 11:28:53 +00:00
return 0 ;
2019-08-11 17:44:37 +00:00
}
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-12-22 20:39:48 +00:00
if ( listDir ( dirFiles , settings - > default_checkPath , settings - > default_maxDirs , settings - > debugMode ) ! = 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__ < < " : 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
2021-02-28 13:59:33 +00:00
2019-08-11 14:52:23 +00:00
//Führe Function aus, die überprüft ob die serie existiert
2021-02-28 13:59:33 +00:00
std : : string nameInUrl = pageManager . checkName ( settings - > pages , settings - > name ) ;
2019-10-31 14:25:45 +00:00
if ( nameInUrl = = " -2 " )
return 67 ;
else 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.
2020-06-05 11:28:53 +00:00
int res = 0 ;
if ( ( res = sucheNach_1_Serien ( settings , pageManager , nameInUrl ) ) ! = 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__ < < " : sucheNach_1_Serien failed or found more options. " < < std : : endl ;
2020-06-05 11:28:53 +00:00
return ( res = = - 10101 ) ? 0 : 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 ) {
2020-05-30 11:21:48 +00:00
// melde bei serienstream.sx an und speicher cookies.
2019-08-16 11:32:13 +00:00
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
2020-02-22 14:26:24 +00:00
if ( settings - > outputFilePaths . size ( ) ! = 0 & & ! fileExists ( settings - > default_checkPath ) )
if ( pageManager . writeToFile ( settings - > outputFilePaths , " Name: " + settings - > name ) ! = 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__ < < " : 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 ) ;
2020-02-17 19:17:19 +00:00
if ( tmp_reply . html = = " -1 " | | tmp_reply . html = = " " ) {
std : : cerr < < " => Error: Konnte Seitenquelltext nicht herunterladen. " < < 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
}
2020-07-22 17:40:53 +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 ! = " " ) {
2020-02-23 14:38:31 +00:00
if ( dirFiles . find ( replace ( replace ( settings - > default_Searchmuster , " %Staffel% " , ( ( staffel < 10 ) ? " 0 " : " " ) + std : : to_string ( staffel ) ) ,
2019-08-03 19:48:27 +00:00
" %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 ) ;
2020-06-05 13:30:20 +00:00
if ( settings - > genaueHoster = = " *, " & & settings - > colorless ) {
2020-06-26 11:02:04 +00:00
std : : cout < < settings - > colorless < < " == colorlessvar " < < std : : endl ;
2019-10-04 19:29:37 +00:00
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 {
2019-12-16 16:41:07 +00:00
std : : string Link = pageManager . chooseHosterLink ( allLinks , settings - > genaueHoster , settings - > languages , settings - > debugMode ) ;
2019-10-04 19:29:37 +00:00
if ( settings - > debugMode )
2020-05-30 11:21:48 +00:00
std : : cout < < allLinks < < std : : endl < < ( ( Link = = " " ) ? " " : " -> Link: 'https://serienstream.sx " ) < < 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 = = " " ) {
2020-06-05 11:28:53 +00:00
std : : cout < < " => 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 ;
2020-06-05 11:28:53 +00:00
return 0 ;
2019-07-08 18:17:11 +00:00
}
2020-02-23 14:38:31 +00:00
std : : istringstream iStrStream ( replace ( settings - > name , " , " , " \n " ) + " \n " ) ;
2019-07-06 18:47:29 +00:00
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
2020-06-05 13:30:20 +00:00
} else if ( convertLink ( line . erase ( 0 , line . find ( " /redirect/ " ) ) , & accountManager , settings ) ! = 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__ < < " : 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
{
2019-11-11 18:01:15 +00:00
if ( settings - > showLastUpdate ) {
ssize_t dayddiff ;
if ( checkLastUpdate ( settings , & dayddiff ) ! = 0 ) {
std : : cout < < " => Error: CheckLasUpdate-Funktion gab einen Error zurück. " < < std : : endl ;
return - 1 ;
} else
std : : cout < < " => Letzte Aktualisierung: Vor " < < dayddiff < < " Tagen. " < < std : : endl ;
if ( ! settings - > search_wantUpdate & & settings - > name = = " " ) {
if ( settings - > debugMode )
std : : cout < < " >>> Debug: Verlasse Funktion searchModus: Nur -l " < < std : : endl ;
return 0 ;
}
} if ( settings - > search_wantUpdate ) {
2019-08-03 16:23:12 +00:00
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 = = " " ) {
2020-06-05 11:28:53 +00:00
std : : cout < < " => 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 ;
2020-08-19 19:51:41 +00:00
return 0 ;
} else if ( settings - > name . find ( ' | ' ) ! = std : : string : : npos ) {
std : : cout < < " => Error: Fehlerhaftes Zeichen \" | \" im Namen! " < < std : : endl ;
2020-06-05 11:28:53 +00:00
return 0 ;
2019-08-03 16:23:12 +00:00
}
2021-02-28 13:59:33 +00:00
//Check for last Update.. (glaub hier nocghmal die funktion, um datei zu erstellen, auch wenn ausgabe deaktiviert is, kann aber auch sein dass der teil ghier weg gehört)
if ( checkLastUpdate ( settings ) ! = 0 ) {
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : checkLastUpdate function failed. " < < std : : endl ;
return - 1 ;
}
2019-08-03 16:23:12 +00:00
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
2019-08-03 16:23:12 +00:00
//Save file in string:
2021-02-28 13:59:33 +00:00
std : : string serienListe = std : : string ( ( std : : istreambuf_iterator < char > ( ifs ) ) , std : : istreambuf_iterator < char > ( ) ) ;
2019-08-03 16:23:12 +00:00
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 ;
2021-02-28 13:59:33 +00:00
std : : string lastPageUrl ;
2019-08-03 16:23:12 +00:00
while ( getline ( strstream , line ) ) {
2021-02-28 13:59:33 +00:00
//splitting
///Nadia The Secret, Fushigi no Nadia|/nadia-zauberstein|Nadia und Zauberstein|seriento
// into Vector
std : : vector < std : : string > parts ;
std : : istringstream f ( line + " | " ) ;
std : : string p ;
while ( getline ( f , p , ' | ' ) . good ( ) )
parts . push_back ( p ) ;
if ( parts . size ( ) ! = 4 ) {
std : : cout < < " => Error: Invalid SerienListeEintrag: ' " < < line < < " ' " < < parts . size ( ) < < std : : endl ;
continue ;
}
if ( lastPageUrl ! = parts . at ( 3 ) ) {
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [93m " ) < < " Auf ' " < < parts . at ( 3 ) < < " '... " < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
lastPageUrl = parts . at ( 3 ) ;
}
std : : cout < < " > " < < parts . at ( 2 ) < < " \t [ " < < parts . at ( 1 ) . erase ( 0 , 1 ) < < " ] "
< < ( ( line [ 0 ] = = ' | ' ) ? " " : " \t ( " + parts . at ( 0 ) + " ) " ) < < std : : endl ;
///That Time I Got Reincarnated as a Slime|/tensei-shitara-slime-datta-ken|Tensei Shitara Slime Datta Ken|ANIME
} /// > Tensei Shitara Slime Datta Ken [tensei-shitara-slime-datta-ken] ( That Time I Got Reincarnated as a Slime ) <s.to>
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 = = " " ) {
2020-06-05 11:28:53 +00:00
std : : cout < < " => 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 ;
2020-06-05 11:28:53 +00:00
return 0 ;
2019-08-13 16:59:01 +00:00
}
//Führe Function aus, die überprüft ob die serie existiert
2021-02-28 13:59:33 +00:00
std : : string nameInUrl ; //<>/ = pageManager.checkName(settings->name);
2019-10-31 14:25:45 +00:00
if ( nameInUrl = = " -2 " )
return 145 ;
else if ( nameInUrl = = " -1 " ) {
2019-08-13 16:59:01 +00:00
//Wenn nicht, dann fühe noch eine Suche nach ähnlichen durch.
2020-06-05 11:28:53 +00:00
int res = 0 ;
if ( ( res = sucheNach_1_Serien ( settings , pageManager , nameInUrl ) ) ! = 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__ < < " : sucheNach_1_Serien function failed. " < < std : : endl ;
2020-06-05 11:28:53 +00:00
return ( res = - 10101 ) ? 0 : 28 ;
2019-10-08 18:03:15 +00:00
}
2019-08-13 16:59:01 +00:00
}
2019-11-23 21:06:57 +00:00
//write Name to file
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " \n \n Serie: " + settings - > name + " ( " + nameInUrl + " ) " ) ! = 0 )
2019-11-23 21:06:57 +00:00
{
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 100 ;
}
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
2019-10-30 15:32:30 +00:00
std : : string green = ( ( settings - > colorless ) ? " " : " \033 [92m " ) ,
lila = ( ( settings - > colorless ) ? " " : " \033 [95m " ) ,
Lightyellow = ( ( settings - > colorless ) ? " " : " \033 [93m " ) ,
Darkyellow = ( ( settings - > colorless ) ? " " : " \033 [33m " ) ,
blue = ( ( settings - > colorless ) ? " " : " \033 [96m " ) ,
2019-12-18 14:34:06 +00:00
white = ( ( settings - > colorless ) ? " " : " \033 [0m " ) ;
2019-10-30 13:54:23 +00:00
2019-08-13 16:59:01 +00:00
2019-10-31 12:15:54 +00:00
if ( ! settings - > skipEpisodenNameOutput ) {
2019-09-01 18:21:06 +00:00
2019-10-31 12:15:54 +00:00
//Für FolgenNummer ingesmammt
int gesammtFolge = 0 ;
//speicher (zahl -1), ab da wo /staffel-x nicht mehr vorkommt
int maxStaffel = pageManager . counterContains ( tmp_reply . html , " /staffel-%i " ) ;
2019-09-01 18:21:06 +00:00
2019-10-31 12:15:54 +00:00
//Um namen der Folge für jede Staffel zu bekommen
for ( int staffel = 1 ; staffel < = maxStaffel ; + + staffel ) {
Reply tmpReply = pageManager . getServerRequest ( pageManager . UrlPraefix + nameInUrl + " /staffel- " + std : : to_string ( staffel ) ) ;
if ( tmpReply . html = = " -1 " ) {
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed: at season page. " < < std : : endl ;
return 40 ;
}
2019-10-30 15:32:30 +00:00
2019-11-23 21:06:57 +00:00
int folgen = pageManager . counterContains ( tmpReply . html , " /episode-%i " ) ;
2019-10-31 12:15:54 +00:00
std : : cout < < std : : endl
2019-11-23 21:06:57 +00:00
< < green < < " Die Staffel " < < staffel < < " hat " < < folgen < < " Folge " < < ( ( folgen > 1 ) ? " n " : " " ) < < " . " < < white < < std : : endl
2019-10-31 12:15:54 +00:00
< < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " \n Die Staffel " + std : : to_string ( staffel )
2019-11-23 21:06:57 +00:00
+ " hat " + std : : to_string ( folgen ) + " Folge " + ( ( folgen > 1 ) ? " n " : " " ) + " . \n " ) ! = 0 )
{
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 110 ;
}
2019-09-01 18:21:06 +00:00
2019-10-31 12:15:54 +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 ;
2019-09-01 18:21:06 +00:00
} else
2019-10-31 12:15:54 +00:00
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 ;
2019-09-01 18:21:06 +00:00
} else
2019-10-31 12:15:54 +00:00
html . erase ( pos , std : : string : : npos ) ;
2020-02-23 14:38:31 +00:00
html = replace ( html , " \n " , " " ) ;
html = replace ( html , " </tr> " , " \n " ) ;
2019-10-31 12:15:54 +00:00
std : : stringstream folgenListe ( html ) ;
std : : string line ;
while ( std : : getline ( folgenListe , line ) . good ( ) ) {
std : : string titel ;
gesammtFolge = gesammtFolge + 1 ;
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 + 9 ) ;
if ( ( pos = line . find ( " </a> " ) ) = = std : : string : : npos ) {
std : : cout < < " => Error: Konnte Position von ' </a>' nicht finden. " < < std : : endl ;
return 44 ;
}
std : : cout < < lila < < " Ep. " < < blue < < ( ( gesammtFolge < 100 ) ? ( ( gesammtFolge < 10 ) ? " 00 " : " 0 " ) : " " ) < < gesammtFolge < < lila
< < " ( " < < blue < < " S " < < ( ( staffel < 10 ) ? " 0 " : " " ) < < staffel
< < " E " < < ( ( atoi ( line . substr ( 0 , pos ) . c_str ( ) ) < 10 ) ? " 0 " : " " ) < < line . substr ( 0 , pos ) < < lila < < " ): " < < white < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " Ep. " + std : : string ( ( gesammtFolge < 100 ) ? ( ( gesammtFolge < 10 ) ? " 00 " : " 0 " ) : " " )
2019-11-23 21:06:57 +00:00
+ std : : to_string ( gesammtFolge ) + " ( S " + ( ( staffel < 10 ) ? " 0 " : " " ) + std : : to_string ( staffel ) + " E "
+ ( ( atoi ( line . substr ( 0 , pos ) . c_str ( ) ) < 10 ) ? " 0 " : " " ) + line . substr ( 0 , pos ) + " ): " ) ! = 0 ) {
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 105 ;
}
2019-10-31 12:15:54 +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 ) ;
2019-11-23 21:06:57 +00:00
if ( titel ! = " " ) {
2019-10-31 12:15:54 +00:00
std : : cout < < lila < < " > Titel 1: " < < Lightyellow < < titel < < white < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " > Titel 1: " + titel ) ! = 0 ) {
2019-11-23 21:06:57 +00:00
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 110 ;
}
}
2019-10-31 12:15:54 +00:00
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 ) ;
2019-11-23 21:06:57 +00:00
if ( titel ! = " " ) {
2019-10-31 12:15:54 +00:00
std : : cout < < lila < < " > Titel 2: " < < Darkyellow < < titel < < white < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " > Titel 2: " + titel ) ! = 0 ) {
2019-11-23 21:06:57 +00:00
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 120 ;
}
}
2019-09-01 18:21:06 +00:00
}
}
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 ;
}
2020-02-23 14:38:31 +00:00
std : : string description = replace ( replace ( tmp_reply . html . substr ( pos + 23 , pos2 - pos - 23 ) , " \n " , " " ) , " <br /> " , " " ) ;
2019-10-30 13:54:23 +00:00
//remove bug text:
2020-02-23 14:38:31 +00:00
description = replace ( description , " &quot; " , " \" " ) ; //
2019-10-30 13:54:23 +00:00
2020-02-23 14:38:31 +00:00
description = replace ( description , " & " , " & " ) ; //
description = replace ( description , " < " , " < " ) ; //
description = replace ( description , " > " , " > " ) ; //
2019-10-30 13:54:23 +00:00
2020-02-23 14:38:31 +00:00
description = replace ( description , " <br /> " , " " ) ; //
description = replace ( description , " " " , " \" " ) ; //
description = replace ( description , " ' " , " ' " ) ; //
2019-10-30 13:54:23 +00:00
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 ) ;
2019-11-23 21:06:57 +00:00
//Ausgabe
std : : cout < < lila < < " \n Produktion von " < < blue < < startStopDates [ 0 ] < < lila < < " bis " < < blue < < startStopDates [ 1 ] < < lila < < std : : endl
2019-10-30 15:32:30 +00:00
< < " FSK: " < < blue < < fsk < < lila < < std : : endl
< < " Cover Bild: " < < green < < coverLink < < lila < < std : : endl
< < " Genre(s): " < < blue < < std : : flush ;
2019-08-13 16:59:01 +00:00
for ( const auto & e : genres )
std : : cout < < e < < " " ;
2019-10-30 15:32:30 +00:00
std : : cout < < lila < < std : : endl < < " \n Beschreibung: " < < green < < description < < white < < std : : endl ;
2019-08-13 16:59:01 +00:00
2019-11-23 21:06:57 +00:00
//Schreibe das auch in ein Text file:
std : : string all_genres ;
for ( const auto & e : genres )
all_genres + = e + " " ;
2020-02-22 14:26:24 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , " \n Produktion von " + startStopDates [ 0 ] + " bis " + startStopDates [ 1 ] + " \n "
2019-11-23 21:06:57 +00:00
" FSK: " + fsk + " \n " + " Cover Bild: " + coverLink + " \n " + " Genre(s): " + all_genres + " \n "
" \n Beschreibung: " + description + " \n " ) ! = 0 )
{
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 130 ;
}
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 ;
2020-05-30 11:21:48 +00:00
std : : string html = pageManager . getServerRequest ( " https://serienstream.sx/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 ) ;
2020-02-23 14:38:31 +00:00
html = replace ( html , " \n " , " " ) ;
html = replace ( html , " class= \" row \" " , " \n " ) ;
2019-09-20 19:47:02 +00:00
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 ;
}
2020-02-23 14:38:31 +00:00
std : : string id = replace ( line . substr ( pos + 7 , pos2 - pos - 7 ) , " " , " " ) ;
2019-09-20 19:47:02 +00:00
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 )
{
2020-08-19 20:10:28 +00:00
if ( settings - > VersionFileName = = " " | | settings - > ProgrammFileName = = " " ) {
2019-11-04 17:02:42 +00:00
std : : cout < < " => Error: Kein Download Link verfügbar! " < < std : : endl ;
return 4 ;
}
2019-10-14 15:59:59 +00:00
std : : cout < < " => INFO: Suche nach der neusten Version... " < < std : : endl ;
2020-08-19 20:10:28 +00:00
std : : string html = pageManager . getServerRequest ( UpdaterCloudUrlWithPath + settings - > VersionFileName ) . html ;
if ( html = = " -1 " | | html = = " " | | html . find ( " \n " ) = = std : : string : : npos ) {
std : : cerr < < ( " => Warnung: Verwende 2t-Link für Download! " ) < < std : : endl ;
html = pageManager . getServerRequest ( SecondUpdaterCloudUrlWithPath + settings - > VersionFileName ) . 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 {
2020-02-23 14:38:31 +00:00
html = replace ( html , " \r " , " " ) ;
2019-10-13 12:28:53 +00:00
}
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-11-11 18:36:59 +00:00
//Überprüfe onb neue Version einen . enthält
if ( neusteVersion . find ( " . " ) = = std : : string : : npos ) {
size_t pos ;
if ( ( pos = html . find ( " h1> " ) ) ! = std : : string : : npos )
2019-11-11 18:43:06 +00:00
std : : cout < < " => Das herunterladen ist fehlgeschlagen: ' " < < html . substr ( pos + 3 , html . find ( " </h1> " ) - pos - 3 ) < < " '. " < < std : : endl ;
2019-11-11 18:36:59 +00:00
else
std : : cout < < " => Error: Die neuste Version ist ungültig: ' " < < neusteVersion < < " '. " < < std : : endl ;
return - 3 ;
}
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
2021-01-12 17:42:29 +00:00
std : : cout < < " \n => Infos (zur Version): " < < std : : endl ;
2019-10-14 16:34:14 +00:00
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 ! = " " )
2021-01-12 17:42:29 +00:00
std : : cout < < ( ( settings - > colorless ) ? ( " " ) : " \033 [92m > " ) < < line < < ( ( settings - > colorless ) ? ( " " ) : " \033 [0m " ) < < 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
2021-01-12 17:42:29 +00:00
std : : cout < < " \n => INFO: Bereinige Downloadpfad, falls alte Dateien vorhanden sind... " < < std : : endl ;
2019-10-15 17:32:27 +00:00
if ( fileExists ( downloadedFilePath ) ) {
2021-01-12 18:01:23 +00:00
if ( remove ( downloadedFilePath . c_str ( ) ) ! = 0 | | fileExists ( downloadedFilePath ) ) {
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
2020-08-19 20:10:28 +00:00
if ( pageManager . downLoadToFile ( downloadedFilePath , UpdaterCloudUrlWithPath + settings - > ProgrammFileName ) ! = 0 ) {
std : : cerr < < ( " => Warnung: Verwende 2t-Link für Download! " ) < < std : : endl ;
if ( pageManager . downLoadToFile ( downloadedFilePath , SecondUpdaterCloudUrlWithPath + settings - > ProgrammFileName ) ! = 0 ) {
std : : cout < < " \n => Error: Das herunterladen der neuen Version ist fehlgeschlagen. " < < std : : endl ;
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
2019-10-14 16:34:14 +00:00
//Führe neue Version aus und überprüfe rückgabewert
2021-02-19 12:45:51 +00:00
std : : cout < < " => INFO: Überprüfe die Funktionalität der neuen Version( " < < downloadedFilePath < < " )... \n " < < std : : endl ;
2019-10-13 12:28:53 +00:00
if ( system ( ( downloadedFilePath + " --version " ) . c_str ( ) ) ! = 0 ) {
2019-11-04 16:36:25 +00:00
std : : cerr < < ( " => Error: Ausführen der neuen Version ist fehlgeschlagen " ) < < std : : endl ;
2019-10-14 16:27:14 +00:00
return 5 ;
2019-10-13 12:28:53 +00:00
}
2021-02-19 12:45:51 +00:00
# endif
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
2021-01-12 17:42:29 +00:00
std : : cout < < " \n => INFO: Lösche alte Nofall Version falls vorhanden... " < < std : : endl ;
2019-10-15 17:32:27 +00:00
if ( fileExists ( oldVersionPah ) ) {
2021-01-12 18:01:23 +00:00
if ( remove ( oldVersionPah . c_str ( ) ) ! = 0 | | fileExists ( oldVersionPah ) ) {
2019-10-15 17:32:27 +00:00
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
2021-01-12 18:01:23 +00:00
std : : cout < < ( ( settings - > colorless ) ? ( " " ) : " \033 [92m " ) < < " => INFO: Verschiebe alte Version für Notfälle zu: ' " < < oldVersionPah < < " '. " < < ( ( settings - > colorless ) ? ( " " ) : " \033 [0m " ) < < 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
2021-01-12 18:01:23 +00:00
if ( fileExists ( exePath ) & & fileExists ( oldVersionPah ) ) {
std : : cout < < ( ( settings - > colorless ) ? ( " \n " ) : " \n \033 [33m " )
< < " !! => WARNUNG: --->Die Aktuelle Version konnte nicht verschoben, sondern nur kopiert werden! ( Z.: Operation Laufwerksübergreifend ? ) \n "
2021-02-19 12:45:51 +00:00
< < " ==> Aktuelle Version umbenennen. (Die Datei kann danach gelöscht werden!) " < < ( ( settings - > colorless ) ? ( " " ) : " \033 [0m " ) < < std : : endl ;
2021-01-12 18:01:23 +00:00
if ( fileExists ( exePath + " _ALT " ) ) {
std : : cout < < ( ( settings - > colorless ) ? ( " " ) : " \033 [33m " ) < < " => WARNUNG: Es existiert bereits eine Datei mit dem Namen "
< < exePath + " _ALT " < < ( ( settings - > colorless ) ? ( " " ) : " \033 [0m " ) < < " \n " < < " Diese Datei loeschen: (Nur Enter um fortzufahren): " < < std : : flush ;
std : : string inp ;
std : : getline ( std : : cin , inp ) ;
std : : cout < < std : : endl ;
if ( inp ! = " " ) {
std : : cout < < " Abbruch... " < < std : : endl ;
return 0 ;
}
if ( remove ( ( exePath + " _ALT " ) . c_str ( ) ) ! = 0 | | fileExists ( exePath + " _ALT " ) ) {
perror ( ( " => Error: Das löschen der Datei ' " + exePath + " _ALT " + " ' ist fehlgeschlagen. " ) . c_str ( ) ) ;
return 1144 ;
}
}
if ( rename ( exePath . c_str ( ) , ( exePath + " _ALT " ) . c_str ( ) ) ! = 0 | | fileExists ( exePath ) ) {
perror ( " => ERROR: Umbennen auch fehlgeschlagen " ) ;
return 2314 ;
} else {
2021-02-19 12:45:51 +00:00
std : : cout < < " -> Umbenennen erfolgreich. Fahre fort... " < < std : : endl ;
2021-01-12 18:01:23 +00:00
}
}
if ( fileExists ( exePath ) ) {
std : : cout < < " => WARNUNG: Aktuelle Version existiert nach dem Verschieben immer noch! " < < std : : endl ;
if ( remove ( exePath . c_str ( ) ) ! = 0 | | fileExists ( exePath ) ) {
perror ( ( " => Error: Das löschen der aktuellen Version ' " + exePath + " ' ist fehlgeschlagen. " ) . c_str ( ) ) ;
return 114 ;
}
}
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 ( ) ) ;
2021-01-12 18:01:23 +00:00
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
}
2021-01-12 18:01:23 +00:00
if ( fileExists ( downloadedFilePath ) ) {
std : : cout < < " => WARNUNG: Download-Datei existiert nach dem Verschieben immer noch! Ist diese Operation vielleicht Laufwerksübergreifend? ( Falls ja, starten sie "
< < settings - > programName < < " ggf. von ihrem C: \\ -Laufwerk. " < < std : : endl ;
if ( remove ( downloadedFilePath . c_str ( ) ) ! = 0 | | fileExists ( downloadedFilePath ) ) {
perror ( ( " => Error: Das löschen der Downloaddatei ' " + downloadedFilePath + " ' ist fehlgeschlagen. " ) . c_str ( ) ) ;
return 118 ;
}
}
2021-01-12 17:42:29 +00:00
std : : cout < < ( ( settings - > colorless ) ? ( " " ) : " \033 [92m " ) < < " \n => Update Erfolgreich ausgeführt: ' " < < settings - > version < <
" ' -> ' " < < neusteVersion < < " ' " < < ( ( settings - > colorless ) ? ( " " ) : " \033 [0m " ) < < std : : endl ;
2019-10-13 12:28:53 +00:00
2019-09-20 19:47:02 +00:00
return 0 ;
}
2019-10-26 14:18:47 +00:00
int ProgramManager : : cleanUpSettingsAndCache ( Settings * settings )
{
2019-10-27 09:55:53 +00:00
//Alle Groß
settings - > name = pageManager . upper_string ( settings - > name ) ;
//setting dir
if ( settings - > name = = " SETTINGS " | | settings - > name = = " ALL " ) {
if ( ! removeDirIsOk ( settings - > configDir , settings ) ) {
std : : cout < < " => Error: Das löschen des Settings-Ordners ist fehlgeschlagen. " < < std : : endl ;
return 1 ;
}
2019-10-26 14:18:47 +00:00
}
//Cache Dir
2021-02-19 12:45:51 +00:00
else if ( settings - > name = = " CACHE " | | settings - > name = = " ALL " ) {
2019-10-27 09:55:53 +00:00
if ( ! removeDirIsOk ( settings - > cacheDir , settings ) ) {
std : : cout < < " => Error: Das löschen des Cache-Ordners ist fehlgeschlagen. " < < std : : endl ;
return 2 ;
}
2019-10-26 14:18:47 +00:00
}
2021-02-19 12:45:51 +00:00
else if ( settings - > name ! = " CACHE " & & settings - > name ! = " SETTINGS " & & settings - > name ! = " ALL " )
2019-10-27 09:55:53 +00:00
{
std : : cout < < " => Error: Unbekannte Option ' " < < settings - > name < < " ' für Ordnerauswahl. " < < std : : endl ;
std : : cout < < " Aufruf: " < < settings - > programName < < " --remove [OPTION]... [settings|cache|all] " < < std : : endl ;
std : : cout < < " \" " < < settings - > programName < < " --remove --help \" liefert weitere Informationen. " < < std : : endl ;
return 3 ;
2019-10-26 14:18:47 +00:00
}
return 0 ;
}
2019-09-20 19:47:02 +00:00
2019-08-03 16:23:12 +00:00
int ProgramManager : : searchModus_update ( Settings * settings )
{
2021-02-28 13:59:33 +00:00
std : : string list ;
std : : string line ;
2019-08-03 16:23:12 +00:00
2021-02-28 13:59:33 +00:00
for ( const auto & page : settings - > pages ) {
std : : cout < < " -> Updating ' " < < page . name_id < < " '... " < < std : : endl ;
2019-08-03 16:23:12 +00:00
2021-02-28 13:59:33 +00:00
Reply reply = pageManager . getServerRequest ( " https:// " + page . url + page . urlAlphabetSerienList ) ;
2021-02-19 12:45:51 +00:00
2021-02-28 13:59:33 +00:00
if ( reply . html = = " -1 " ) {
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : getServerRequest function failed. " < < std : : endl ;
return 21 ;
}
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
2021-02-28 13:59:33 +00:00
std : : string serienListe = replace ( pageManager . grep ( reply . html , " data-alternative-title " ) , " </li> " , " \n " ) ;
2019-08-03 16:23:12 +00:00
2021-02-28 13:59:33 +00:00
std : : string tests [ ] = { " \" href= \" " , " <li><a data-alternative-title= \" " , page . UrlDir , " </a> " , } ;
for ( auto t : tests ) {
if ( reply . html . find ( t ) = = std : : string : : npos ) {
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : hatml doesnt contain:' " < < t < < " ' after preparing. " < < std : : endl ;
return 51 ;
}
}
2019-08-03 16:23:12 +00:00
2021-02-28 13:59:33 +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 = 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 = replace ( serienListe , " \" href= \" " , " | " ) ;
//...\n|/serie /stream/2012-das-jahr-null" title="2012 - Das Jahr Null Stream anschauen">2012 - Das Jahr Null</a>\n...
serienListe = replace ( serienListe , " | " + page . UrlDir , " |/ " ) ;
std : : stringstream strstream ( serienListe ) ;
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 = replace ( line , " \" > " , " | " ) ;
//...\n|/serie/ stream/2012-das-jahr-null|2012 - Das Jahr Null</a>\n...
line = replace ( line , " </a> " , " " ) ;
//...\n|/serie/ stream/2012-das-jahr-null"_weg_>2012 - Das Jahr Null|\n...
///Nadia The Secret, Fushigi no Nadia|/nadia-zauberstein|Nadia und Zauberstein|seriento
serienListe + = line + " | " + page . url + " \n " ;
}
if ( serienListe . length ( ) > 0 )
serienListe . pop_back ( ) ;
2019-08-03 16:23:12 +00:00
2021-02-28 13:59:33 +00:00
//Entferne Html Sonderzeichen
serienListe = replace ( serienListe , " &quot; " , " \" " ) ; //
2019-10-30 15:37:35 +00:00
2021-02-28 13:59:33 +00:00
serienListe = replace ( serienListe , " & " , " & " ) ; //
serienListe = replace ( serienListe , " < " , " < " ) ; //
serienListe = replace ( serienListe , " > " , " > " ) ; //
2019-10-30 15:37:35 +00:00
2021-02-28 13:59:33 +00:00
serienListe = replace ( serienListe , " <br /> " , " " ) ; //
serienListe = replace ( serienListe , " " " , " \" " ) ; //
serienListe = replace ( serienListe , " ' " , " ' " ) ; //
2019-10-30 15:37:35 +00:00
2021-02-28 13:59:33 +00:00
list + = serienListe ;
2019-10-30 15:37:35 +00:00
2021-02-28 13:59:33 +00:00
}
2019-10-30 15:37:35 +00:00
2019-08-11 17:15:33 +00:00
//Anzahl der Serien/Zeilen vorher:
ssize_t countBef = 0 ;
2021-02-28 13:59:33 +00:00
std : : ifstream myFileBef ( settings - > serienListPath ) ;
2019-10-04 11:38:59 +00:00
std : : string alteListe ;
if ( myFileBef . is_open ( ) ) {
2021-02-28 13:59:33 +00:00
for ( countBef = 0 ; std : : getline ( myFileBef , line ) ; + + countBef ) {
2019-10-04 11:38:59 +00:00
//Speicher alteListe für verglkeich nach Update
alteListe . append ( line + " \n " ) ;
//Vergeliche neue und alte list => entfernte Serien
2021-02-28 13:59:33 +00:00
if ( line ! = " " & & list . find ( line ) = = std : : string : : npos ) {
std : : string tmp = std : : string ( line ) . erase ( line . find_last_of ( ' | ' ) ) ;
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [91m " ) < < " Entfernt: ' " < < tmp . substr ( tmp . find_last_of ( " | " ) + 1 ) < < " ' " < < ( ( settings - > colorless ) ? " " : " \033 [0m " )
2019-12-18 14:34:06 +00:00
< < std : : endl ;
2019-10-04 11:38:59 +00:00
}
}
myFileBef . close ( ) ;
2019-10-02 20:13:15 +00:00
}
2019-08-11 17:15:33 +00:00
//Schreibe die Liste in das TextFile
2021-02-28 13:59:33 +00:00
std : : ofstream ofs ( settings - > serienListPath , std : : ios : : trunc ) ;
2019-08-03 16:23:12 +00:00
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
2021-02-28 13:59:33 +00:00
ofs < < list < < std : : endl ;
2019-10-04 11:38:59 +00:00
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 ;
2021-02-28 13:59:33 +00:00
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 ) {
2021-02-28 13:59:33 +00:00
std : : string tmp = std : : string ( line ) . erase ( line . find_last_of ( ' | ' ) ) ;
std : : cout < < ( ( settings - > colorless ) ? " " : " \033 [92m " ) < < " Neu: ' " < < tmp . substr ( tmp . find_last_of ( " | " ) + 1 ) < < " ' " < < ( ( settings - > colorless ) ? " " : " \033 [0m " )
2019-12-18 14:34:06 +00:00
< < std : : endl ;
2019-10-04 11:38:59 +00:00
}
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
2021-02-28 13:59:33 +00:00
//Speicher Datum des Updates...
2019-10-04 18:11:01 +00:00
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-12-22 20:39:48 +00:00
int ProgramManager : : listDir ( std : : string & list , std : : string path , int maxDepth , bool debugMode )
2019-08-03 19:48:27 +00:00
{
2019-08-21 14:59:22 +00:00
//Wenn Pfad zu einem TextFile geht
if ( fileExists ( path ) ) {
2019-12-22 20:39:48 +00:00
if ( debugMode )
std : : cout < < " INFO: Überprüfe Textdatei auf bereits gedownloadete Folgen (-C): ' " < < path < < " '. " < < std : : endl ;
2019-08-21 14:59:22 +00:00
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-12-22 20:39:48 +00:00
if ( debugMode )
std : : cout < < " Inhald des TextFiles (-C): \n " < < list < < std : : endl < < std : : endl ;
2019-08-21 14:59:22 +00:00
return 0 ;
} // Sonst normal Ordner listen
2019-12-22 20:39:48 +00:00
else if ( maxDepth < = 0 ) {
if ( debugMode )
std : : cout < < " INFO: Brich Vorgang für ' " < < path < < " ' ab, da max. Anzahl an zu durchsuchende Ordner erreicht wurde. " < < std : : endl ;
2019-08-03 19:48:27 +00:00
return 0 ;
2019-12-22 20:39:48 +00:00
}
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
2019-10-26 14:18:47 +00:00
if ( path [ path . length ( ) - 1 ] ! = ' / ' ) {
if ( path [ path . length ( ) - 1 ] ! = ' \\ ' ) { // Wenn kein \ oder / am ende ist
if ( path . find ( " / " ) = = std : : string : : npos ) { // wenn im namen ein / ist füge am ende / hinzu
if ( path . find ( " \\ " ) = = std : : string : : npos ) { // wenn im name ein \ ist add \ to en or error
std : : cout < < " => Error: Pfad zu dem Ordner enthält kein Pfadsymbol. " < < std : : endl ;
return - 2 ;
} else {
path . push_back ( ' \\ ' ) ;
}
} else {
path . push_back ( ' / ' ) ;
}
}
}
2019-08-03 19:48:27 +00:00
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 ;
}
2019-12-22 20:39:48 +00:00
if ( debugMode )
std : : cout < < " -> Durchsuche Ordner ' " < < path < < " '... " < < std : : endl ;
2019-08-03 19:48:27 +00:00
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
2019-10-27 20:34:03 +00:00
else if ( dirExists ( ( path + dp - > d_name + ( ( path . find ( " / " ) = = std : : string : : npos ) ? " \\ " : " / " ) ) ) ) { //if(dp->d_type == DT_DIR) {
2019-12-22 20:39:48 +00:00
listDir ( list , ( path + dp - > d_name + ( ( path . find ( " / " ) = = std : : string : : npos ) ? " \\ " : " / " ) ) , maxDepth , debugMode ) ;
} else {
2019-08-03 19:48:27 +00:00
list . append ( std : : string ( dp - > d_name ) + " \n " ) ;
2020-02-22 14:26:24 +00:00
if ( debugMode )
std : : cout < < " > " < < dp - > d_name < < std : : endl ;
2019-12-22 20:39:48 +00:00
}
2019-08-03 19:48:27 +00:00
}
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 = = " " ) {
2020-02-23 14:38:31 +00:00
std : : cout < < " => " < < red < < " KEINEN Hoster für die Folge " < < replace ( folgenID , " E " , " E " ) < < " gefunden. " < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
if ( pageManager . writeToFile ( settings - > outputFilePaths , std : : string ( " KEINEN Hoster für die Folge " ) + replace ( folgenID , " E " , " E " ) + std : : string ( " gefunden. " ) ) ! = 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__ < < " : writeToFile f() failed. " < < std : : endl ;
2019-07-08 18:17:11 +00:00
return 130 ;
2019-10-08 18:03:15 +00:00
}
} else {
2020-02-23 14:38:31 +00:00
std : : cout < < " => " < < orange < < " Keinen PASSENDEN Hoster für die Folge " < < replace ( folgenID , " E " , " E " ) < < " gefunden. " < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl
2019-07-08 18:17:11 +00:00
< < " Alle Links: " < < std : : endl
2020-02-23 14:38:31 +00:00
< < replace ( replace ( replace ( allLinks , " data-lang-key= \" 1 \" " , " language= \" GerDub \" " ) ,
2019-08-11 17:44:37 +00:00
" data-lang-key= \" 2 \" " , " language= \" Eng \" " ) , " data-lang-key= \" 3 \" " , " language= \" GerSub \" " ) < < std : : endl ;
2020-02-23 14:38:31 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , std : : string ( " Keinen PASSENDEN Hoster für die Folge " ) + replace ( folgenID , " E " , " E " ) + std : : string ( " gefunden. " ) ) ! = 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__ < < " : 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 ) {
2020-05-30 11:21:48 +00:00
std : : string newUrl = pageManager . getUrlAfterRedirect ( " https://serienstream.sx " + redirectLink ) ;
2019-11-01 19:06:56 +00:00
//wenn function fehl schlug beende das Programm
2019-07-06 18:47:29 +00:00
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 ;
2019-11-01 19:06:56 +00:00
// wenn nach der Umwandlung immern och ein redirect vorhanden ist, also wenn z.B.: account gewechselt werden muss
2020-05-30 11:21:48 +00:00
} else if ( newUrl . find ( " /serienstream.sx/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
2020-05-30 11:21:48 +00:00
//wenn nach der Umwandlung https://serienstream.sx/ vorhanden ist, die ist wenn der Link Ungültig war:
} else if ( newUrl = = " https://serienstream.sx/ " ) {
std : : cout < < " => " < < red < < replace ( folgenID , " E " , " E " ) < < ( ( folgenID = = " " ) ? " " : " : " ) < < " Ungültige Url: 'https://serienstream.sx " < < redirectLink < < " ' "
2019-12-18 14:34:06 +00:00
< < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( settings - > outputFilePaths . size ( ) ! = 0 )
2020-05-30 11:21:48 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , replace ( folgenID , " E " , " E " ) + ( ( folgenID = = " " ) ? " " : " : " ) + " Ungültige Url: https://serienstream.sx " + redirectLink ) ! = 0 ) {
2019-11-01 19:06:56 +00:00
if ( settings - > debugMode )
std : : cerr < < " >>> Debug In " < < __FUNCTION__ < < " : writeToFile f() failed. " < < std : : endl ;
return 108 ;
}
return 0 ;
//sonst war die umwandlung erfolgreich
2019-08-11 14:52:23 +00:00
} else {
2020-04-06 12:31:34 +00:00
if ( ( newUrl = pageManager . getLinkAfterHosterBasedOperation ( newUrl ) ) = = " " ) {
if ( settings - > debugMode )
std : : cout < < " => Error in getLinkAfterHosterBasedOperation() -> exit convertLink() " < < std : : endl ;
return 118 ;
}
2020-04-04 13:52:29 +00:00
2019-12-18 14:34:06 +00:00
std : : cout < < " => " < < folgenID < < ( ( folgenID = = " " ) ? " " : " : " ) < < green < < newUrl < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( settings - > outputFilePaths . size ( ) ! = 0 )
if ( pageManager . writeToFile ( settings - > outputFilePaths , folgenID + ( ( folgenID = = " " ) ? " " : " : " ) + newUrl ) ! = 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__ < < " : 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-11-01 19:06:56 +00:00
//nach 3temn Versuch gib error aus:
2020-05-30 11:21:48 +00:00
std : : cout < < " => " < < replace ( folgenID , " E " , " E " ) < < ( ( folgenID = = " " ) ? " " : " : " ) < < red < < " https://serienstream.sx " < < redirectLink < < ( ( settings - > colorless ) ? " " : " \033 [0m " ) < < std : : endl ;
2020-02-22 14:26:24 +00:00
if ( settings - > outputFilePaths . size ( ) ! = 0 ) {
2020-02-23 14:38:31 +00:00
if ( pageManager . writeToFile ( settings - > outputFilePaths , replace ( folgenID , " E " , " E " ) + ( ( folgenID = = " " ) ? " " : " : " ) + redirectLink ) ! = 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__ < < " : 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 ;
}