["Message" => "Unauthorized", ], 404 => ["Message" => "Not found", ], 422 => ["Message" => "Unprocessable Content", ], 503 => ["Message" => "Connection refused", ], 504 => ["Message" => "Gateway timeout XXX", ], ]; private const HTTP_METHOD_GET = "GET"; private const HTTP_METHOD_POST = "POST"; private ?\CurlHandle $cURL = null; private array $RequestHeader = [ "Content-Type: application/json", ]; public ?string $APIBaseURL = null; public ?string $User = null; public ?string $Password = null; public ?\Generation\Configuration $GenerationConfiguration = null; public function __construct( ?string $APIBaseURL = null, ?string $User = null, ?string $Password = null, ?\Generation\Configuration $GenerationConfiguration = null, ){ foreach(get_defined_vars() as $Property => $Value)if(!is_null($Value))$this->$Property = $Value; $this->cURL = curl_init(); } public function __destruct(){ curl_close($this->cURL); } public function ProcessGenerationTask( string $TaskPath, string $ImagePath, string $TaskID, string $BaseURL, ){ $PendingPath = "{$TaskPath}/" . self::GENERATION_PENDING . "/"; $TaskFile = "{$TaskID}.json"; $Result = (object)[ "Error" => (object)["Code" => 0, "Message" => null, ], "Data" => (object)[], ]; if(file_exists("{$PendingPath}{$TaskFile}")){ $GenerationData = json_decode(file_get_contents("{$PendingPath}{$TaskFile}")); $GenerationData->Task->Status = self::GENERATION_PROCESSING; $ProcessingPath = "{$TaskPath}/" . self::GENERATION_PROCESSING . "/"; if(!is_dir($ProcessingPath))mkdir($ProcessingPath, 0777, true); rename("{$PendingPath}{$TaskFile}", "{$ProcessingPath}{$TaskFile}"); file_put_contents("{$ProcessingPath}{$TaskFile}", json_encode($GenerationData)); $Result = $this->APIRequest( $GenerationData->API->Endpoint, $GenerationData->API->Data, $GenerationData->TimeoutSecond, ); if($Result->Error->Code){ $GenerationData->Task->Status = self::GENERATION_FAILED; } else{ $GenerationData->Task->Status = self::GENERATION_COMPLETE; if($Result->Data->images[0] ?? false){ $ImageFileSubPath = date("Y-m-d"); $ImageFilePath = "{$ImagePath}/{$ImageFileSubPath}"; if(!is_dir($ImageFilePath))mkdir($ImageFilePath, 0755, true); $ImageFileName = UUID() . "-" . date("h-i-s") . ".png"; $ImageFile = "{$ImageFilePath}/{$ImageFileName}"; file_put_contents($ImageFile, base64_decode($Result->Data->images[0])); $Result->Data = (object)[ "Path" => $ImageFile, "URL" => "{$BaseURL}{$ImageFileSubPath}/{$ImageFileName}", ]; } } $FinalStatusPath = "{$TaskPath}/{$GenerationData->Task->Status}/"; if(!is_dir($FinalStatusPath))mkdir($FinalStatusPath, 0777, true); rename("{$ProcessingPath}{$TaskFile}", "{$FinalStatusPath}{$TaskFile}"); file_put_contents("{$FinalStatusPath}{$TaskFile}", json_encode($GenerationData)); } else{ $Result->Error = (object)["Code" => 99999, "Message" => "Task file not found", ]; } return $Resutl; } public function CreateGenerationTask( string $Path, \Generation\Configuration $GenerationConfiguration, ){ $TaskID = "" . date("Y-m-d-H-i-s") . "-" . UUID(); $Result = $GenerationConfiguration->Data(); if(!$Result->Error->Code){ $Result->Data->Task = (object)[ "ID" => $TaskID, "Time" => (object)[ "Create" => date("Y-m-d H:i:s"), ], "Status" => self::GENERATION_PENDING, ]; $PendingPath = "{$Path}/{$Result->Data->Task->Status}/"; if(!is_dir($PendingPath))mkdir($PendingPath, 0777, true); file_put_contents("{$PendingPath}{$TaskID}.json", json_encode($Result->Data)); } return $Result; } public function Generate( ?\Generation\Configuration $GenerationConfiguration = null, ):object{ if(is_null($GenerationConfiguration))$GenerationConfiguration = $this->GenerationConfiguration; $GenerationConfigurationData = $GenerationConfiguration->Data(); $Result = (object)[ "Error" => $GenerationConfigurationData->Error, "Data" => (object)[], ]; if(!$Result->Error->Code)$Result = $this->APIRequest( $GenerationConfigurationData->API->Endpoint, $GenerationConfigurationData->API->Data, $GenerationConfigurationData->TimeoutSecond, ); return $Result; } public function QueStatus():object{ return $this->APIRequest("progress"); } public function Option():object{ return $this->APIRequest("options"); } public function Embedding():object{ return $this->APIRequest("embeddings"); } public function PromptStyle():object{ return $this->APIRequest("prompt-styles"); } public function LoRa():object{ return $this->APIRequest("loras"); } public function Upscaler():object{ return $this->APIRequest("upscalers"); } public function Scheduler():object{ return $this->APIRequest("schedulers"); } public function Sampler():object{ return $this->APIRequest("samplers"); } public function Model():object{ return $this->APIRequest("sd-models"); } private function APIRequest( string $Endpoint, null|string|array|object $POSTData = null, ?int $TimeoutSecond = null, ):object{ if(is_null($TimeoutSecond))$TimeoutSecond = 600; $Error = (object)["Code" => 0, "Message" => null, ]; $Data = (object)[]; $Method = self::HTTP_METHOD_GET; if($POSTData){ $Method = self::HTTP_METHOD_POST; if( is_array($POSTData) || is_object($POSTData) )$POSTData = json_encode($POSTData); } curl_setopt_array($this->cURL, [ CURLOPT_CUSTOMREQUEST => $Method, CURLOPT_URL => "{$this->APIBaseURL}{$Endpoint}", CURLOPT_HTTPHEADER => $this->RequestHeader, CURLOPT_POSTFIELDS => $POSTData, CURLOPT_HTTPAUTH => $this->User ? \CURLAUTH_BASIC : \CURLAUTH_NONE, CURLOPT_USERPWD => "{$this->User}:{$this->Password}", CURLOPT_TIMEOUT => $TimeoutSecond, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_CONNECTTIMEOUT => 60, ]); set_time_limit($TimeoutSecond); $Response = curl_exec($this->cURL); $HTTPStatusCode = curl_getinfo($this->cURL, \CURLINFO_HTTP_CODE); $cURLErrorCode = curl_errno($this->cURL); $cURLErrorMessage = curl_error($this->cURL); if($cURLErrorCode){ $Error->Code = $cURLErrorCode; $Error->Message = $cURLErrorMessage; } else{ if($HTTPStatusCode == 200){ $Data = json_decode($Response); } else{ $Error = (object)[ "Code" => $HTTPStatusCode, "Message" => self::HTTP_ERROR_BY_CODE[$HTTPStatusCode]["Message"] ?? "API error {$HTTPStatusCode}", ]; } } return (object)[ "Error" => $Error, "Data" => $Data, ]; } } ?>
Warning: Cannot modify header information - headers already sent by (output started at /WWW/default/.library/class/Joy/AUTOMATIC1111.php:1) in /WWW/default/index.php on line 203

