render whole pages on refresh and partial on hx rq

This commit is contained in:
Vladan Popovic 2024-09-18 01:55:27 +02:00
parent 464683e9ce
commit eff7bfa843
1 changed files with 34 additions and 4 deletions

View File

@ -1,12 +1,16 @@
import functools
import urllib.parse
import transmission_rpc
from fastapi import Depends, FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from torrent_downloader.client import TorrentDownloader
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
@ -18,12 +22,36 @@ def get_active_torrents(downloader=get_downloader()) -> list[transmission_rpc.To
return [t for t in downloader.get_active_torrents() if t.format_eta() != "not available"]
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
return templates.TemplateResponse(request=request, name="index.html")
def hx(func):
@functools.wraps(func)
async def hx_or_http(request: Request, *args, **kwargs):
response = await func(request, *args, **kwargs)
if "HX-Request" not in request.headers:
response = templates.TemplateResponse(
request,
name="index.html",
context={"include_template": response.template.name},
status_code=200,
)
return response
return hx_or_http
@app.get("/")
async def index(_: Request):
return RedirectResponse("/search")
@app.get("/search", response_class=HTMLResponse)
@hx
async def search_for_torrents(request: Request):
return templates.TemplateResponse(request=request, name="search.html")
@app.get("/list", response_class=HTMLResponse)
@hx
async def list_torrents(request: Request, query: str, downloader=Depends(get_downloader)):
torrents = downloader.search(query)
return templates.TemplateResponse(
@ -32,6 +60,7 @@ async def list_torrents(request: Request, query: str, downloader=Depends(get_dow
@app.get("/download", response_class=HTMLResponse)
@hx
async def download(request: Request, downloader=Depends(get_downloader)):
magnet = urllib.parse.unquote(str(request.query_params))
downloader.download_magnet(magnet)
@ -42,6 +71,7 @@ async def download(request: Request, downloader=Depends(get_downloader)):
@app.get("/active", response_class=HTMLResponse)
@hx
async def active(request: Request, active=Depends(get_active_torrents)):
return templates.TemplateResponse(
request=request, name="active_torrents.html", context={"torrents": active}