- таблица jobs + очередь с воркером: POST /jobs сразу отвечает, элементы
плейлиста обрабатываются последовательно, есть отмена и живой прогресс
(скачивание %, минуты распознанного Vosk-аудио)
- expand_url: плейлист раскрывается в список видео
- keep_video=false теперь качает только аудио (для 4-5ч лекций)
- настройки (LLM-ключ, модель, длина выжимки, хранение видео, путь Vosk)
хранятся в Postgres: переживают перезапуск и перезагрузку страницы
- длина выжимки прокидывается в LLM-промпт ({n} предложений)
- UI: вкладки «Главная»/«Настройки», карточка задач с автообновлением
каждые 3 сек, прогресс-бар, отмена, библиотека обновляется по мере
готовности элементов
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
38 lines
970 B
Python
38 lines
970 B
Python
import asyncio
|
|
import logging
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from api.db.connection import wait_for_postgres, init_db
|
|
from api.db.job import mark_interrupted
|
|
from api.lib import jobqueue
|
|
from api.route import app_settings, default, jobs, llm, pipeline, sections, videos
|
|
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
|
|
)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
await wait_for_postgres()
|
|
await init_db()
|
|
await mark_interrupted()
|
|
worker_task = asyncio.create_task(jobqueue.worker())
|
|
yield
|
|
worker_task.cancel()
|
|
|
|
|
|
app = FastAPI(title="LLM-infa API", version="0.4.0", lifespan=lifespan)
|
|
|
|
app.include_router(default.router)
|
|
app.include_router(pipeline.router)
|
|
app.include_router(jobs.router)
|
|
app.include_router(videos.router)
|
|
app.include_router(sections.router)
|
|
app.include_router(app_settings.router)
|
|
app.include_router(llm.router)
|