Skip to content

Bug Report: Broadcast YouTube Duplikat Dibuat untuk 1 Jadwal Stream #98

@edockf

Description

@edockf

Deskripsi

StreamFlow membuat 2-3 broadcast YouTube duplikat untuk 1 jadwal stream saat menggunakan mode YouTube API (bukan manual RTMP).

Langkah Reproduksi

  1. Buat jadwal stream menggunakan integrasi YouTube API
  2. Set jadwal untuk 1 stream (misal: live harian)
  3. Tunggu waktu jadwal atau cek YouTube Studio segera setelah dibuat
  4. 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:

  1. Line 547: Mekanisme retry saat stream offline
  2. 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);
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions