feat: Complete Sonarr integration with security enhancements
This commit adds comprehensive Sonarr webhook integration and implements critical security improvements identified in code review. ## Sonarr Integration - Full webhook support for Grab, Download, Rename, Delete, and Test events - HMAC SHA256 signature verification for webhook authentication - Series mapping system (Sonarr TVDB ID → Anime Provider URL) - 11 new API endpoints for configuration, mappings, search, and downloads - Comprehensive test suite (31 tests, all passing) - Complete documentation in docs/SONARR_INTEGRATION.md ## Security Enhancements - CORS restricted to specific origins (user's IP: 192.168.1.204:3000) - Path traversal prevention via sanitize_filename() and is_safe_filename() - Structured logging infrastructure (replaced all print() statements) - Environment-based configuration with .env support - Filename sanitization prevents malicious path attacks ## New Features - Lpayer and Sibnet downloader support - Kitsu API integration for anime metadata - Recommendation engine based on download history - Latest releases endpoint for new anime - Modular web interface with component-based templates ## Configuration - Centralized settings via app/config.py with pydantic-settings - Sonarr config auto-created in config/ directory - Example configurations provided for easy setup ## Tests - 31 Sonarr integration tests (23 functionality + 9 security) - 100+ tests passing in core test files - Security utilities fully tested ## Documentation - Updated CLAUDE.md with Sonarr and testing info - Added IMPROVEMENTS_2024-01-24.md analysis - Added SONARR_IMPLEMENTATION.md technical summary Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
|
||||
## Project Overview
|
||||
|
||||
Ohm Stream Downloader is a FastAPI-based web application for downloading anime episodes and media files from various file hosting services (1fichier, Doodstream, Rapidfile, Uptobox, VidMoly, SendVid, Sibnet, Lpayer) and anime streaming platforms (Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree). It features a modern web interface, parallel downloads, pause/resume support, video streaming, and personalized recommendations.
|
||||
Ohm Stream Downloader is a FastAPI-based web application for downloading anime episodes and media files from various file hosting services (1fichier, Doodstream, Rapidfile, Uptobox, VidMoly, SendVid, Sibnet, Lpayer) and anime streaming platforms (Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree). It features a modern web interface, parallel downloads, pause/resume support, video streaming, personalized recommendations, and Sonarr webhook integration for automated downloads.
|
||||
|
||||
## Development Commands
|
||||
|
||||
@@ -51,7 +51,7 @@ pytest -s
|
||||
Ohm_streaming/
|
||||
├── main.py # FastAPI application & API endpoints
|
||||
├── app/
|
||||
│ ├── models/ # Pydantic models (DownloadTask, AnimeMetadata, etc.)
|
||||
│ ├── models/ # Pydantic models (DownloadTask, AnimeMetadata, Sonarr, etc.)
|
||||
│ ├── downloaders/ # Host-specific downloaders
|
||||
│ │ ├── base.py # BaseDownloader abstract class
|
||||
│ │ ├── unfichier.py # 1fichier.com handler
|
||||
@@ -73,7 +73,10 @@ Ohm_streaming/
|
||||
│ ├── favorites.py # Favorites management system (JSON-based)
|
||||
│ ├── recommendation_engine.py # Analyzes download history for recommendations
|
||||
│ ├── recommendations.py # Fetches latest releases from anime sources
|
||||
│ └── kitsu_api.py # Kitsu API integration for metadata
|
||||
│ ├── kitsu_api.py # Kitsu API integration for metadata
|
||||
│ ├── sonarr_handler.py # Sonarr webhook integration handler
|
||||
│ └── models/
|
||||
│ └── sonarr.py # Sonarr Pydantic models
|
||||
├── downloads/ # Downloaded files storage
|
||||
├── templates/
|
||||
│ ├── index.html # Main web interface
|
||||
@@ -150,6 +153,18 @@ Ohm_streaming/
|
||||
- `POST /api/favorites` - Add favorite
|
||||
- `DELETE /api/favorites/{anime_id}` - Remove favorite
|
||||
|
||||
**Sonarr Integration:**
|
||||
- `POST /api/webhook/sonarr` - Receive Sonarr webhooks
|
||||
- `GET /api/sonarr/config` - Get Sonarr configuration
|
||||
- `PUT /api/sonarr/config` - Update Sonarr configuration
|
||||
- `GET /api/sonarr/mappings` - List Sonarr to anime mappings
|
||||
- `POST /api/sonarr/mappings` - Create/update mapping
|
||||
- `DELETE /api/sonarr/mappings/{series_id}` - Delete mapping
|
||||
- `GET /api/sonarr/search` - Search anime for mapping
|
||||
- `GET /api/sonarr/episodes` - Get episode list
|
||||
- `GET /api/sonarr/suggest` - Suggest anime matches
|
||||
- `POST /api/sonarr/download` - Manually trigger download
|
||||
|
||||
### 5. Web Interface
|
||||
- Single-page app at `/web` (templates/index.html)
|
||||
- Auto-refreshes every second to show progress
|
||||
@@ -165,6 +180,7 @@ Ohm_streaming/
|
||||
- `test_download_manager.py` - DownloadManager tests
|
||||
- `test_favorites.py` - Favorites system tests
|
||||
- `test_api.py` - FastAPI endpoint tests
|
||||
- `test_sonarr.py` - Sonarr integration tests (23 tests, all passing)
|
||||
|
||||
**Fixtures in conftest.py:**
|
||||
- `temp_dir` - Temporary directory
|
||||
@@ -182,6 +198,18 @@ Ohm_streaming/
|
||||
- `slow` - Slow tests - manual
|
||||
- `network` - Requires network - manual
|
||||
|
||||
**Running Single Test:**
|
||||
```bash
|
||||
# Run specific test file
|
||||
pytest tests/test_sonarr.py -v
|
||||
|
||||
# Run specific test class
|
||||
pytest tests/test_sonarr.py::TestSonarrHandler -v
|
||||
|
||||
# Run specific test
|
||||
pytest tests/test_sonarr.py::TestSonarrHandler::test_add_mapping -v
|
||||
```
|
||||
|
||||
## Adding New Host Support
|
||||
|
||||
To add support for a new file hosting service:
|
||||
@@ -214,6 +242,78 @@ class MyHostDownloader(BaseDownloader):
|
||||
|
||||
**Important:** Always close the HTTP client in your downloader to avoid resource leaks.
|
||||
|
||||
## Sonarr Integration
|
||||
|
||||
The application includes full Sonarr webhook support for automated anime downloads.
|
||||
|
||||
### Architecture
|
||||
|
||||
**SonarrHandler (`app/sonarr_handler.py`):**
|
||||
- Processes incoming webhooks from Sonarr
|
||||
- Manages series mappings (Sonarr TVDB ID → Anime Provider URL)
|
||||
- Supports HMAC SHA256 signature verification for security
|
||||
- Auto-triggers downloads on Grab events
|
||||
- Provides search and suggestion APIs for mapping setup
|
||||
|
||||
**Sonarr Models (`app/models/sonarr.py`):**
|
||||
- `SonarrWebhookPayload` - Complete webhook payload schema
|
||||
- `SonarrEventType` - Enum for event types (Grab, Download, Rename, Delete, Test)
|
||||
- `SonarrMapping` - Mapping between Sonarr series and anime providers
|
||||
- `SonarrConfig` - Webhook configuration (enabled, secret, auto-download, etc.)
|
||||
|
||||
### Workflow
|
||||
|
||||
1. **Setup in Sonarr:**
|
||||
- Configure webhook: Settings > Connect > Sonarr > Webhook
|
||||
- URL: `http://your-server:3000/api/webhook/sonarr`
|
||||
- Enable "Grab" event
|
||||
|
||||
2. **Create Mappings:**
|
||||
- Get Sonarr series TVDB ID from series details
|
||||
- Search anime: `GET /api/sonarr/search?q={title}`
|
||||
- Create mapping: `POST /api/sonarr/mappings`
|
||||
|
||||
3. **Automatic Download:**
|
||||
- Sonarr grabs new episode → Sends webhook
|
||||
- Ohm Stream Downloader receives webhook
|
||||
- Looks up mapping by TVDB ID
|
||||
- Finds matching episode on anime provider
|
||||
- Creates and starts download task
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- `config/sonarr.json` - Webhook configuration
|
||||
- `config/sonarr_mappings.json` - Series mappings
|
||||
|
||||
### Example Mapping
|
||||
|
||||
```json
|
||||
{
|
||||
"sonarr_series_id": 79644,
|
||||
"sonarr_title": "Naruto Shippuden",
|
||||
"anime_provider": "anime-sama",
|
||||
"anime_url": "https://anime-sama.si/catalogue/naruto-shippuden/saison1/vostfr/",
|
||||
"anime_title": "Naruto Shippuden",
|
||||
"lang": "vostfr",
|
||||
"quality_preference": "1080p",
|
||||
"auto_download": true
|
||||
}
|
||||
```
|
||||
|
||||
### Security
|
||||
|
||||
- Optional HMAC SHA256 signature verification
|
||||
- Configure secret in both Sonarr and Ohm Stream Downloader
|
||||
- Enable with `verify_hmac: true` in config
|
||||
|
||||
### Testing
|
||||
|
||||
- Test endpoint: `POST /api/webhook/test/sonarr`
|
||||
- Manual trigger: `POST /api/sonarr/download`
|
||||
- Get suggestions: `GET /api/sonarr/suggest?sonarr_title={title}`
|
||||
|
||||
**Documentation:** See `docs/SONARR_INTEGRATION.md` for complete setup guide.
|
||||
|
||||
## Adding New Anime Provider
|
||||
|
||||
To add a new anime streaming provider:
|
||||
@@ -236,6 +336,18 @@ Edit `main.py` to configure:
|
||||
- `max_parallel` - Maximum concurrent downloads (default: 3)
|
||||
- `download_dir` - Storage location (default: "downloads")
|
||||
|
||||
**Configuration Files:**
|
||||
- `config/sonarr.json` - Sonarr webhook configuration (created automatically)
|
||||
- `config/sonarr_mappings.json` - Sonarr to anime provider mappings (created automatically)
|
||||
- `config/.gitkeep` - Ensures config directory is tracked in git
|
||||
- Example files: `config/sonarr.example.json`, `config/sonarr_mappings.example.json`
|
||||
|
||||
**Documentation:**
|
||||
- `README.md` - User-facing features and roadmap
|
||||
- `CLAUDE.md` - This file (developer guide)
|
||||
- `docs/SONARR_INTEGRATION.md` - Complete Sonarr setup guide
|
||||
- `docs/SONARR_IMPLEMENTATION.md` - Technical implementation summary
|
||||
|
||||
## Key Implementation Details
|
||||
|
||||
**Resume Support:**
|
||||
|
||||
Reference in New Issue
Block a user