diff --git a/src/torrent_downloader/app.py b/src/torrent_downloader/app.py index f2c9efa..8a67916 100644 --- a/src/torrent_downloader/app.py +++ b/src/torrent_downloader/app.py @@ -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}