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

<?php

die(highlight_file(__FILE__,1));


// ваш ключ речевого API Яндекса (для примера, буковки изменены):
$API="fe51d7fb-f242-4601-8845-714bec9dedb4";

// титульная страница нынешней Грелки:
// $GRELKA='http://www.leningrad.su/makod/texts/k211_competition.htm';
$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"; // Группа 1/03 Название.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,$out) {
    if(empty($text)) return;
    $url="https://tts.voicetech.yandex.net/generate";

while(1) {
    $ch = curl_init($url);

    curl_setopt ($ch, CURLOPT_TIMEOUT,10);

    curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS,
            "format=mp3" // mp3 — MPEG-1 Layer 3; wav — PCM; opus — OGG
            ."&lang=ru-RU" // ru‑RU русский язык; en-US английский язык; tr-TR турецкий язык; uk-UK украинский язык.
//            ."&speaker=ermil" // женские: jane, oksana, alyss и omazh; мужские: zahar, ermil
            ."&speaker=alyss" // женские: jane, oksana, alyss и omazh; мужские: zahar, ermil
            ."&emotion=good" // good — радостный, доброжелательный; evil — раздраженный; neutral — нейтральный (по умолчанию)
            ."&key=".$GLOBALS['API']
            ."&text=".urlencode($text)); // Ограничение на длину: 2000 байт.
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // возвращать результат работы
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // не проверять SSL сертификат
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // не проверять Host SSL сертификата
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Expect:')); // чтобы cURL не высылал заголовок на ожидание
    curl_exec ($ch);
    $result=curl_multi_getcontent($ch);
    curl_close ($ch);
    if(
    // substr($result,0,19)=='Service unavailable'
    strlen($result) > 2000
    ) break;
    echo "\n [err] ".$result;
}

    // if(empty($result)) die('Error');
    file_put_contents($out,$result);
}

function ssize($g,$f) {
    $r=glob($g); $z=0; foreach($r as $l) $z+=filesize($l);
    $fz=intval(@filesize($f));
    if(!$fz) return 0;
    return floor(100*$z/$fz);
}

function say_text($dir,$s) {
    if(!is_dir($dir)) mkdir($dir);

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

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

    $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+7)) $o.=$e[$i++]."\n";
        $out=$dir."/".sprintf("%03d",$k++).".txt";
    if(!strlen($o)) { die("\n [!!!] break\n"); break; }
        echo "\nPart txt ".ssize($dir."/*.txt", $dir.".txt")."% [$out] (".strlen($o).")\n"; // .wu($o);
        file_put_contents($out,wu($o));
    $mp3=str_replace(".txt",".mp3",$out);
        if(!is_file($mp3)) say(wu($o),$mp3); // создать очередную порцию mp3
    }

    // и наконец соберем все куски mp3 в единый файл:

    $z=ssize($dir."/*.txt", $dir.".txt");
    echo "======================> TXT: ".$z."%\n";
    if($z < 90 || $z > 110) die('Err');

    $r=glob($dir."/*.mp3"); foreach($r as $n=>$l) $r[$n]=basename($l);
    $mymp3=basename($dir).'.mp3';
    $mp3out=$dir.".mp3";
    // if(!is_file($mp3out)) unlink($mp3out);
    if(!is_file($mp3out)) {
    echo "\n\nconcat: [$mp3out]\n";
        $r='cd "'.$dir.'"; ffmpeg -i "concat:'.implode('|',$r).'" -acodec copy "../'.basename($mp3out).'"';
    // die($r);
        exec($r);
    }
}