Фоновые задачи: плейлисты, длинные лекции, вкладка настроек
- таблица 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>
This commit is contained in:
@@ -21,10 +21,15 @@ class ApiClient:
|
||||
def close(self) -> None:
|
||||
self._client.close()
|
||||
|
||||
# --- LLM ---
|
||||
# --- Settings (persisted server-side in Postgres) ---
|
||||
|
||||
def llm_status(self) -> dict:
|
||||
return self._get("/llm/config")
|
||||
def get_settings(self) -> dict:
|
||||
return self._get("/settings/")
|
||||
|
||||
def save_settings(self, values: dict) -> dict:
|
||||
return self._request("PUT", "/settings/", values)
|
||||
|
||||
# --- LLM ---
|
||||
|
||||
def llm_models(self, base_url: str, api_key: str) -> list[dict]:
|
||||
data = self._post(
|
||||
@@ -39,10 +44,21 @@ class ApiClient:
|
||||
{"base_url": base_url, "api_key": api_key, "model": model},
|
||||
)
|
||||
|
||||
# --- Pipeline / videos ---
|
||||
# --- Jobs (видео и плейлисты, в фоне) ---
|
||||
|
||||
def pipeline_process(self, payload: dict) -> dict:
|
||||
return self._post("/pipeline/process", payload)
|
||||
def create_job(self, payload: dict) -> dict:
|
||||
return self._post("/jobs/", payload)
|
||||
|
||||
def list_jobs(self) -> list[dict]:
|
||||
return self._get("/jobs/")
|
||||
|
||||
def cancel_job(self, job_id: str) -> dict:
|
||||
return self._post(f"/jobs/{job_id}/cancel", None)
|
||||
|
||||
def delete_job(self, job_id: str) -> dict:
|
||||
return self._request("DELETE", f"/jobs/{job_id}")
|
||||
|
||||
# --- Videos ---
|
||||
|
||||
def list_videos(
|
||||
self,
|
||||
|
||||
Reference in New Issue
Block a user