# GEMINI.md - Project Context & Instructions

This file provides foundational context and instructions for AI agents working on the **Ohm Stream Downloader** project.

## 🚀 Project Overview

**Ohm Stream Downloader** is a full-stack web application designed for searching, streaming, and downloading anime and TV series from various French and international providers. It features a modern SPA-like interface, automated watchlist tracking, and integration with ecosystem tools like Sonarr.

-   **Backend:** Python 3.11+ with **FastAPI**, Uvicorn, Pydantic (v2), and APScheduler.
-   **Frontend:** Vanilla JavaScript (modular), Jinja2 templates, and CSS.
-   **Testing:** Pytest (backend), Vitest & Playwright (frontend).
-   **Architecture:** Modular routers and a specialized three-tier downloader system.

---

## 🛠️ Quick Start

### Installation
```bash
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
npm install  # For frontend tests
```

### Running the Application
```bash
# Start development server (Port 3000)
uvicorn main:app --reload --host 0.0.0.0 --port 3000
```
Access the web interface at `http://localhost:3000/web`.

### Running Tests
```bash
# Backend (Pytest)
pytest                          # Run all tests
pytest -m "unit"                # Fast unit tests
pytest -m "integration"         # API integration tests

# Frontend (Vitest)
npm test                        # Run JS tests
npx playwright test             # E2E tests
```

---

## 🏗️ Architecture & Core Logic

### Three-Tier Downloader System
Logic is separated into three distinct layers in `app/downloaders/`:
1.  **Anime/Series Catalogs** (`anime_sites/`, `series_sites/`): Handles searching, metadata extraction (synopsis, posters), and episode listing (e.g., Anime-Sama, FS7).
2.  **Video Players** (`video_players/`): Extracts direct download links from embedded players (e.g., VidMoly, DoodStream, 1fichier).
3.  **Download Manager** (`app/download_manager.py`): Orchestrates the actual file transfer, supporting parallel downloads, pause/resume (via HTTP Range), and progress tracking.

### Key Modules
-   `app/routers/`: Modular API endpoints (Auth, Anime, Watchlist, Sonarr, etc.).
-   `app/watchlist.py`: User-specific tracking and automated episode detection.
-   `app/sonarr_handler.py`: Webhook integration for Sonarr.
-   `static/js/`: Feature-scoped frontend logic (api.js, auth.js, watchlist-ui.js, etc.).

---

## 📝 Development Conventions

### Coding Style (Python)
-   **Formatting:** PEP 8, 120 chars max line length.
-   **Typing:** Use explicit Pydantic models and type hints (`Optional[X]`, `list[X]`).
-   **Async:** Always use `async/await` for I/O (httpx, aiofiles).
-   **Naming:** `snake_case` for functions/variables, `PascalCase` for classes/enums.

### Security & Safety
-   **Filename Sanitization:** ALWAYS use `app.utils.sanitize_filename()` before any disk write.
-   **Path Validation:** Use `app.utils.is_safe_filename()` to prevent traversal attacks.
-   **Authentication:** JWT-based. `JWT_SECRET_KEY` must be at least 32 chars and never the default.
-   **Secrets:** Never hardcode. Use `.env` (via `app/config.py`).

### Testing Requirements
-   All new features **must** include tests in `tests/`.
-   Use pytest markers: `@pytest.mark.unit`, `@pytest.mark.integration`, `@pytest.mark.network`.
-   Verify changes with `pytest --cov=app` to ensure coverage.

---

## ⚙️ Configuration

-   **Environment:** `.env` file (see `.env.example`).
-   **JSON Storage:** Data persists in `config/` (users, watchlist, sonarr mappings).
-   **Downloads:** Default directory is `downloads/`.

## 📂 Key File Map
| Path | Purpose |
| :--- | :--- |
| `main.py` | App entry & middleware |
| `app/models/` | Pydantic schemas |
| `app/routers/` | API Route definitions |
| `app/downloaders/` | Provider-specific scraping logic |
| `templates/` | HTML (Jinja2) |
| `static/js/` | Frontend logic |
| `config/` | Persistent JSON data |

---
*For detailed developer guides, refer to `CLAUDE.md` and `AGENTS.md`.*
