This commit is contained in:
SolitaryThinker
2026-06-30 15:06:40 -07:00
parent 31e26abec4
commit 6c04372e17
84 changed files with 48 additions and 48 deletions
+3 -3
View File
@@ -186,13 +186,13 @@ pull_request_rules:
label:
add: ["scope: docs"]
- name: "label scope: ui"
- name: "label scope: studio"
conditions:
- files~=^ui/
- files~=^apps/fastvideo_studio/
- -closed
actions:
label:
add: ["scope: ui"]
add: ["scope: studio"]
- name: "label scope: model"
conditions:
+1 -1
View File
@@ -88,7 +88,7 @@ docs/distillation/examples/
dmd_t2v_output/
preprocess_output_text/
# Next.js / Node artifacts under ui/: see ui/.gitignore
# SvelteKit / Node artifacts under apps/fastvideo_studio/: see apps/fastvideo_studio/.gitignore
# Next.js / Node artifacts under apps/dreamverse/web/
apps/dreamverse/web/node_modules/
@@ -1,4 +1,4 @@
# FastVideo UI
# FastVideo Studio
A lightweight web-based UI for interacting with FastVideo.
@@ -16,7 +16,7 @@ The UI currently supports:
The easiest way to run the application is:
```bash
cd ui
cd apps/fastvideo_studio
npm install
npm run build
npm run start
@@ -33,10 +33,10 @@ The UI is composed of two separate components:
To run each component separately, you can use the commands `npm run start:web` and `npm run start:api`.
You can also run the API server with this command from the root directory:
You can also run the API server with this command from the `apps/` directory:
```bash
python -m ui.server --output-dir /path/to/videos --log-dir /path/to/logs
python -m fastvideo_studio.server --output-dir /path/to/videos --log-dir /path/to/logs
```
Running it this way allows you to pass command line parameters.
+7
View File
@@ -0,0 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
"""Allow ``python -m fastvideo_studio`` to start the server."""
from fastvideo_studio.server import main
if __name__ == "__main__":
main()
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: Apache-2.0
"""
SQLite persistence for FastVideo UI.
SQLite persistence for FastVideo Studio.
Stores jobs and default settings. Uses Python's built-in sqlite3.
"""
@@ -14,7 +14,7 @@ import threading
from pathlib import Path
from typing import Any
logger = logging.getLogger("fastvideo.ui.database")
logger = logging.getLogger("fastvideo.studio.database")
# Default options schema - used for settings table defaults
DEFAULT_SETTINGS: dict[str, Any] = {
@@ -24,14 +24,14 @@ from dataclasses import dataclass, field
from pathlib import Path
from typing import Any
from fastvideo.utils import get_mp_context
from ui.database import Database
from ui.training_config import (
from fastvideo_studio.database import Database
from fastvideo_studio.training_config import (
build_training_args,
get_training_env,
get_training_module_info,
)
logger = logging.getLogger("fastvideo.ui.job_runner")
logger = logging.getLogger("fastvideo.studio.job_runner")
# Regex patterns for parsing tqdm-style progress output.
# Matches e.g. " 40%|████ | 20/50 " or " 20/50 "
+14
View File
@@ -0,0 +1,14 @@
# SPDX-License-Identifier: Apache-2.0
"""Pydantic request/response models for the API."""
from fastvideo_studio.models.create_job_request import CreateJobRequest
from fastvideo_studio.models.settings_update import SettingsUpdate
from fastvideo_studio.models.create_dataset_request import CreateDatasetRequest
from fastvideo_studio.models.update_caption_request import UpdateCaptionRequest
__all__ = [
"CreateJobRequest",
"SettingsUpdate",
"CreateDatasetRequest",
"UpdateCaptionRequest",
]
@@ -1,11 +1,11 @@
{
"name": "fastvideo-ui",
"name": "fastvideo-studio",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "fastvideo-ui",
"name": "fastvideo-studio",
"version": "0.1.0",
"dependencies": {
"@sveltejs/kit": "2.57.1",
@@ -1,5 +1,5 @@
{
"name": "fastvideo-ui",
"name": "fastvideo-studio",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -8,7 +8,7 @@
"build": "vite build",
"preview": "vite preview",
"start": "concurrently --kill-others-on-fail \"npm:start:api\" \"npm:start:web\"",
"start:api": "cd .. && python -m ui.server",
"start:api": "cd .. && python -m fastvideo_studio.server",
"start:web": "node build",
"lint": "eslint ."
},
@@ -13,7 +13,7 @@ import threading
from pathlib import Path
from collections.abc import Callable
logger = logging.getLogger("fastvideo.ui.preprocess_runner")
logger = logging.getLogger("fastvideo.studio.preprocess_runner")
def build_preprocess_args(

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

@@ -8,8 +8,8 @@ video-generation jobs powered by the FastVideo library.
This is the API-only server. Use web_server.py to serve the frontend.
Usage:
python -m ui.api_server # from repo root
python ui/api_server.py --output-dir ./videos # explicit output dir
python -m fastvideo_studio.server # from the apps/ directory
python -m fastvideo_studio.server --output-dir ./videos # explicit output dir
"""
from __future__ import annotations
@@ -31,15 +31,15 @@ from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse
from fastvideo.registry import (get_registered_model_paths, get_registered_models_with_workloads)
from ui.database import Database, _get_db_path
from ui.job_runner import JobRunner, JobStatus
from ui.models import (CreateDatasetRequest, CreateJobRequest, SettingsUpdate, UpdateCaptionRequest)
from fastvideo_studio.database import Database, _get_db_path
from fastvideo_studio.job_runner import JobRunner, JobStatus
from fastvideo_studio.models import (CreateDatasetRequest, CreateJobRequest, SettingsUpdate, UpdateCaptionRequest)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
)
logger = logging.getLogger("fastvideo.ui.api")
logger = logging.getLogger("fastvideo.studio.api")
DEFAULT_OUTPUT_DIR = os.path.join(os.path.dirname(__file__), "..", "outputs", "ui_jobs")
@@ -571,7 +571,7 @@ def _setup_signal_handlers() -> None:
def create_local_env(host: str, port: int) -> None:
"""Check if .env.local exists in the ui directory, and create it if not."""
"""Check if .env.local exists in the fastvideo_studio directory, and create it if not."""
ui_dir = os.path.dirname(__file__)
env_local_path = os.path.join(ui_dir, ".env.local")

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

+1 -1
View File
@@ -210,7 +210,7 @@ Scope labels are inferred from changed files.
| `scope: infra` | `.github/`, `.buildkite/`, `fastvideo/tests/`, `docker/` |
| `scope: distributed` | `fastvideo/distributed/` |
| `scope: docs` | `docs/` |
| `scope: ui` | `ui/` |
| `scope: studio` | `apps/fastvideo_studio/` |
| `scope: model` | `fastvideo/models/`, `fastvideo/layers/`, `fastvideo/configs/models/` |
Process labels:
+1 -1
View File
@@ -220,7 +220,7 @@ follow_imports = "silent"
# ``*/_vendored/*`` matches upstream-provenance files vendored under any
# ``_vendored/`` subdir (project-wide convention; mirrors the
# ``_``-prefixed auto-discovery skip).
skip = "./data,./wandb,ui/package-lock.json,performance_dashboard/frontend/package-lock.json,*/_vendored/*"
skip = "./data,./wandb,apps/fastvideo_studio/package-lock.json,apps/performance_dashboard/frontend/package-lock.json,*/_vendored/*"
# "tread" matches daVinci-MagiHuman's acronym "TReAD" (Token Routing and
# Early Drop). codespell lowercases ignore-words entries, so the single
# lowercase form silences all case variants.
-7
View File
@@ -1,7 +0,0 @@
# SPDX-License-Identifier: Apache-2.0
"""Allow ``python -m ui`` to start the server."""
from ui.server import main
if __name__ == "__main__":
main()
-14
View File
@@ -1,14 +0,0 @@
# SPDX-License-Identifier: Apache-2.0
"""Pydantic request/response models for the API."""
from ui.models.create_job_request import CreateJobRequest
from ui.models.settings_update import SettingsUpdate
from ui.models.create_dataset_request import CreateDatasetRequest
from ui.models.update_caption_request import UpdateCaptionRequest
__all__ = [
"CreateJobRequest",
"SettingsUpdate",
"CreateDatasetRequest",
"UpdateCaptionRequest",
]