feat: fix auth, provider health checks, search, and redesign UI
- Fix register/login: dict-style access on UserTable ORM objects - Fix HTMX auth: inject JWT token in all HTMX request headers - Fix FS7 search: use DLE AJAX endpoint /engine/ajax/search.php - Fix ZT search: use ?p=series&search=QUERY (not DLE format) - Fix provider health: load hardcoded providers + domain manager - Add self.id to all anime/series providers - Redesign homepage: Netflix-style horizontal scroll cards (.hc) - Redesign search results: grouped by title, poster + synopsis + 3 buttons - Add Télécharger dropdown: season download + episode picker - Fix navbar CSS: restore .tabs flex layout, remove orphan rules - Fix HTMX spinner: remove inline display:none, use CSS indicator - Add AGENTS.md files across project for developer documentation
This commit is contained in:
@@ -1,16 +1,26 @@
|
||||
# Video Players (app/downloaders/video_players)
|
||||
# Video Players (app/downloaders/video_players/)
|
||||
|
||||
## OVERVIEW
|
||||
File hosting extractors that extract direct download links from video player pages (Doodstream, Sibnet, VidMoly, etc.).
|
||||
File hosting extractors that extract direct download links from video player pages (Doodstream, Sibnet, VidMoly, Uptobox, etc.).
|
||||
|
||||
## WHERE TO LOOK
|
||||
|
||||
| Need | File |
|
||||
|------|------|
|
||||
| Base class | `base.py` - `BaseVideoPlayer` abstract class |
|
||||
| Add new player | Create new `.py` file, inherit `BaseVideoPlayer`, add to `__init__.py` |
|
||||
| URL detection logic | Each player's `can_handle()` method |
|
||||
| Extract download link | Each player's `get_download_link()` method |
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `base.py` | `BaseVideoPlayer` abstract class |
|
||||
| `unfichier.py` | 1fichier.com |
|
||||
| `doodstream.py` | Doodstream |
|
||||
| `vidmoly.py` | VidMoly (requires Playwright for extraction) |
|
||||
| `uptobox.py` | Uptobox |
|
||||
| `sendvid.py` | SendVid |
|
||||
| `sibnet.py` | Sibnet |
|
||||
| `rapidfile.py` | Rapidfile |
|
||||
| `uqload.py` | Uqload |
|
||||
| `lpayer.py` | Lplayer |
|
||||
| `vidzy.py` | Vidzy |
|
||||
| `luluv.py` | LuLuvid |
|
||||
| `smoothpre.py` | Smoothpre |
|
||||
| `oneupload.py` | OneUpload |
|
||||
|
||||
## CONVENTIONS
|
||||
|
||||
@@ -22,16 +32,17 @@ def can_handle(self, url: str) -> bool: ...
|
||||
async def get_download_link(self, url: str, target_filename: str = None) -> tuple[str, str]: ...
|
||||
```
|
||||
|
||||
**File operation**: Always use `sanitize_filename()` on extracted filenames.
|
||||
|
||||
**HTTP client**: Use `self.client` (AsyncClient from base class). Always close via `await self.close()` when done.
|
||||
|
||||
**Return format**: `(download_url, filename)` tuple.
|
||||
|
||||
**HTTP client**: Use `self.client` (AsyncClient from base class). Always close via `await self.close()`.
|
||||
|
||||
**File operation**: Always `sanitize_filename()` on extracted filenames.
|
||||
|
||||
## ANTI-PATTERNS
|
||||
|
||||
- Do NOT hardcode User-Agent in each player (use base class headers)
|
||||
- Do NOT forget to call `await self.close()` after extraction
|
||||
- Do NOT return None for missing URLs, raise an exception
|
||||
- Do NOT use sync `requests`, use async `httpx`
|
||||
- Do NOT skip the `target_filename` parameter, even if unused
|
||||
- Do NOT hardcode User-Agent per player — use base class headers
|
||||
- Do NOT forget `await self.close()` — resource leak
|
||||
- Do NOT return None for missing URLs — raise an exception
|
||||
- Do NOT use sync `requests` — use async `httpx`
|
||||
- Do NOT skip `target_filename` parameter — required for anime/series site compatibility
|
||||
- 8 empty `except:` blocks across players — known tech debt
|
||||
|
||||
Reference in New Issue
Block a user