feat: 9:16 render'ı isteğe bağlı yap + Telegram'a video gönderip sunucudan sil (Faz 5)

- auto_render_enabled (varsayılan açık): kapatılınca transkript sonrası
  otomatik render tetiklenmez, aday TRANSCRIBED'de bekler — panelin zaten
  var olan "9:16 Render Et" butonuyla elle tetiklenebilir.
- delete_after_telegram_send (varsayılan KAPALI — geri alınamaz bir
  davranış, bilinçli açılmalı): açıksa render biten video Telegram'a
  gerçek dosya olarak gönderilir (yeni send_telegram_video, sendVideo
  multipart upload, ~50MB bot-upload limiti önceden kontrol ediliyor);
  gönderim başarılıysa dosya diskten silinip ShortVideo.file_path NULL'a
  çekiliyor (DB kaydı/transkript kalıcı kalıyor), başarısızsa dosya
  sunucuda kalıp düz metin bildirimi gidiyor. Kanal sayısı arttıkça VPS
  disk doluluğunu önlemek için.
- Panel: READY + file_path=null durumunda video/indir yerine "Telegram'a
  gönderildi, sunucuda saklanmıyor" notu (channels/[id], segments).

Şema değişikliği yok — ShortVideo.filePath zaten nullable.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 01:04:57 +03:00
co-authored by Claude Sonnet 5
parent 63443f3392
commit eb2a9d28ed
8 changed files with 167 additions and 17 deletions
+20
View File
@@ -155,6 +155,26 @@ export async function updateSttEnabled(formData: FormData) {
revalidatePath("/settings");
}
export async function updateAutoRenderEnabled(formData: FormData) {
const enabled = formData.get("autoRenderEnabled") === "true";
await prisma.appSetting.upsert({
where: { key: "auto_render_enabled" },
create: { key: "auto_render_enabled", value: String(enabled) },
update: { value: String(enabled) },
});
revalidatePath("/settings");
}
export async function updateDeleteAfterTelegramSend(formData: FormData) {
const enabled = formData.get("deleteAfterTelegramSend") === "true";
await prisma.appSetting.upsert({
where: { key: "delete_after_telegram_send" },
create: { key: "delete_after_telegram_send", value: String(enabled) },
update: { value: String(enabled) },
});
revalidatePath("/settings");
}
export async function updateNotificationPrefs(formData: FormData) {
const streamStart = formData.get("notifyStreamStart") === "true";
const renderDone = formData.get("notifyRenderDone") === "true";