File size: 2,357 Bytes
ec17af3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python3
from __future__ import annotations

import os
import platform
import sys
from pathlib import Path


APP_NAME = os.environ.get("DESKTOP_APP_NAME", "Speech-Machine")
DEFAULT_HOST = os.environ.get("DESKTOP_API_HOST", "127.0.0.1")
DEFAULT_PORT = int(os.environ.get("DESKTOP_API_PORT", "18000"))
REPO_ROOT = Path(__file__).resolve().parents[2]
API_SRC = REPO_ROOT / "apps" / "api" / "src"


def resolve_app_data_dir() -> Path:
    system = platform.system()
    home = Path.home()
    if system == "Darwin":
        return home / "Library" / "Application Support" / APP_NAME
    if system == "Windows":
        appdata = os.environ.get("APPDATA")
        if appdata:
            return Path(appdata) / APP_NAME
        return home / "AppData" / "Roaming" / APP_NAME

    xdg_data_home = os.environ.get("XDG_DATA_HOME")
    if xdg_data_home:
        return Path(xdg_data_home) / APP_NAME.lower().replace(" ", "-")
    return home / ".local" / "share" / APP_NAME.lower().replace(" ", "-")


def configure_env(base_dir: Path) -> None:
    storage_dir = base_dir / "storage"
    db_dir = base_dir / "data"
    models_dir = base_dir / "models"
    db_dir.mkdir(parents=True, exist_ok=True)
    storage_dir.mkdir(parents=True, exist_ok=True)
    models_dir.mkdir(parents=True, exist_ok=True)

    database_path = db_dir / "video_coach.db"
    os.environ.setdefault("DATABASE_URL", f"sqlite:///{database_path}")
    os.environ.setdefault("STORAGE_DIR", str(storage_dir))
    os.environ.setdefault("LOCAL_ONLY_MODE", "true")
    os.environ.setdefault("LOCAL_ADMIN_EMAIL", "admin")
    os.environ.setdefault("LOCAL_ADMIN_PASSWORD", "admin")
    os.environ.setdefault("JWT_SECRET", "desktop-local-secret")
    os.environ.setdefault("TRANSCRIPTION_BACKEND", "server")
    os.environ.setdefault("WHISPER_MODEL", "small")
    os.environ.setdefault("WHISPER_DEVICE", "cpu")
    os.environ.setdefault("MLX_AUDIO_MODEL", "mlx-community/parakeet-tdt-0.6b-v3")


def main() -> None:
    base_dir = resolve_app_data_dir()
    base_dir.mkdir(parents=True, exist_ok=True)
    configure_env(base_dir)

    if str(API_SRC) not in sys.path:
        sys.path.insert(0, str(API_SRC))

    from app.main import app  # noqa: WPS433
    import uvicorn  # noqa: WPS433

    uvicorn.run(app, host=DEFAULT_HOST, port=DEFAULT_PORT)


if __name__ == "__main__":
    main()