import { notFound } from "next/navigation"; import Link from "next/link"; import { prisma } from "@streamclipper/db"; import { fetchChannelStatuses } from "../../../lib/apiDaemon"; import { deleteRawSegment, deleteCandidateSegment } from "../../actions"; import { DeleteButton } from "../../components/DeleteButton"; export const dynamic = "force-dynamic"; const STATUS_BADGE: Record = { PENDING: "muted", PROCESSED: "ok", DISCARDED: "err", PENDING_STT: "warn", TRANSCRIBED: "ok", FAILED: "err", }; function transcriptPreview(transcriptJson: unknown): string | null { if (!transcriptJson || typeof transcriptJson !== "object") return null; const text = (transcriptJson as { text?: string }).text; return text ? text.slice(0, 240) : null; } export default async function ChannelDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const [channel, statuses] = await Promise.all([ prisma.channel.findUnique({ where: { id }, include: { sessions: { orderBy: { startedAt: "desc" }, include: { segments: { orderBy: { createdAt: "desc" }, include: { candidates: { orderBy: { createdAt: "desc" } } }, }, }, }, }, }), fetchChannelStatuses(), ]); if (!channel) notFound(); const status = statuses.get(channel.id); return ( <>

← Kanal Durumu

{channel.name}

{channel.youtubeHandle} · {channel.channelId}

Canlı Durum {status?.recording ? "🔴 Kayıtta" : "Kayıtta değil"}
Aktif: {channel.isActive ? "evet" : "hayır"} ·{" "} Son kontrol: {channel.lastCheckedAt ? new Date(channel.lastCheckedAt).toLocaleString("tr-TR") : "—"}
{status === undefined && (

api-daemon'dan canlı durum alınamadı (servis erişilemez olabilir).

)} {status?.lastPollError && (
son poll hatası
              {status.lastPollError}
            
)}

Yayın Geçmişi

{channel.sessions.length === 0 ? (

Bu kanal için henüz bir kayıt oturumu yok.

) : ( channel.sessions.map((session) => (
{new Date(session.startedAt).toLocaleString("tr-TR")} {session.endedAt ? ` – ${new Date(session.endedAt).toLocaleString("tr-TR")}` : " (devam ediyor)"} {session.totalSegments} segment
{session.segments.length === 0 ? (

Henüz segment yok.

) : ( session.segments.map((segment) => (
{segment.filePath} {segment.status}
İndir
{segment.candidates.map((c) => (
{c.startSec}s – {c.endSec}s {c.audioPeakScore != null && ` · peak ${c.audioPeakScore.toFixed(1)}dB`} {c.status}
{transcriptPreview(c.transcriptJson) && (

{transcriptPreview(c.transcriptJson)}

)}
))}
)) )}
)) )} ); }