- server/users.py replaces credentials.py: users.json (0600), PBKDF2, one-time migration of the legacy single password to user admin (history.json -> history/admin.json) - accounts are CLI-managed only: python -m server.users add|rm|list (no self-signup on an internet-exposed app); /signup route removed, login page back to username + password - per-user 30-day signed session cookie (payload carries the username), per-user lockout, GET /api/me, POST /account/delete - per-user watch history: server/data/history/<user>.json; ANIWEB_DATA env override for the data dir - header chip: logged-in user, logout, delete account - tests/: throwaway-server suite (port 8399, temp data dir) — 9 HTTP tests + 2 Playwright browser tests (login UI, real video playback behind auth); runs via python tests/run.py
24 lines
862 B
HTML
24 lines
862 B
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>ani-web</title>
|
|
<link rel="stylesheet" href="style.css">
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<a class="logo" href="/" onclick="location.replace('/');return false">ani-web</a>
|
|
<form onsubmit="const q=document.getElementById('q').value.trim(); if(q) location='?q='+encodeURIComponent(q); return false">
|
|
<input id="q" placeholder="search anime…" autocomplete="off">
|
|
</form>
|
|
<span id="me" class="muted"></span>
|
|
<button id="logout" class="tiny" style="display:none">logout</button>
|
|
<button id="delacct" class="tiny danger" style="display:none">delete</button>
|
|
</header>
|
|
<main id="main"><p class="muted">Search for an anime to get started.</p></main>
|
|
<script src="hls.min.js"></script>
|
|
<script src="app.js"></script>
|
|
</body>
|
|
</html>
|