feat: add FastAPI app with file listing endpoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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")
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from fastapi import APIRouter
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
@@ -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")
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from fastapi import APIRouter
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from fastapi import APIRouter
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from fastapi import APIRouter
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
Reference in New Issue
Block a user