module Public class LiveController < SiteBaseController layout "marketing_live" ACTIVE_STATUSES = %w[live connecting reconnecting].freeze def index @query = params[:q].to_s.strip @sessions = StreamSession .broadcasting .includes(:score_state, match: :team) .search_by_team_or_opponent(@query) .order(Arel.sql("started_at DESC NULLS LAST"), created_at: :desc) busy_match_ids = StreamSession.where.not(status: %w[ended error]).select(:match_id) @upcoming_matches = Match .scheduled_upcoming .includes(:team) .search_teams_or_opponents(@query) .where.not(id: busy_match_ids) .order(scheduled_at: :asc) .limit(30) @online_paths = Mediamtx::Client.new.online_path_names end def show @session = StreamSession.includes(match: :team).find(params[:id]) @match = @session.match @stream_closed = @session.terminal? @on_air = !@stream_closed && mediamtx_online?(@session) end def status session = StreamSession.includes(match: :team).find(params[:id]) closed = session.terminal? render json: { status: session.status, stream_closed: closed, live: !closed && (session.live? || mediamtx_online?(session)), on_air: !closed && mediamtx_online?(session), ended_at: session.ended_at, home_name: session.match.team.name, away_name: session.match.opponent_name, score: session.score_state&.as_cable_payload } end private def mediamtx_online?(session) @online_paths_cache ||= Mediamtx::Client.new.online_path_names @online_paths_cache.include?(session.mediamtx_path_name) end end end