'rate limited']); exit; } $ctx = stream_context_create(['http' => [ 'timeout' => 4, 'header' => "User-Agent: sillylaird-nowplaying/1.0\r\n", ]]); $raw = @file_get_contents('https://radio.sillylaird.ca/status-json.xsl', false, $ctx); if ($raw === false) { if (is_file($cacheFile)) { readfile($cacheFile); exit; } http_response_code(502); echo json_encode(['error' => 'upstream']); exit; } $data = json_decode($raw, true); $src = $data['icestats']['source'] ?? null; if (is_array($src) && isset($src[0])) $src = $src[0]; $out = json_encode([ 'title' => $src['title'] ?? ($src['yp_currently_playing'] ?? null), 'name' => $src['server_name'] ?? null, 'online' => isset($src['title']) || isset($src['yp_currently_playing']), 'fetched' => time(), ]); @file_put_contents($cacheFile . '.tmp', $out, LOCK_EX); @rename($cacheFile . '.tmp', $cacheFile); echo $out;