feat: birden fazla YouTube hesabı arasında cookie'yi dağıt (Faz 6)

Proxy IP'lerini havuza dağıttığımız aynı sorun cookie/hesap seviyesinde de
vardı: tek bir Google hesabı 7-8 kanalı taramaya çalışınca YouTube hesabın
kendisini şüpheli bulup çoğu/tüm kanalda "Sign in to confirm you're not a
bot" veriyordu — proxy IP'den bağımsız bir sinyal, IP dağıtımı bunu
çözemez.

Yeni CookieProfile tablosu: her kanal, DB id'sinden aynı deterministik hash
ile (proxyUrlForChannel'daki gibi) havuzdaki hesaplardan birine sabitlenir.
Her profil kendi ayrı geçici dosyasına yazılıyor (/tmp/yt-cookies-<id>.txt)
— tek paylaşılan dosya, farklı profil kullanan kanallar eşzamanlı
çalışınca birbirinin cookie'sini ezerdi. Hiç profil eklenmemişse eski tekli
ytdlp_cookies ayarına geri düşüyor (geriye dönük uyumlu, hemen kırılmaz).

Ayarlar sayfasında yeni "Cookie Hesapları" kartı: hesap ekle/sil/yenile,
her biri için ayrı bayatlık rozeti. Eski tekli cookie kartı "tekli/eski"
etiketiyle fallback olarak duruyor.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 01:20:36 +03:00
co-authored by Claude Sonnet 5
parent eb2a9d28ed
commit ccd922ba37
5 changed files with 215 additions and 26 deletions
+27
View File
@@ -214,3 +214,30 @@ export async function updateYtdlpCookies(formData: FormData) {
revalidatePath("/settings");
}
export async function addCookieProfile(formData: FormData) {
const label = String(formData.get("label") ?? "").trim();
const value = String(formData.get("value") ?? "").trim();
if (!label || !value) {
throw new Error("Hesap adı ve cookie içeriği zorunlu.");
}
await prisma.cookieProfile.create({ data: { label, value } });
revalidatePath("/settings");
}
export async function updateCookieProfile(profileId: string, formData: FormData) {
const value = String(formData.get("value") ?? "").trim();
if (!value) {
throw new Error("Cookie içeriği boş olamaz.");
}
await prisma.cookieProfile.update({ where: { id: profileId }, data: { value } });
revalidatePath("/settings");
}
export async function deleteCookieProfile(profileId: string) {
await prisma.cookieProfile.delete({ where: { id: profileId } });
revalidatePath("/settings");
}