From 67328d04fec71c4986ef866f994d5dd48c3ccb6b Mon Sep 17 00:00:00 2001 From: debpalash Date: Sat, 18 Apr 2026 17:20:19 +0530 Subject: [PATCH] refactor: split backend into api/core/services/schemas, harden security + fd pressure, add searchable language picker, fix segment fragmentation Backend: - Split monolithic main.py into backend/{api/routers,core,schemas,services} - core/db.py: allowlist-gated migrations, db_conn context manager (kills SQL injection on ALTER) - core/tasks.py: lock-guarded listener add/remove/push, snapshot-before-iterate - services/ffmpeg_utils.py: run_ffmpeg helper with concurrency semaphore, EAGAIN retry, guaranteed reap - services/segmentation.py: Bengali/CJK/Arabic punctuation, ultra-short tier, stitch_adjacent_shorts, bounded-loop merge; public clean_up_segments API - services/model_manager.py: robust lock.locked() handling - api/routers/dub_core.py: job_id traversal guard, thread-safe _active_procs, timeouts on ffmpeg/demucs, POST /dub/cleanup-segments endpoint - api/routers/dub_export.py: guarded SSE listener remove, ffmpeg timeouts via run_ffmpeg - api/routers/exports.py: destination_path validation, safe source resolver, subprocess list-form - api/routers/generation.py: contextlib.suppress on tempfile cleanup, db_conn usage, safe output-path helper - api/routers/system.py: try/finally tmp cleanup, subprocess timeouts - schemas/requests.py: TranslateSegment.id int->str to match hex segment IDs - main.py: threading.Lock around crash log writes Frontend: - components/SearchableSelect.jsx: popover combobox with search, keyboard nav, popular+recent pins, 200-item cap - App.jsx: wire SearchableSelect for dub language / ISO code / voice-gen language; Clean Up segments button; fix blob URL leak (object-shaped prev in setter, unmount cleanup via ref) - components/WaveformTimeline.jsx: explicit