Created files
This commit is contained in:
commit
3b5621142c
11
backend/Dockerfile
Normal file
11
backend/Dockerfile
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y ffmpeg
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
57
backend/main.py
Normal file
57
backend/main.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
from fastapi import FastAPI, UploadFile, File, Form, HTTPException
|
||||||
|
from fastapi.responses import FileResponse
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
import yaml
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
from utils import parse_yaml_config, get_presets_dir
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
# Allow CORS (frontend access)
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=["*"],
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.post("/upload-config/")
|
||||||
|
async def upload_config(file: UploadFile = File(...)):
|
||||||
|
config_data = yaml.safe_load(await file.read())
|
||||||
|
return {"parsed": config_data}
|
||||||
|
|
||||||
|
@app.post("/transcode/")
|
||||||
|
async def transcode(yaml_config: dict):
|
||||||
|
try:
|
||||||
|
ffmpeg_cmd = parse_yaml_config(yaml_config)
|
||||||
|
subprocess.run(ffmpeg_cmd, check=True)
|
||||||
|
return {"status": "success", "cmd": ffmpeg_cmd}
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
@app.get("/browse/")
|
||||||
|
def browse(path: str = "/data"):
|
||||||
|
if not os.path.exists(path):
|
||||||
|
raise HTTPException(status_code=404, detail="Path not found")
|
||||||
|
entries = [{"name": f, "is_dir": os.path.isdir(os.path.join(path, f))} for f in os.listdir(path)]
|
||||||
|
return {"path": path, "entries": entries}
|
||||||
|
|
||||||
|
@app.post("/save-preset/")
|
||||||
|
def save_preset(name: str = Form(...), file: UploadFile = File(...)):
|
||||||
|
path = get_presets_dir() / f"{name}.yml"
|
||||||
|
with open(path, "wb") as f:
|
||||||
|
f.write(file.file.read())
|
||||||
|
return {"message": "Preset saved"}
|
||||||
|
|
||||||
|
@app.get("/list-presets/")
|
||||||
|
def list_presets():
|
||||||
|
return {"presets": [p.stem for p in get_presets_dir().glob("*.yml")]}
|
||||||
|
|
||||||
|
@app.get("/preset/{name}")
|
||||||
|
def get_preset(name: str):
|
||||||
|
path = get_presets_dir() / f"{name}.yml"
|
||||||
|
if not path.exists():
|
||||||
|
raise HTTPException(status_code=404, detail="Preset not found")
|
||||||
|
return FileResponse(path)
|
||||||
3
backend/requirements.txt
Normal file
3
backend/requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fastapi
|
||||||
|
uvicorn
|
||||||
|
pyyaml
|
||||||
30
backend/utils.py
Normal file
30
backend/utils.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def get_presets_dir() -> Path:
|
||||||
|
Path("./presets").mkdir(exist_ok=True)
|
||||||
|
return Path("./presets")
|
||||||
|
|
||||||
|
def parse_yaml_config(config: dict) -> list:
|
||||||
|
in_file = config.get("input_file")
|
||||||
|
out_file = config.get("output_file")
|
||||||
|
video = config.get("video", {})
|
||||||
|
audio = config.get("audio", {})
|
||||||
|
|
||||||
|
cmd = ["ffmpeg", "-y", "-i", in_file]
|
||||||
|
|
||||||
|
if video:
|
||||||
|
cmd += ["-c:v", video.get("codec", "libx264")]
|
||||||
|
if "bitrate" in video:
|
||||||
|
cmd += ["-b:v", video["bitrate"]]
|
||||||
|
if "preset" in video:
|
||||||
|
cmd += ["-preset", video["preset"]]
|
||||||
|
|
||||||
|
if audio:
|
||||||
|
cmd += ["-c:a", audio.get("codec", "aac")]
|
||||||
|
if "bitrate" in audio:
|
||||||
|
cmd += ["-b:a", audio["bitrate"]]
|
||||||
|
if "channels" in audio:
|
||||||
|
cmd += ["-ac", str(audio["channels"])]
|
||||||
|
|
||||||
|
cmd += [out_file]
|
||||||
|
return cmd
|
||||||
12
docker-compoe.yml
Normal file
12
docker-compoe.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
backend:
|
||||||
|
build: ./backend
|
||||||
|
volumes:
|
||||||
|
- ./data:/data
|
||||||
|
- ./backend/presets:/app/presets
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
|
||||||
|
# (Frontend to be added here)
|
||||||
Loading…
x
Reference in New Issue
Block a user