Files
MatchLiveTv/backend/app/controllers/public/live_controller.rb
Emiliano Frascaro 471291b2c4 Sito marketing, SEO, legal, live programmata e branding Match Live Tv.
Logo e favicon nel header, partite programmate su web e mobile, reset password,
pagine FAQ/sitemap, privacy/termini GDPR e icona Android «Match Live Tv».

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 23:17:15 +02:00

57 lines
1.7 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)
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