- upstream.py: Cloudflare-proof fetchers (curl_cffi), self-checking
- app.py: /api/* routes + /stream/{token} HLS proxy (CDN has no CORS)
- static/: search -> detail/seasons/episodes -> hls.js player, history
- verified end-to-end: search chainsaw man -> ep1 dub 1080p segment
21 lines
720 B
HTML
21 lines
720 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>
|
|
</header>
|
|
<main id="main"><p class="muted">Search for an anime to get started.</p></main>
|
|
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/hls.min.js"></script>
|
|
<script src="app.js"></script>
|
|
</body>
|
|
</html>
|