#!/usr/bin/php #!/usr/bin/php

<?php

die(highlight_file(__FILE__,1));

// ваш ключ openai.com (для примера, буковки изменены):
$AI_API="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";

// титульная страница нынешней Грелки:
$GRELKA='http://www.leningrad.su/makod/texts/k220_competition.htm';

$list='/tmp/grelka.htm';
if(!
is_file($list)) file_put_contents($list,file_get_contents($GRELKA));
$s=file_get_contents($list);
$s=wu($s);

$m=explode("<p><center><h4>",$s);

foreach(
$m as $num=>$l) {

    if(    
preg_match_all("/(\d+)\. \(\d+\) <a href=\"(.+?)\">(.+?)<\/a>/s",$l,$e) ) {
    
$gd="Группа ".$num;
    if(!
is_dir($gd)) mkdir($gd);
    echo 
"\n\n === ".$gd;

    foreach(
$e[0] as $i=>$l) {
        
$nm=$e[1][$i];
        
$url="http://www.leningrad.su".$e[2][$i];
        
$name=trim($e[3][$i]);
        
$to=$gd."/".sprintf("%02d",$nm)." ".$name.".txt";

        echo 
"\n $url [$name] -> ".$to;

        if(
is_file($to)) $txt=file_get_contents($to);
        else {
            
$txt=file_get_contents($url); // скачать рассказ
            
$txt=wu(ochictka($txt));
            
file_put_contents($to,$txt); // записать рассказ
        
}

        
say_text($gd."/".sprintf("%02d",$nm)." ".$name,$txt);
    }
    }

}

function 
wu($s) { $s=strtr($s,chr(152),'@'); return(iconv("windows-1251","utf-8//IGNORE",$s)); }
function 
uw($s) { return(iconv("utf-8","windows-1251//IGNORE",$s)); }

function 
ochictka($s) {
    
$s=str_replace("\r",'',$s);
    
$s=str_replace('&nbsp;',' ',$s);
    
$s=str_replace('&quot;','"',$s);
    
$s=str_ireplace('<p align="justify">','<p>',$s);
    
$s=str_ireplace('</p>','',$s);
    
$s=str_ireplace('<p>','',$s);
    if(!
preg_match("/<hr>.+?<hr>(.+?)<hr>/s",$s,$m)) die("No body!"); $s=$m[1];
    if(!
preg_match("/<h3><center><b>(.+?)<\/b><\/h3><\/center>(.+?)$/s",$s,$m)) die("No Header!"); $head=$m[1]; $s=$m[2];
    return 
$head."\n\n".$s;
}


function 
say_text($dir,$s) {
    if(!
is_dir($dir)) mkdir($dir);
    
// $p=glob($dir."/*.txt"); foreach($p as $l) @unlink($l);

    
$s=uw($s);
    
$LIM=3000// ограничение по количеству байт в каждом отрезке

    // будем разбивать текст на строки, а затем и собирать подходящие порции для озвучки

    
$u=explode("\n",$s);
    
$e=array();
    for(
$i=0;$i<sizeof($u);$i++) {
    
$l=$u[$i];
        while(
strlen($l)>$LIM) {
        
$j=$LIM; while($j && !in_array($l[$j],array('.','?','!'))) $j--;
            
$e[]=substr($l,0,$j+1);
            
$l=trim(substr($l,$j+1));
        }
    
$e[]=$l;
    }

    
$k=1$i=0;
    while(isset(
$e[$i])) {
    
$o=''; while(isset($e[$i]) && strlen($o.$e[$i])<=$LIM$o.=$e[$i++]."\n";
        
$out=$dir."/".sprintf("%03d",$k++).".ask.txt";
    if(!
strlen($o)) break;
        echo 
"\n[$out] (".strlen($o).")--------\n".wu($o);
        
file_put_contents($out,wu($o));
    
$ai=str_replace(".txt",".ai.txt",$out);
        if(!
is_file($ai)) {
      
$tim=4;
      while(
1) {
        
$l=ask_ai(wu($o));
        if(
$l===false) {
        echo 
' [Err] ';
        
sleep($tim);
        
$tim=$tim*2;
        continue;
        }
        
file_put_contents($ai,$l);
        break;
      }
    } 
// say(wu($o),$mp3); // создать очередную порцию mp3
    
}

    
// и наконец соберем все куски в единый файл:
    
$r=glob($dir."/*.ai.txt"); if(!sizeof($r)) return;

    
$o=''; foreach($r as $n=>$l) {
    
$x=file_get_contents($l);
    
$o=$o.(strlen($o)?' ':'').$x;
    }
    echo 
$o;
    
file_put_contents($dir."/rec.txt",$o);
}



function 
ejs($s) {
    return 
str_replace(
    array(
"\n""\r""\u""\t""\f""\b""/"'"'),
    array(
"\\n""\\r""\\u""\\t""\\f""\\b""\/"'\\'.'"'),
    
$s
    
);
}

function 
ask_ai($text) {

    
$a='{
     "model": "gpt-3.5-turbo-0301",
     "messages": [
        {"role": "system", "content": "'
        
."Перескажи на русском языке кратко отрывок фантастического рассказа."
." Учти, что неизвестно, из какого места рассказа взят отрывок, поэтому избегай выражений 'в начале рассказа' и 'в конце рассказа'."
." Вот этот отрывок: ".ejs($text)
    .
'"}
     ],
     "temperature": 0.0
    }'
;

    
$ch curl_init"https://api.openai.com/v1/chat/completions" );
    
curl_setopt($chCURLOPT_POST ,1);
    
curl_setopt($chCURLOPT_POSTFIELDS $a);
    
curl_setopt($chCURLOPT_RETURNTRANSFER ,1);
    
curl_setopt($chCURLOPT_HTTPHEADER, [
        
"Content-Type: application/json",
        
"Authorization: Bearer ".$GLOBALS['AI_API']
    ]);
    
$b curl_exec($ch); curl_close($ch);

    echo 
$b;

    if( 
strstr($b,"You exceeded your current quota") ) { die('блять'); }

    if(    
strstr($b,"We could not parse the JSON") ) { die($a); }

    if(
strstr($b,"Please try again in 20s.")) sleep(20);

    
$j=json_decode($b); if(!isset($j->choices[0]->message->content)) return false;
    return 
$j->choices[0]->message->content;
}

?>