1fe7392063
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>
64 lines
2.6 KiB
HTML
64 lines
2.6 KiB
HTML
<!-- Downloads Section with Filters -->
|
|
<div class="section-header">
|
|
<h2>Téléchargements</h2>
|
|
<div class="downloads-stats" id="downloadsStats"></div>
|
|
</div>
|
|
|
|
<!-- Filters and Controls -->
|
|
<div class="downloads-controls">
|
|
<div class="filter-group">
|
|
<label>Statut:</label>
|
|
<select id="statusFilter" onchange="filterDownloads()">
|
|
<option value="all">Tous</option>
|
|
<option value="downloading">En cours</option>
|
|
<option value="paused">En pause</option>
|
|
<option value="completed">Terminés</option>
|
|
<option value="cancelled">Annulés</option>
|
|
<option value="failed">Échoués</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="filter-group">
|
|
<label>Tri par:</label>
|
|
<select id="sortBy" onchange="filterDownloads()">
|
|
<option value="date">Date (récent)</option>
|
|
<option value="date_asc">Date (ancien)</option>
|
|
<option value="name">Nom (A-Z)</option>
|
|
<option value="name_desc">Nom (Z-A)</option>
|
|
<option value="size">Taille</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="filter-group">
|
|
<label>Regroupement:</label>
|
|
<select id="groupBy" onchange="filterDownloads()">
|
|
<option value="none">Aucun</option>
|
|
<option value="series">Par série</option>
|
|
<option value="status">Par statut</option>
|
|
<option value="day">Par jour</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="filter-group search-group">
|
|
<input type="text" id="searchDownloads" placeholder="🔍 Rechercher..." oninput="filterDownloads()">
|
|
</div>
|
|
|
|
<div class="actions-group">
|
|
<button class="btn-small btn-secondary" onclick="clearCompleted()" title="Supprimer annulés, échoués et terminés">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" style="width:14px;height:14px;">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path>
|
|
</svg>
|
|
Nettoyer
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="downloadsList" class="downloads-list">
|
|
<div class="empty-state">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M9 19l3 3m0 0l3-3m-3 3V10"></path>
|
|
</svg>
|
|
<p>Aucun téléchargement pour le moment</p>
|
|
</div>
|
|
</div>
|