Rails API, app Flutter, infrastruttura Docker/MediaMTX, sito marketing e documentazione di deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
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)
|
|
|
|
@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
|