from typing import Dict, Any, List, Tuple, Optional import os from fastapi import FastAPI, Request, Form, Depends, Cookie, responses, templating, HTTPException from starlette.staticfiles import StaticFiles app = FastAPI() templates = templating.Jinja2Templates(directory="static/templates") app.mount("/static", StaticFiles(directory="static"), name="static") def is_logged_in(logged_in: Optional[str] = Cookie(None)): return bool(logged_in) @app.get("/", response_class=responses.HTMLResponse) def index(request: Request): return templates.TemplateResponse("index.html", {"request": request}) @app.post("/login") async def login(password: str = Form(...)): if password == "password": response = responses.RedirectResponse(url="/logs", status_code=303) response.set_cookie(key="logged_in", value="true") return response return {"message": "Invalid password"} @app.get("/logs", response_class=responses.HTMLResponse) async def logs(request: Request, logged_in: bool = Depends(is_logged_in)): if logged_in: return templates.TemplateResponse("logs.html", {"request": request, "logs": get_logs()}) else: responses.RedirectResponse(url="/login", status_code=303) @app.get("/logs/{log_id}", response_class=responses.HTMLResponse) async def log(request: Request, log_id: int, logged_in: bool = Depends(is_logged_in)): if logged_in: if not get_log(log_id): raise HTTPException(status_code=400) return templates.TemplateResponse("log.html", {"request": request, "log": get_log(log_id)}) else: responses.RedirectResponse(url="/login", status_code=303) def get_logs() -> List[Tuple[int, str]]: return [(int(os.path.basename(dir_path)), dir_path.split("/")[2].strip()) for dir_path, _, filenames in os.walk("static/logs") if dir_path != "static/logs" and len(dir_path.split("/")) == 3] def get_log(log_id: int) -> List[Dict[str, Any]]: log_dir = os.path.join("static/logs", str(log_id)) return_dir = [] for dir_path, _, filenames in os.walk(log_dir): if dir_path != log_dir: audio_file = os.path.join(dir_path, "audio.ogg") if not os.path.exists(audio_file): audio_file = os.path.join(dir_path, "audio.wav") text_file = os.path.join(dir_path, "yandex-text.txt") if not os.path.exists(text_file): text_file = os.path.join(dir_path, "google-text.txt") try: return_dir.append({"id": log_id, "audio_file": f"/{audio_file}", "text": open(text_file).read().split("\n")}) except UnicodeDecodeError: pass return return_dir