Рабочий пайплайн: YouTube -> транскрипция -> выжимка -> Postgres

- новый api/: /pipeline/process (yt-dlp, субтитры или Vosk, LLM/экстрактивная
  суммаризация), /videos, /llm; старый код перенесён в api_legacy/
- web/: Flet UI (flet 0.28.3 + flet-web, порт 8550)
- Dockerfile.api: ffmpeg слоем из mwader/static-ffmpeg, pip с кэш-маунтом
- requirements/pyproject: убраны moviepy, imageio-ffmpeg, битый asyncio
- README с инструкцией запуска и загрузкой Vosk-модели

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-07-14 11:12:46 +05:00
parent 564c9c2d2f
commit 2697e01714
51 changed files with 2313 additions and 284 deletions

45
web/main.py Normal file
View File

@@ -0,0 +1,45 @@
import flet as ft
from web.api_client import ApiClient
from web.config import PORT
import web.designer as d
from web.views.main_view import MainView
def main(page: ft.Page) -> None:
page.title = "LLM-infa"
page.theme_mode = ft.ThemeMode.DARK
page.bgcolor = d.BG
page.padding = 0
page.scroll = ft.ScrollMode.HIDDEN
page.window.width = 1100
page.fonts = {}
client = ApiClient()
view = MainView(page, client)
page.add(view.build())
# probe env-configured LLM and initial library load
try:
status = client.llm_status()
if status.get("configured"):
view._set_status(ok=True)
if status.get("base_url") and not view.base_url.value:
view.base_url.value = status["base_url"]
if status.get("model") and not view.selected_model:
view.selected_model = status["model"]
view.model_input.value = status["model"]
except Exception:
pass
view._refresh_library()
page.update()
if __name__ == "__main__":
ft.app(
target=main,
view=ft.AppView.WEB_BROWSER,
port=PORT,
host="0.0.0.0",
)