-
Notifications
You must be signed in to change notification settings - Fork 231
Description
Deskripsi
StreamFlow membuat 2-3 broadcast YouTube duplikat untuk 1 jadwal stream saat menggunakan mode YouTube API (bukan manual RTMP).
Langkah Reproduksi
- Buat jadwal stream menggunakan integrasi YouTube API
- Set jadwal untuk 1 stream (misal: live harian)
- Tunggu waktu jadwal atau cek YouTube Studio segera setelah dibuat
- Hasil: 2 atau 3 broadcast identik dibuat dengan judul dan video yang sama
Hasil yang Diharapkan
Hanya 1 broadcast YouTube yang dibuat per jadwal stream.
Hasil Aktual
Beberapa broadcast duplikat (2-3) dibuat untuk stream yang sama.
Bukti dari Log
0|streamfl | [YouTubeService] Creating YouTube broadcast for stream 222b252c-6559-4071-90d2-b5bdaa5f1776
0|streamfl | [YouTubeService] Created broadcast: ezDm5eQGz3Y
0|streamfl | [YouTubeService] Creating YouTube broadcast for stream 222b252c-6559-4071-90d2-b5bdaa5f1776
0|streamfl | [YouTubeService] Created broadcast: XG6Ofv3iczc
text
Stream ID yang sama membuat 2 broadcast berbeda (ezDm5eQGz3Y dan XG6Ofv3iczc).
Analisis Root Cause
Setelah investigasi services/streamingService.js, ditemukan bahwa fungsi startStream() bisa dipanggil berkali-kali untuk stream yang sama:
- Line 547: Mekanisme retry saat stream offline
- Line 812: Auto-restart setelah FFmpeg process di-kill (dengan delay 3 detik)
Jika kedua mekanisme terpicu bersamaan (misal saat schedule start atau network issues), startStream() dipanggil 2-3 kali, menyebabkan multiple YouTube broadcast dibuat.
Saran Perbaikan
Tambahkan mekanisme lock/flag untuk mencegah startStream() dipanggil berkali-kali untuk stream ID yang sama dalam waktu singkat:
const streamStartLocks = new Set();
async function startStream(streamId, isRetry = false, baseUrl = null) {
// Cegah duplicate calls
if (streamStartLocks.has(streamId)) {
addStreamLog(streamId, 'Stream start sudah berjalan, skip duplicate call');
return { success: false, error: 'Stream start sudah berjalan' };
}
streamStartLocks.add(streamId);
try {
// ... existing code ...
} finally {
streamStartLocks.delete(streamId);
}
}