<?php
// Включаем вывод ошибок для отладки
//ini_set('display_errors', 1);
//error_reporting(E_ALL);

if ($_GET["source"]=="view") {
    
show_source($_SERVER['SCRIPT_FILENAME']);
    exit;
}



system("rm *.mp3");

// Функция для загрузки RSS-ленты
function loadRSS($url)
{
    
$rssContent = @file_get_contents($url);
    if (
$rssContent === false) {
        die(
"Ошибка загрузки RSS-ленты: $url");
    }

    
$xml = @simplexml_load_string($rssContent);
    if (!
$xml) {
        die(
"Ошибка парсинга RSS-ленты: $url");
    }

    return 
$xml;
}

// Функция для извлечения данных из RSS
function parseRSS($xml)
{
    
$newsItems = [];
    if (isset(
$xml->channel->item)) {
        foreach (
$xml->channel->item as $item) {
            
$newsItems[] = [
                
'title'       => (string)$item->title,
                
'description' => strip_tags((string)$item->description),
                
'link'        => (string)$item->link,
                
'image'       => (string)$item->enclosure['url']
            ];
        }
    }
    return 
$newsItems;
}

// Определяем источник RSS-ленты
$rssUrl = isset($_GET['source']) ? $_GET['source'] : 'https://3dnews.ru/news/rss';

// Загрузка RSS-ленты
$xml = loadRSS($rssUrl);
$newsItems = parseRSS($xml);

// Определяем индекс текущей новости
$currentIndex = isset($_GET['index']) ? (int)$_GET['index'] : 0;
if (
$currentIndex < 0 || $currentIndex >= count($newsItems)) {
    
$currentIndex = 0;
}
$currentNews = $newsItems[$currentIndex] ?? null;

/**
 * 2. Генерация MP3-файлов с Google TTS
 */
function generateTTS($text) {
    
// Максимальная длина блока (в символах)
    
$blockSize = 200;

    
// Разделяем текст на блоки по знакам препинания, кавычкам, скобкам и цифрам
    
$parts = preg_split('/(?<=\p{P}|\p{N}|\s)/u', $text, -1, PREG_SPLIT_NO_EMPTY);
    
$blocks = [];
    
$currentBlock = '';

    
// Собираем блоки, не превышающие $blockSize символов
    
foreach ($parts as $part) {
        
// Если добавление новой части не превышает лимит
        
if (strlen($currentBlock) + strlen($part) <= $blockSize) {
            
$currentBlock .= ($currentBlock === '') ? $part : $part;
        } else {
            
// Если блок заполнен, добавляем его в массив
            
if ($currentBlock !== '') {
                
$blocks[] = trim($currentBlock);
            }
            
// Начинаем новый блок с текущей части
            
$currentBlock = $part;
        }
    }

    
// Добавляем последний блок, если он не пустой
    
if ($currentBlock !== '') {
        
$blocks[] = trim($currentBlock);
    }

    
// Генерируем MP3-файлы для каждого блока
    
$mp3Files = [];
    foreach (
$blocks as $block) {
        
// URL для запроса (Google TTS)
        
$url = 'https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=ru&q=' . urlencode($block);

        
// Инициализируем cURL
        
$ch = curl_init($url);
        
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

        
// Важно указать Header/Agent, иначе Google может не вернуть аудио
        
curl_setopt($ch, CURLOPT_HTTPHEADER, [
            
'User-Agent: Mozilla/5.0',
            
'Accept: audio/mpeg'
        
]);

        
// Выполняем запрос
        
$data = curl_exec($ch);

        if (
curl_errno($ch)) {
            
$error_msg = 'Ошибка cURL: ' . curl_error($ch);
            echo 
"<p>$error_msg</p>";
            
curl_close($ch);
            return 
false;
        }

        
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
curl_close($ch);

        if (
$statusCode !== 200) {
            
$error_msg = 'Google TTS вернул статус-код: ' . $statusCode;
            echo 
"<p>$error_msg</p>";
            return 
false;
        }

        
// Пытаемся сохранить файл MP3
        
$filename = 'tts_' . md5($block) . '.mp3';
        if (
file_put_contents($filename, $data) === false) {
            
$error_msg = 'Не удалось сохранить MP3-файл: ' . $filename;
            echo 
"<p>$error_msg</p>";
            return 
false;
        }

        
$mp3Files[] = $filename;
    }

    return 
$mp3Files;
}

// ВАЖНО: Инициируем $mp3Files, чтобы не было ошибки "Undefined variable"
$mp3Files = [];