Warning: http_response_code(): Cannot set response code - headers already sent (output started at /WWW/default/.library/class/Joy/AUTOMATIC1111.php:1) in /WWW/default/index.php on line 204
{"Title":"Resume for Bogus Boo","Name":"Bogus Boo","Location":"South East Asia","Email":"Boss@Bogus.Boo","Purpose":"Looking for job","Technology":["DNS","Linux","Database","Server maintenance","MySQL","Web server","Mail server","Private cloud implementation","Public cloud deployment","Docker","Virtualization"],"Availability":{"Type":["Full time","Part time","Contractual"],"Joining":"Immediate","Daily":"7 hours","Weekly":"5 days","Exclusion":"Per bank holidays & exclusive festivals"},"Expectation":{"Deployment":["Europe","Open to suggestion"],"Remuneration":"Industry standard","Role":"Consultant"},"Experience":{"HelloWorldYear":"1995","Professional":[{"Position":"CTO","Duration":"3.5 years","Organization":"Start up","Responsibility":["Pioneering product development","IoT","Distributed application","Database architecture","Data communication protocol","Solution architecture","Team formation","Business alignment","Development management","Technology managemeent"]},{"Position":"CTO","Duration":"3 years","Organization":"Start up","Responsibility":["Team formation","Business alignment","Development management","Technology managemeent","Web application","Android & iOS application","Platform management"]},{"Position":"Senior developer","Duration":"3 years","Organization":"Conglomerate","Responsibility":["Web application","PHP","MySQL"]}]},"Quote":["Ask the right question to get the right answer","Passion became profession"]}