diff --git a/backend/app/jobs/youtube_broadcast_activate_job.rb b/backend/app/jobs/youtube_broadcast_activate_job.rb index aaf0cc1..2c1cca3 100644 --- a/backend/app/jobs/youtube_broadcast_activate_job.rb +++ b/backend/app/jobs/youtube_broadcast_activate_job.rb @@ -19,6 +19,11 @@ class YoutubeBroadcastActivateJob < ApplicationJob result = Youtube::BroadcastService.new(session.match.team).activate_broadcast!(session.youtube_broadcast_id) return if result == :live || result == :transitioned + if result == :broadcast_ended + Youtube::SetupBroadcast.recreate!(session.reload) + return + end + return unless result == :waiting_ingest return if attempt >= MAX_ATTEMPTS diff --git a/backend/app/services/youtube/broadcast_service.rb b/backend/app/services/youtube/broadcast_service.rb index ab6680f..3cb9d73 100644 --- a/backend/app/services/youtube/broadcast_service.rb +++ b/backend/app/services/youtube/broadcast_service.rb @@ -24,7 +24,7 @@ module Youtube ), content_details: Google::Apis::YoutubeV3::LiveBroadcastContentDetails.new( enable_auto_start: true, - enable_auto_stop: true + enable_auto_stop: false ) ) result = client.insert_live_broadcast("snippet,status,contentDetails", broadcast) @@ -62,6 +62,7 @@ module Youtube status = item.status.life_cycle_status.to_s return :live if status == "live" + return :broadcast_ended if status == "complete" stream_id = item.content_details&.bound_stream_id if stream_id.present? diff --git a/backend/app/services/youtube/setup_broadcast.rb b/backend/app/services/youtube/setup_broadcast.rb index 8acf146..9dbf582 100644 --- a/backend/app/services/youtube/setup_broadcast.rb +++ b/backend/app/services/youtube/setup_broadcast.rb @@ -7,11 +7,31 @@ module Youtube new(session, youtube_channel: youtube_channel).call end + # Nuova broadcast se YouTube ha chiuso la precedente (auto_stop / ingest perso). + def self.recreate!(session, youtube_channel: nil) + new(session, youtube_channel: youtube_channel).recreate! + end + def initialize(session, youtube_channel: nil) @session = session @youtube_channel = youtube_channel end + def recreate! + @session.reload + return @session if @session.terminal? + return @session unless @session.platform == "youtube" + + Streams::YoutubeRelay.stop(@session) + @session.update!( + youtube_broadcast_id: nil, + youtube_stream_id: nil, + stream_key: nil, + rtmp_url: nil + ) + call + end + def call @session.reload return @session if @session.terminal?