// Если есть текущая новость и её описание
if ($currentNews && trim($currentNews['description']) !== '') {
    
$textToConvert = $currentNews['title'] . '. ' . $currentNews['description'];
    
$mp3Files = generateTTS($textToConvert);
    if (
$mp3Files === false) {
        
$mp3Files = [];
    }
}
?>

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Новостичиталка</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            max-width: 800px;
        }
       .news-container {
            margin-top: 20px;
        }
        #news-image {
            max-width: 100%;
            height: auto;
            display: block;
            margin-bottom: 10px;
        }
       .button {
            margin: 5px;
            padding: 10px;
            cursor: pointer;
            background: #3b89e6;
            color: #fff;
            border: none;
            border-radius: 4px;
        }
       .button:hover {
            background: #337ac7;
        }
       .nav {
            margin-top: 20px;
        }
        audio {
            margin-top: 15px;
            display: block;
        }
    </style>
</head>
<body>
<h1>
    <?php if ($_GET["source"]=="") echo "Новостичиталка"; 
            else {
                
$rssContent = file_get_contents($_GET["source"]);
                
// Используем регулярное выражение для извлечения названия сайта
                
preg_match('/<title>(.*?)<\/title>/', $rssContent, $matches);
                echo isset(
$matches[1]) ? $matches[1] : null;
            }
    
?>
</h1>

<select onChange="location.href='?source=' + encodeURIComponent(this.value)">
    <option value="">--- выберите источник новостей</option>
    <option value="https://24gadget.ru/rss.xml">24gadget</option>
    <option value="https://3dnews.ru/news/rss">3D News</option>
    <option value="https://www.cnews.ru/inc/rss/biz.xml">CNews</option>
    <option value="https://xakep.ru/feed/">xakep</option>
    <option value="https://www.computerra.ru/feed/">computerra</option>
    <option value="https://hi-news.ru/feed">hi-news</option>
    <option value="https://rb.ru/feeds/all/">rb.ru</option>
</select>

<?php
    
if ($_GET["source"]=="") die("</html></body>");
?>

<?php if (!$currentNews):?>
    <p>Нет доступных новостей или индекс вне диапазона.</p>
<?php else:?>
    <div class="news-container">
        <?php if (!empty($currentNews['image'])):?>
            <img id="news-image" src="<?= htmlspecialchars($currentNews['image'])?>" alt="News Image">
        <?php endif;?>
        <h2><?= htmlspecialchars($currentNews['title'])?></h2>
        <p><?= htmlspecialchars($currentNews['description'])?></p>
    </div>
<?php endif;?>

<div class="nav">
    <button class="button" onclick="location.href='?source=<?= urlencode($rssUrl) ?>&index=<?= $currentIndex - 1?>'">Предыдущая новость</button>
    <?php if ($currentNews && $currentNews['link']):?>
        <button class="button" onclick="window.open('<?= htmlspecialchars($currentNews['link'])?>', '_blank')">Подробней</button>
    <?php endif;?>
    <button class="button" onclick="location.href='?source=<?= urlencode($rssUrl) ?>&index=<?= $currentIndex + 1?>'">Следующая новость</button>
</div>

<?php if (!empty($mp3Files)):?>
    <?php foreach ($mp3Files as $mp3File):?>
        <audio>
            <source src="<?= htmlspecialchars($mp3File)?>" type="audio/mpeg">
            Ваш браузер не поддерживает элемент audio.
        </audio>
    <?php endforeach;?>
<?php 
else:?>
    <p style="color:gray;">Аудио для этой новости не доступно.</p>
<?php endif;?>

<script>
    // Получаем все аудио элементы
    const audioElements = document.querySelectorAll('audio');
    let currentAudioIndex = 0;

    // Функция для воспроизведения следующего аудио
    function playNextAudio() {
        if (currentAudioIndex < audioElements.length) {
            const audio = audioElements[currentAudioIndex];
            audio.play();

            // Когда текущее аудио закончится, переходим к следующему
            audio.onended = () => {
                currentAudioIndex++;
                playNextAudio();
            };
        } else {
            // Если все аудио закончились, проверяем, есть ли следующая новость
            const nextIndex = <?= $currentIndex + 1 ?>;
            if (nextIndex < <?= count($newsItems) ?>) {
                // Переходим на следующую новость
                setTimeout(() => {
                    window.location.href = '?source=<?= urlencode($rssUrl) ?>&index=' + nextIndex;
                }, 1000); // Задержка в 1 секунду перед переходом
            } else {
                // Если новости закончились, переходим на начальную страницу
                setTimeout(() => {
                    window.location.href = '?none';
                }, 1000); // Задержка в 1 секунду перед переходом
            }
        }
    }

    // Начинаем воспроизведение с первого аудио
    if (audioElements.length > 0) {
        playNextAudio();
    }
</script>
</body>
</html>