72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
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": "Неправильный пароль"}
|
|
|
|
|
|
@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:
|
|
return responses.RedirectResponse(url="/", 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
|