<?php
// Generated by SPANDAMAN. Fast public publish/status refresh for shared hosts.
error_reporting(0);
set_time_limit(30);
header('Content-Type: application/json; charset=utf-8');
$channels = __DIR__ . '/channels';
if (!is_dir($channels)) mkdir($channels, 0755, true);
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
if (strtolower($host) === 'www.apps.spandaman.co.uk') $host = 'apps.spandaman.co.uk';
$dir = rtrim(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'] ?? '/')), '/');
if ($dir === '/' || $dir === '.') $dir = '';
$base = $scheme . '://' . $host . $dir;
$countNeedle = function($path, $needle) {
    if (!is_file($path)) return 0;
    $count = 0;
    $handle = fopen($path, 'rb');
    if (!$handle) return 0;
    while (!feof($handle)) {
        $chunk = fread($handle, 1048576);
        if ($chunk === false || $chunk === '') continue;
        $count += substr_count($chunk, $needle);
    }
    fclose($handle);
    return $count;
};
$shouldRebuild = filter_var($_GET['rebuild'] ?? false, FILTER_VALIDATE_BOOLEAN);
$rootM3u8 = __DIR__ . '/spandaman_playlist.m3u8';
$rootM3u = __DIR__ . '/spandaman_playlist.m3u';
if (!is_file($rootM3u8) || filesize($rootM3u8) < 1024 || !is_file($rootM3u) || filesize($rootM3u) < 1024) {
    $shouldRebuild = true;
}
$writePublicPlaylist = function($paths) use ($base) {
    $targetM3u8 = __DIR__ . '/spandaman_playlist.m3u8';
    $targetM3u = __DIR__ . '/spandaman_playlist.m3u';
    $tmpM3u8 = $targetM3u8 . '.tmp.' . getmypid();
    $tmpM3u = $targetM3u . '.tmp.' . getmypid();
    $merged = fopen($tmpM3u8, 'wb');
    if (!$merged) return false;
    if (fwrite($merged, '#EXTM3U x-tvg-url="' . $base . '/spandaman_epg.xml.gz" url-tvg="' . $base . '/spandaman_epg.xml.gz"' . "\n") === false) {
        fclose($merged); @unlink($tmpM3u8); return false;
    }
    foreach ($paths as $path) {
        if (!is_file($path)) continue;
        $handle = fopen($path, 'rb');
        if (!$handle) continue;
        while (($line = fgets($handle)) !== false) {
            if (stripos(trim($line), '#EXTM3U') === 0) continue;
            if (fwrite($merged, str_replace('[[SERVER_URL]]', $base, $line)) === false) {
                fclose($handle); fclose($merged); @unlink($tmpM3u8); return false;
            }
        }
        fclose($handle);
    }
    if (!fclose($merged)) { @unlink($tmpM3u8); return false; }
    if (!copy($tmpM3u8, $tmpM3u)) { @unlink($tmpM3u8); @unlink($tmpM3u); return false; }
    @chmod($tmpM3u8, 0777); @chmod($tmpM3u, 0777);
    if (!rename($tmpM3u8, $targetM3u8)) { @unlink($tmpM3u8); @unlink($tmpM3u); return false; }
    if (!rename($tmpM3u, $targetM3u)) { @unlink($tmpM3u); return false; }
    @chmod($targetM3u8, 0777); @chmod($targetM3u, 0777);
    return true;
};
if ($shouldRebuild && !$writePublicPlaylist(array($channels . '/spandaman_xtream_all.m3u8', $channels . '/spandaman_tmdb_vod.m3u8'))) {
    http_response_code(500);
    echo json_encode(array('ok' => false, 'error' => 'Atomic public playlist write failed'));
    exit;
}
$liveCount = $countNeedle($channels . '/spandaman_xtream_live_streams.json', '"stream_id"');
$vodCount = $countNeedle($channels . '/spandaman_xtream_vod_streams.json', '"stream_id"') + $countNeedle($channels . '/spandaman_tmdb_vod_streams.json', '"stream_id"');
$seriesStaticCount = $countNeedle($channels . '/spandaman_xtream_series_streams.json', '"series_id"');
$seriesCatalogCount = $countNeedle($channels . '/spandaman_tmdb_series_streams.json', '"series_id"');
$seriesPlayableCount = $countNeedle($channels . '/spandaman_tmdb_playable_series_streams.json', '"series_id"');
$adultCount = $countNeedle(__DIR__ . '/spandaman_adult.m3u8', '#EXTINF');
$existingStatus = array();
$statusPath = $channels . '/spandaman_tmdb_status.json';
if (is_file($statusPath)) {
    $decodedStatus = json_decode(file_get_contents($statusPath), true);
    if (is_array($decodedStatus)) $existingStatus = $decodedStatus;
}
$status = array_merge($existingStatus, array(
    'ok' => true,
    'fast' => true,
    'rebuild' => $shouldRebuild,
    'updated_at' => gmdate('c'),
    'live' => $liveCount,
    'vod' => $vodCount,
    'series' => $seriesCatalogCount,
    'series_catalog' => $seriesCatalogCount,
    'series_playable' => $seriesPlayableCount,
    'adult' => $adultCount,
    'adult_enabled' => true,
    'static_database_counts' => array('live' => $liveCount, 'vod' => $countNeedle($channels . '/spandaman_xtream_vod_streams.json', '"stream_id"'), 'series' => $seriesStaticCount),
    'public_counts' => array('live' => $liveCount, 'vod' => $vodCount, 'series' => $seriesPlayableCount + $seriesStaticCount),
    'playlist' => $base . '/get.php?username=anything&password=anything&type=m3u_plus&output=ts',
    'player_api' => $base . '/player_api.php?username=anything&password=anything',
));
file_put_contents($statusPath, json_encode($status, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
echo json_encode($status, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
?>