Yayın durdurma, kanal duraklat/devam (tekli+toplu), şimdi kontrol et, manuel URL ile zorla kayıt başlatma, canlı player+log önizleme, oturum süre sayacı, başarısız/takılı render için tekrar dene ve iptal, poll aralığı + ham segment TTL'yi panelden canlı değiştirme, cookie bayatlık uyarısı, Telegram bildirim aç/kapa, ve kullanım/maliyet özeti (/stats). api-daemon'ın yeni state-değiştiren endpoint'leri (stop/force-start/ render/cancel) INTERNAL_API_TOKEN ile korunuyor — bu daemon'ın portu Coolify'de public'e açık olduğu için korumasız bırakmak güvenlik açığı olurdu. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
||
import Link from "next/link";
|
||
import "./globals.css";
|
||
import { getSession } from "../lib/auth";
|
||
import { logout } from "./login/actions";
|
||
|
||
export const metadata: Metadata = {
|
||
title: "StreamClipper AI — Panel",
|
||
};
|
||
|
||
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
||
const session = await getSession();
|
||
|
||
return (
|
||
<html lang="tr">
|
||
<body>
|
||
{session && (
|
||
<nav className="nav">
|
||
<Link href="/">Kanal Durumu</Link>
|
||
<Link href="/segments">Segment & Aday Kütüphanesi</Link>
|
||
<Link href="/stats">İstatistik</Link>
|
||
<Link href="/settings">Ayarlar</Link>
|
||
<Link href="/users">Kullanıcılar</Link>
|
||
<span style={{ marginLeft: "auto", display: "flex", gap: "1rem", alignItems: "center" }}>
|
||
<span className="mono">{session.username}</span>
|
||
<form action={logout}>
|
||
<button
|
||
type="submit"
|
||
style={{ background: "none", border: "none", color: "var(--muted)", cursor: "pointer", font: "inherit" }}
|
||
>
|
||
Çıkış Yap
|
||
</button>
|
||
</form>
|
||
</span>
|
||
</nav>
|
||
)}
|
||
<main>{children}</main>
|
||
</body>
|
||
</html>
|
||
);
|
||
}
|