@page "{id:int}" @model Admin.Pages.Channel.List.ViewModel @{ ViewData["Title"] = "채널 정보"; }

@ViewData["Title"]


@* ── DB 채널 정보 ───────────────────────────────────────────── *@
채널 기본 정보
PK
@Model.ID
회원(소유자)
@Model.MemberInfo
SID
@Model.SID
이름
@Model.Name
핸들
@(Model.Handle ?? "-")
YouTube 주소
수수료(%)
@Model.PlatformFeeRate%
인증 여부
@if (Model.IsVerified) { 인증됨 } else { 미인증 }
사용 여부
@if (Model.IsActive) { 활성 } else { 비활성 }
수정일시
@(Model.UpdatedAt ?? "-")
등록일시
@Model.CreatedAt
@* ── YouTube API 채널 정보 ───────────────────────────────────── *@
YouTube 채널 상세 정보
@if (Model.YouTubeApiFailed) {
@Model.YouTubeApiError
} else if (Model.YouTubeChannel is not null) { var yt = Model.YouTubeChannel;
@* 채널 프로필 헤더 *@
@yt.Title
@yt.Title
@if (yt.CustomUrl is not null) { @@(yt.CustomUrl.TrimStart('@@')) }
@* 통계 카드 *@
@FormatNumber(yt.SubscriberCount)
구독자
@FormatNumber(yt.VideoCount)
동영상
@FormatNumber(yt.ViewCount)
총 조회수
@* 상세 정보 테이블 *@
채널 ID
@yt.ChannelId
채널 이름
@yt.Title
커스텀 URL
@(yt.CustomUrl ?? "-")
구독자 수
@yt.SubscriberCount.ToString("N0")
동영상 수
@yt.VideoCount.ToString("N0")
총 조회수
@yt.ViewCount.ToString("N0")
썸네일
thumbnail
설명
@if (!string.IsNullOrWhiteSpace(yt.Description)) {
@yt.Description
} else { - }
} @* ── 생방송 방송 상태 (PubSub 기반 — Redis 조회, API 0 unit) ──── *@
생방송 상태
@if (Model.LiveStream is not null) { var live = Model.LiveStream;
LIVE
@live.Title
Video ID
@live.VideoId
Live Chat ID
@(live.ActiveLiveChatId ?? "-")
방송 시작
@(live.ActualStartTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? "-")
상태
@if (live.IsLive) { 생방송 중 } else if (live.IsUpcoming) { 예정됨 — @(live.ScheduledStartTime?.ToString("yyyy-MM-dd HH:mm") ?? "") }
} else {
방송 종료
}

@section Styles { } @functions { static string FormatNumber(long value) { if (value >= 100_000_000) { return $"{value / 100_000_000.0:0.#}억"; } if (value >= 10_000) { return $"{value / 10_000.0:0.#}만"; } if (value >= 1_000) { return $"{value / 1_000.0:0.#}천"; } return value.ToString("N0"); } }