From eb2a9d28ed23e308eb6d9e9ec511284a3d10c467 Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Fri, 4 Sep 2026 01:04:57 +0300 Subject: [PATCH] =?UTF-8?q?feat:=209:16=20render'=C4=B1=20iste=C4=9Fe=20ba?= =?UTF-8?q?=C4=9Fl=C4=B1=20yap=20+=20Telegram'a=20video=20g=C3=B6nderip=20?= =?UTF-8?q?sunucudan=20sil=20(Faz=205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- apps/frontend/app/actions.ts | 20 +++++++ apps/frontend/app/channels/[id]/page.tsx | 7 ++- apps/frontend/app/segments/page.tsx | 7 ++- apps/frontend/app/settings/page.tsx | 76 ++++++++++++++++++++---- apps/worker/worker/db.py | 9 +++ apps/worker/worker/stt_scoring.py | 5 +- apps/worker/worker/telegram.py | 37 ++++++++++++ apps/worker/worker/video_render.py | 23 +++++-- 8 files changed, 167 insertions(+), 17 deletions(-) diff --git a/apps/frontend/app/actions.ts b/apps/frontend/app/actions.ts index 779a555..5bcc922 100644 --- a/apps/frontend/app/actions.ts +++ b/apps/frontend/app/actions.ts @@ -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"; diff --git a/apps/frontend/app/channels/[id]/page.tsx b/apps/frontend/app/channels/[id]/page.tsx index 3554b48..b82b7cf 100644 --- a/apps/frontend/app/channels/[id]/page.tsx +++ b/apps/frontend/app/channels/[id]/page.tsx @@ -267,7 +267,7 @@ export default async function ChannelDetailPage({ params }: { params: Promise<{ {c.short && (
9:16: {c.short.status} - {c.short.status === "READY" && ( + {c.short.status === "READY" && c.short.filePath && ( <>