|
|
import os, uuid, asyncio |
|
|
from pathlib import Path |
|
|
from fastapi import FastAPI, UploadFile, File, HTTPException |
|
|
from fastapi.responses import HTMLResponse |
|
|
from fastapi.templating import Jinja2Templates |
|
|
from fastapi.requests import Request |
|
|
from huggingface_hub import CommitScheduler |
|
|
|
|
|
UPLOAD_DIR = Path("/tmp/uploadedfiles") |
|
|
UPLOAD_DIR.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
|
|
|
HF_TOKEN = os.environ.get("HF_TOKEN") |
|
|
BACKUP_REPO = "triflix/database" |
|
|
|
|
|
|
|
|
scheduler = CommitScheduler( |
|
|
repo_id = BACKUP_REPO, |
|
|
repo_type = "dataset", |
|
|
folder_path = UPLOAD_DIR, |
|
|
path_in_repo = "data", |
|
|
every = 60*24*365, |
|
|
token = HF_TOKEN, |
|
|
) |
|
|
|
|
|
app = FastAPI(title="Triflix Realtime Backup") |
|
|
templates = Jinja2Templates(directory="templates") |
|
|
|
|
|
@app.on_event("shutdown") |
|
|
def _stop_scheduler(): |
|
|
scheduler.stop() |
|
|
|
|
|
@app.get("/", response_class=HTMLResponse) |
|
|
def home(request: Request): |
|
|
return templates.TemplateResponse("index.html", {"request": request}) |
|
|
|
|
|
@app.post("/upload") |
|
|
async def upload(file: UploadFile = File(...)): |
|
|
try: |
|
|
dest = UPLOAD_DIR / f"{uuid.uuid4()}_{file.filename}" |
|
|
content = await file.read() |
|
|
with dest.open("wb") as out: |
|
|
out.write(content) |
|
|
|
|
|
|
|
|
await asyncio.to_thread(scheduler.trigger) |
|
|
|
|
|
except Exception as e: |
|
|
raise HTTPException(500, f"Failed to store or push file: {e}") |
|
|
|
|
|
return {"status": "stored & pushed", "path": str(dest)} |
|
|
|