feat: YouTube cookie'lerini panelden yönetilebilir hale getir
Cookie'ler saatler içinde eskiyordu, her seferinde manuel Coolify env güncellemesi + redeploy gerekiyordu. Artık DB'de (app_settings tablosu) tutuluyor; /settings sayfasından yeni cookies.txt yapıştırılıp kaydedilebiliyor, bir sonraki yt-dlp çağrısında redeploy gerekmeden devreye giriyor. YTDLP_COOKIES_B64 env var mekanizması kaldırıldı. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -38,3 +38,19 @@ export async function deleteCandidateSegment(candidateId: string) {
|
||||
revalidatePath("/segments");
|
||||
revalidatePath("/", "layout");
|
||||
}
|
||||
|
||||
export async function updateYtdlpCookies(formData: FormData) {
|
||||
const value = String(formData.get("cookies") ?? "").trim();
|
||||
|
||||
if (!value) {
|
||||
throw new Error("Cookie içeriği boş olamaz.");
|
||||
}
|
||||
|
||||
await prisma.appSetting.upsert({
|
||||
where: { key: "ytdlp_cookies" },
|
||||
create: { key: "ytdlp_cookies", value },
|
||||
update: { value },
|
||||
});
|
||||
|
||||
revalidatePath("/settings");
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
||||
<nav className="nav">
|
||||
<Link href="/">Kanal Durumu</Link>
|
||||
<Link href="/segments">Segment & Aday Kütüphanesi</Link>
|
||||
<Link href="/settings">Ayarlar</Link>
|
||||
</nav>
|
||||
<main>{children}</main>
|
||||
</body>
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import { prisma } from "@streamclipper/db";
|
||||
import { updateYtdlpCookies } from "../actions";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export default async function SettingsPage() {
|
||||
const setting = await prisma.appSetting.findUnique({ where: { key: "ytdlp_cookies" } });
|
||||
|
||||
return (
|
||||
<>
|
||||
<h1>Ayarlar</h1>
|
||||
|
||||
<div className="card">
|
||||
<div className="card-head">
|
||||
<span>YouTube Cookie'leri</span>
|
||||
<span className="mono">
|
||||
{setting ? `son güncelleme: ${setting.updatedAt.toLocaleString("tr-TR")}` : "hiç ayarlanmadı"}
|
||||
</span>
|
||||
</div>
|
||||
<p className="empty" style={{ marginBottom: "0.5rem" }}>
|
||||
YouTube canlı yayın kontrolü ve kayıt için kullanılıyor. Google, oturum çerezlerinin bir
|
||||
kısmını birkaç saatte bir yeniliyor — burada eskidiğini fark edersen (kanal detay
|
||||
sayfasında "son poll hatası" olarak görürsün) taze bir cookies.txt ile
|
||||
güncelle. Ana hesabın yerine ayrı, önemsiz bir Google hesabı kullanman önerilir.
|
||||
</p>
|
||||
<form action={updateYtdlpCookies}>
|
||||
<textarea
|
||||
name="cookies"
|
||||
required
|
||||
placeholder="Netscape formatlı cookies.txt içeriğini buraya yapıştır"
|
||||
rows={10}
|
||||
style={{
|
||||
width: "100%",
|
||||
background: "var(--bg)",
|
||||
border: "1px solid var(--border)",
|
||||
borderRadius: "6px",
|
||||
padding: "0.6rem 0.7rem",
|
||||
color: "var(--text)",
|
||||
fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
|
||||
fontSize: "0.75rem",
|
||||
resize: "vertical",
|
||||
}}
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
style={{
|
||||
marginTop: "0.6rem",
|
||||
background: "var(--accent)",
|
||||
border: "none",
|
||||
borderRadius: "6px",
|
||||
padding: "0.5rem 1rem",
|
||||
color: "#fff",
|
||||
fontWeight: 600,
|
||||
fontSize: "0.9rem",
|
||||
cursor: "pointer",
|
||||
}}
|
||||
>
|
||||
Kaydet
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user