diff --git a/server/app.py b/server/app.py new file mode 100644 index 0000000..5c55183 --- /dev/null +++ b/server/app.py @@ -0,0 +1,11 @@ +from fastapi import FastAPI + +from .routes import files, stream, markers, export, hidden + +app = FastAPI(title="8-cut Server") + +app.include_router(files.router, prefix="/api") +app.include_router(stream.router, prefix="/api") +app.include_router(markers.router, prefix="/api") +app.include_router(export.router, prefix="/api") +app.include_router(hidden.router, prefix="/api") diff --git a/server/routes/__init__.py b/server/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/routes/export.py b/server/routes/export.py new file mode 100644 index 0000000..af9233c --- /dev/null +++ b/server/routes/export.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router = APIRouter() diff --git a/server/routes/files.py b/server/routes/files.py new file mode 100644 index 0000000..0ec9a36 --- /dev/null +++ b/server/routes/files.py @@ -0,0 +1,48 @@ +import os + +from fastapi import APIRouter, Query +from fastapi.responses import FileResponse + +from ..config import MEDIA_DIRS, VIDEO_EXTENSIONS + +router = APIRouter() + + +def _scan_videos(root: str) -> list[dict]: + results = [] + for dirpath, _, filenames in os.walk(root): + for f in sorted(filenames): + if os.path.splitext(f)[1].lower() in VIDEO_EXTENSIONS: + full = os.path.join(dirpath, f) + rel = os.path.relpath(full, root) + results.append({ + "name": f, + "path": rel, + "root": root, + "size": os.path.getsize(full), + }) + return results + + +@router.get("/files") +def list_files(root: str | None = Query(None)): + dirs = [root] if root and root in MEDIA_DIRS else MEDIA_DIRS + files = [] + for d in dirs: + files.extend(_scan_videos(d)) + return files + + +@router.get("/roots") +def list_roots(): + return MEDIA_DIRS + + +@router.get("/video/{path:path}") +def serve_video(path: str, root: str = Query(...)): + if root not in MEDIA_DIRS: + return {"error": "invalid root"} + full = os.path.join(root, path) + if not os.path.isfile(full): + return {"error": "not found"} + return FileResponse(full, media_type="video/mp4") diff --git a/server/routes/hidden.py b/server/routes/hidden.py new file mode 100644 index 0000000..af9233c --- /dev/null +++ b/server/routes/hidden.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router = APIRouter() diff --git a/server/routes/markers.py b/server/routes/markers.py new file mode 100644 index 0000000..af9233c --- /dev/null +++ b/server/routes/markers.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router = APIRouter() diff --git a/server/routes/stream.py b/server/routes/stream.py new file mode 100644 index 0000000..af9233c --- /dev/null +++ b/server/routes/stream.py @@ -0,0 +1,3 @@ +from fastapi import APIRouter + +router = APIRouter()