# Radyo Kutsal — Yayın API > Canlı ses (HLS/AAC) + çalan parça meta verisi + senkron SRT transkript. > Statik dosya + poll mimarisi: sunucuda kalıcı bağlantı yok, CORS açık (*), kimlik doğrulama yok. > Base URL: https://radyo.akil.cloud ## Uç noktalar (hepsi GET, CORS *) - [Ses HLS](https://radyo.akil.cloud/radyo.m3u8): Kayan pencereli HLS playlist. AAC 48kHz stereo, ~4sn MPEG-TS segment, son 6 segment. Content-Type application/vnd.apple.mpegurl. Safari yerel oynatır; Chrome/Firefox hls.js ile. - [now.json](https://radyo.akil.cloud/now.json): Çalan parça meta verisi (JSON). ~2sn'de güncellenir; istemci 5-10sn'de bir poll'lamalı (daha sık gerekmez). - [current.srt](https://radyo.akil.cloud/current.srt): Çalan parçanın tam SRT transkripti. Parça değişince atomik güncellenir; transcript.available=false ise boş. Parça başına bir kez indir. - [OpenAPI 3.1](https://radyo.akil.cloud/openapi.json): Makine-okunur tam tanım. - [İnsan dokümanı + canlı referans player](https://radyo.akil.cloud/): HTML dokümantasyon, çalışan örnek kod içerir. ## now.json şeması (schemaVersion 1) ```json { "schemaVersion": 1, "serverTime": "2026-06-20T03:33:10.633Z", // positionSec'in gecerli oldugu an (ISO UTC) "serverTimeLocal": "06:33:10", "isPlaying": true, "title": "Parça başlığı", "startedAt": "2026-06-20T02:13:36.633Z", // null olabilir "endsAt": "2026-06-20T03:48:03.633Z", // null olabilir "endsAtLocal": "06:48", // bitis HH:MM (Istanbul) "durationSec": 5667, // null olabilir "positionSec": 4774, // serverTime anindaki pozisyon (sn) — SRT senkron anahtari "remainingSec": 893, // null olabilir "audio": { "hls": "https://radyo.akil.cloud/radyo.m3u8", "codec": "aac", "container": "mpegts", "sampleRate": 48000, "channels": 2 }, "transcript": { "available": true, "srt": "https://radyo.akil.cloud/current.srt", "format": "srt" } } ``` ## Senkron tarifi (ses + SRT hizalama) Sunucu saatine güvenmeye gerek yok; positionSec yeterli. SRT zamanları parça başından (0) itibarendir. 1. now.json'u 5-10sn'de bir çek; çektiğin anı işaretle: `basePos = positionSec; baseAt = Date.now()`. 2. Parça anahtarı `title + "|" + startedAt`; değiştiyse current.srt'yi yeniden indir+parse et (parça başına 1 kez). 3. Her karede: `elapsed = basePos + (Date.now() - baseAt)/1000`; cue = `startSec <= elapsed < endSec` olan blok. 4. Drift bir sonraki now.json poll'unda otomatik düzelir. ## Kurallar - now.json ve .m3u8 no-cache (taze). Segmentler (seg_*.ts) max-age=10. - Rate-limit yok; lütfen now.json'u 5sn'den sık çekmeyin. - Tüm uç noktalar tarayıcıdan doğrudan fetch edilebilir (CORS *).