Files
ohm_streaming/app/downloaders/AGENTS.md
T
root 3dc5dd8fe9
CI / Test (Python 3.11) (push) Has been cancelled
CI / Test (Python 3.12) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Type Check (push) Has been cancelled
CI / Summary (push) Has been cancelled
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
2026-03-28 00:14:31 +00:00

2.5 KiB

Downloaders (app/downloaders/)

OVERVIEW

3-tier scraper architecture: anime catalogs → series catalogs → video players. Factory pattern routes URLs through each tier.

STRUCTURE

downloaders/
├── __init__.py          # get_downloader(url) — 3-tier factory + GenericDownloader
├── base.py              # Legacy BaseDownloader (kept for compat)
├── anime_sites/         # Anime streaming catalogs (see anime_sites/AGENTS.md)
│   ├── __init__.py      # get_anime_site(url) factory
│   ├── base.py          # BaseAnimeSite abstract class
│   └── *.py             # 5 anime providers
├── series_sites/        # TV series catalogs (see series_sites/AGENTS.md)
│   ├── __init__.py      # get_series_site(url) factory
│   ├── base.py          # BaseSeriesSite abstract class
│   └── fs7.py           # 1 series provider
└── video_players/       # File hosting extractors (see video_players/AGENTS.md)
    ├── __init__.py      # get_video_player(url) factory
    ├── base.py          # BaseVideoPlayer abstract class
    └── *.py             # 13 video player handlers

WHERE TO LOOK

Need File Notes
Route URL to downloader __init__.py:32 get_downloader(url) tries anime→series→video→generic
Add anime provider anime_sites/ Inherit BaseAnimeSite, register in anime_sites/__init__.py
Add series provider series_sites/ Inherit BaseSeriesSite, register in series_sites/__init__.py
Add video player video_players/ Inherit BaseVideoPlayer, register in video_players/__init__.py
Provider domains/icons app/providers.py Separate from downloader code

CONVENTIONS

URL pipe format: video_url|anime_page_url|episode_title — metadata preserved through tiers. Anime/series sites return player URLs (not direct downloads). Video players extract final download links.

Factory chain: get_downloader()get_anime_site()get_series_site()get_video_player()GenericDownloader.

New provider checklist: 1) Create .py inheriting base class, 2) Implement required methods, 3) Add to __init__.py factory list, 4) Add to app/providers.py.

ANTI-PATTERNS

  • Do NOT return None from get_download_link() — raise Exception
  • Do NOT use sync requests — always httpx.AsyncClient
  • Do NOT forget await self.close() — causes resource leaks
  • Do NOT skip sanitize_filename() on extracted filenames
  • Do NOT hardcode User-Agent per player — use base class headers