Initial commit

This commit is contained in:
2026-03-23 20:59:26 +01:00
commit 16c95f747b
56 changed files with 21177 additions and 0 deletions

946
CHANGELOG.md Normal file
View File

@@ -0,0 +1,946 @@
# Changelog - Lycostorrent
Toutes les modifications notables de ce projet sont documentées dans ce fichier.
Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/).
---
## [1.9.25] - 2025-02-05
### 🏷️ Filtres par année avec pastilles
#### Ajouté
- **Pastilles cliquables** : `[2026]` `[2025]` `[2024]` `[2023]` `[≤2022]` `[Tous]`
- **Sélection multiple** - Possibilité de sélectionner plusieurs années
- **Filtrage instantané** - Pas besoin de recharger
- **Option 100 résultats** dans le sélecteur
#### Comportement
- Clic sur une année → toggle on/off
- Clic sur "Tous" → désactive les autres filtres
- Par défaut : "Tous" actif
- Compteur affiché : `(15/42)`
#### Fichiers modifiés
- `app/templates/latest.html` - Pastilles HTML + option 100 résultats
- `app/static/js/latest.js` - Logique de filtrage multiple
- `app/static/css/latest.css` - Styles pastilles (desktop + mobile)
---
## [1.9.24] - 2025-12-28
### 🔌 Support chemin (path) pour client torrent
#### Problème résolu
- URLs avec reverse proxy comme `https://geco.useed.me/qbittorrent` ne fonctionnaient pas
- Erreur `invalid literal for int()` quand le port était vide
#### Ajouté
- **Champ "Chemin"** dans l'admin pour les reverse proxy
- **Port optionnel** - Laisser vide pour utiliser le port par défaut (80/443)
- **Parsing intelligent** - Coller une URL complète la découpe automatiquement
#### Rétrocompatibilité
| Configuration | URL générée |
|--------------|-------------|
| `host: "192.168.1.100", port: 8080` | `http://192.168.1.100:8080` |
| `host: "geco.useed.me", path: "/qbittorrent", use_ssl: true` | `https://geco.useed.me/qbittorrent` |
| `host: "https://example.com/qbit"` | `https://example.com/qbit` |
#### Fichiers modifiés
- `app/plugins/torrent_clients/base.py` - TorrentClientConfig avec path
- `app/plugins/torrent_clients/__init__.py` - Parsing URL intelligent
- `app/main.py` - Gestion port vide + path
- `app/templates/admin.html` - Nouveau champ chemin
- `app/static/js/admin.js` - Support path dans formulaire
---
## [1.9.23] - 2025-12-28
### 🗓️ Filtre par année dans Latest
#### Ajouté
- **Sélecteur d'année** avec options : Toutes, 2026, 2025, 2024, 2023, 2022
- **Filtrage instantané** - Changer l'année sans recharger les données
- **Compteur intelligent** - Affiche "X nouveautés de 2025"
#### Fonctionnement
- Filtre basé sur l'année TMDb (`tmdb.year`)
- Si pas d'info TMDb, le résultat reste affiché
- Re-filtrage instantané quand on change l'année
#### Fichiers modifiés
- `app/templates/latest.html` - Sélecteur année
- `app/static/js/latest.js` - Fonction displayResults avec filtre
- `app/static/css/latest.css` - Style .no-results
---
## [1.9.22] - 2025-12-28
### 📱 Refonte complète modal torrents Latest (mobile)
#### Modifié
- **Structure HTML** - Passage de `<table>` à `<div>` (comme Discover)
- **Boutons adaptatifs** - `flex: 1` avec `flex-wrap` pour s'adapter à l'écran
- **Taille tactile** - Boutons correctement dimensionnés pour smartphone
#### Structure torrent (identique à Discover)
```html
<div class="torrent-item">
<div class="torrent-info">
<div class="torrent-name">...</div>
<div class="torrent-meta">...</div>
</div>
<div class="torrent-actions">
<a class="btn-link">🔗</a>
<a class="btn-magnet">🧲</a>
...
</div>
</div>
```
---
## [1.9.21] - 2025-12-28
### 🔧 Tentative correction boutons modal (grille CSS)
#### Modifié
- Passage à CSS Grid pour les boutons d'action
- `grid-template-columns: repeat(2, 1fr)` pour forcer 2x2
---
## [1.9.20] - 2025-12-28
### 🔧 Correction affichage infos torrents mobile
#### Corrigé
- **Cellules visibles** - `display: block` au lieu de `flex` pour les `<td>`
- **Labels** - Affichage du `data-label` avec `: ` après
---
## [1.9.19] - 2025-12-28
### 🔧 CSS harmonisé + bouton déconnexion
#### Corrigé
- **Bouton déconnexion** - Séparé des autres liens de navigation
- **Taille fixe** - 50px sur tablette, 40px sur mobile
- **Navigation** - Styles identiques sur Search, Latest et Discover
---
## [1.9.18] - 2025-12-28
### 📱 Harmonisation CSS Latest avec Search/Discover
#### Modifié
- **Navigation** - Flex wrap responsive identique
- **Catégories** - Grid auto-fit
- **Cards** - Poster 200px, actions en ligne
- **Modal** - Plein écran sur mobile
---
## [1.9.17] - 2025-12-27
### 📱 CSS mobile amélioré pour Latest et Discover
#### Latest - Menus mobile
- **Catégories** - Grille 2 colonnes au lieu de scroll horizontal invisible
- **Navigation** - Grille responsive au lieu de flex wrap cassé
- **Boutons trackers** - Grille 2 colonnes, taille correcte
- **Liste trackers** - Scrollable avec grille propre
#### Discover - Torrents mobile
- **Torrent item** - Layout en colonne avec actions en bas
- **Nom du torrent** - Multi-ligne avec word-break
- **Métadonnées** - Badges avec background distincts
- **Boutons actions** - Flex avec bordure séparatrice, taille tactile
---
## [1.9.16] - 2025-12-27
### 🎯 Filtrage par année et numéro de suite
#### Ajouté
- **Détection des suites** - Les numéros (2, 3, II, III...) dans le titre sont détectés
- **Filtrage par année** - Tolérance de ±1 an, exclut les années trop différentes
#### Exemples
- "Zootopie 2" (2025) → exclut "Zootopia (2016)" car années différentes ET pas de "2"
- "Sisu 2" → exclut "Sisu (2023)" car pas de numéro de suite
---
## [1.9.15] - 2025-12-27
### 🔍 Filtrage multi-mots amélioré
#### Corrigé
- **Problème CrazySpirits** - "Thérapie de choc" retournait "Police Academy...choc"
- **Nouvelle règle** : 2-3 mots significatifs → 2 matches minimum requis
#### Règles de filtrage
| Mots significatifs | Minimum requis |
|-------------------|----------------|
| 1 mot | 1 match |
| 2-3 mots | 2 matches |
| 4+ mots | 50% des mots |
---
## [1.9.14] - 2025-12-27
### 🔍 Filtrage simplifié
#### Modifié
- Algorithme de filtrage simplifié : vérifie si au moins un mot significatif (4+ caractères) est présent dans le titre du torrent
- Mots stop exclus : the, les, der, das, die, and, for, with, etc.
---
## [1.9.13] - 2025-12-27
### 🔍 Recherche avec tous les titres
#### Corrigé
- **Recherche complète** - Essaie TOUTES les requêtes (titre original + titre français) au lieu de s'arrêter au premier résultat
- Exemple : "Thérapie de choc" cherche maintenant avec "You Hurt My Feelings" ET "Thérapie de choc"
---
## [1.9.12] - 2025-12-27
### 🔍 Filtrage avec mot-clé principal
#### Ajouté
- **Détection du mot principal** - Premier mot de 4+ caractères du titre
- **Match flexible** - Accepte les torrents contenant le mot principal
#### Exemple
- "Sisu 2" → mot principal = "sisu"
- Torrent "Sisu.2023.FRENCH" → match car contient "sisu"
---
## [1.9.11] - 2025-12-27
### 🔍 Filtrage amélioré pour titres courts
#### Corrigé
- **Titres courts** (comme "Sisu") maintenant correctement filtrés
- Seuil d'inclusion réduit à 3 caractères (au lieu de 5)
- Seuil de similarité réduit à 0.7 (au lieu de 0.8)
- Mots-clés courts : 1 match minimum suffit
---
## [1.9.10] - 2025-12-27
### 🐛 Suppression du fallback
#### Corrigé
- **Plus de faux résultats** - Si aucun torrent pertinent n'est trouvé, affiche "Aucun torrent trouvé" au lieu de résultats non pertinents
- Suppression du fallback qui retournait les 10 premiers résultats bruts
---
## [1.9.9] - 2025-12-27
### 📥 Modal d'options dans Discover
#### Ajouté
- **Modal de téléchargement** - Même interface que Search/Latest
- **Choix de la catégorie** - Liste des catégories qBittorrent
- **Auto-remplissage du chemin** - Selon la catégorie sélectionnée
- **Option pause** - Démarrer en pause
- **Feedback visuel** - Bouton ⏳ → ✅/❌
---
## [1.9.8] - 2025-12-27
### ⚙️ Sélection des trackers pour Discover
#### Ajouté
- **Section Admin → Modules → "Trackers pour Découvrir"**
- **Sélection visuelle** - Cocher/décocher chaque tracker
- **Boutons tout/rien** - Sélectionner ou désélectionner tous
- **Persistance** - Sauvegardé dans `/app/config/discover_trackers.json`
#### API
- `GET /api/admin/discover-trackers` - Récupère les trackers configurés
- `POST /api/admin/discover-trackers` - Sauvegarde la sélection
---
## [1.9.7] - 2025-12-27
### 🎬 Bande-annonce YouTube + Lien tracker
#### Ajouté
- **Bande-annonce YouTube** - Intégrée dans le modal de détails Discover
- **Recherche multilingue** - Trailer FR d'abord, puis EN
- **Priorité** - Trailer > Teaser
- **Auto-stop** - La vidéo s'arrête à la fermeture du modal
- **Bouton 🔗** - Lien vers la page du torrent sur le tracker
---
## [1.9.6] - 2025-12-27
### 🔍 Filtrage plus strict
#### Modifié
- **Seuil de similarité** augmenté à 0.8 (au lieu de 0.7)
- **Mots-clés** - Vérifie que 60% des mots-clés sont présents avec minimum 2 matches
---
## [1.9.5] - 2025-12-27
### 🔍 Filtrage des résultats Discover
#### Ajouté
- **Fonction `_filter_relevant_torrents()`** - Filtre les résultats par titre
- **Normalisation des titres** - Suppression accents, caractères spéciaux
- **Comparaison intelligente** - Inclusion, similarité, mots-clés
#### Corrigé
- Les résultats non pertinents de CrazySpirits sont maintenant filtrés
---
## [1.9.4] - 2025-12-27
### 🔍 Correction recherche Discover - Titres non-latins
#### Corrigé
- **Titres thaï/chinois/etc.** - Utilise le titre anglais original au lieu du titre non-latin
- **Recherches successives** - Essaie original_title + year, puis original_title, puis title + year, puis title
- **Détection caractères latins** - Fonction `_is_latin_text()` pour vérifier si le titre est utilisable
#### Exemple
- Film thaï "ปัง" → recherche avec "Bang 2025" (titre anglais) au lieu de "ปัง 2025"
---
## [1.9.3] - 2025-12-27
### 🐛 Correction regroupement - Années entre parenthèses
#### Corrigé
- **Support des années entre parenthèses** - `(2016)` maintenant correctement reconnu
- Les films comme `L'Age.De.Glace.5.(2016)` et `L'Age.De.Glace.4.(2012)` sont maintenant séparés
#### Technique
- Regex modifiée pour inclure `\(` et `\)` dans la détection d'année
---
## [1.9.2] - 2025-12-27
### 🐛 Correction regroupement - Suites de films
#### Corrigé
- **Séparation par année** - Les films avec des années différentes ne sont plus groupés
- Exemple : "Les Schtroumpfs 2 (2013)" et "Les Schtroumpfs (2011)" maintenant séparés
#### Technique
- Nouvelle fonction `_extract_base_title_and_year()` qui extrait titre ET année
- Règle stricte : années différentes = pas de regroupement
---
## [1.9.1] - 2025-12-27
### 🐛 Correction regroupement Latest
#### Corrigé
- **Regroupement plus strict** - Évite les faux positifs (ex: "The Empire Strikes Back" vs "Exists")
- Seuil de similarité augmenté à 0.85
#### Technique
- Nouvelle fonction `_extract_base_title()` qui extrait uniquement le titre avant les métadonnées
- Double vérification : similarité du titre de base ET similarité globale
---
## [1.9.0] - 2025-12-27
### 🌟 Page Découvrir + Système de Modules
#### Page Découvrir
- **Nouvelle page `/discover`** - Explore les nouveautés cinéma et TV depuis TMDb
- **5 catégories disponibles** :
- 🎬 Au cinéma (films actuellement en salle)
- 🔥 Films populaires
- 📺 Séries en cours de diffusion
- ⭐ Séries populaires
- 📅 Films à venir
- **Affichage en grille** avec affiches, notes et années
- **Modal de détails** avec synopsis, genres et note
- **Recherche automatique de torrents** sur tous vos trackers
- **Envoi direct au client torrent** depuis les résultats
#### Système de Modules
- **Nouvel onglet Admin → Modules** - Activer/désactiver les fonctionnalités
- **3 modules disponibles** :
- 🔍 Recherche (activé par défaut)
- 🎬 Nouveautés (activé par défaut)
- 🌟 Découvrir (désactivé par défaut)
- **Navigation dynamique** - Le menu s'adapte aux modules activés
- **Persistance** - Configuration sauvegardée en JSON
#### Fichiers ajoutés
- `templates/discover.html` - Page Découvrir
- `static/css/discover.css` - Styles Découvrir
- `static/js/discover.js` - Logique Découvrir
- `static/js/nav.js` - Navigation dynamique
#### API ajoutées
- `GET /api/modules` - Récupère les modules activés
- `GET /api/admin/modules` - Config modules pour admin
- `POST /api/admin/modules` - Sauvegarde modules
- `GET /api/discover/<category>` - Liste TMDb par catégorie
- `GET /api/discover/detail/<type>/<id>` - Détails TMDb
- `POST /api/discover/search-torrents` - Recherche torrents
---
## [1.8.0] - 2025-12-27
### 🎨 Système de thèmes
#### Ajouté
- **8 thèmes disponibles** :
- 🌙 Sombre (par défaut)
- ☀️ Clair
- 🌊 Océan (bleu-vert)
- 💜 Violet
- 🌿 Nature (vert)
- 🌅 Sunset (orange)
- 🤖 Cyberpunk (néon)
- ❄️ Nord (palette nordique)
- **Onglet Apparence dans Admin** - Sélection visuelle des thèmes avec aperçu
- **Persistance du thème** - Sauvegardé en localStorage
- **Chargement instantané** - Pas de flash blanc au chargement
- **Transitions fluides** - Changement de thème animé
#### Fichiers ajoutés
- `static/css/themes.css` - Définition de tous les thèmes
- `static/js/theme-loader.js` - Chargement du thème au démarrage
#### Fichiers modifiés
- `templates/admin.html` - Onglet Apparence
- `templates/index.html` - Support des thèmes
- `templates/latest.html` - Support des thèmes
- `templates/login.html` - Support des thèmes
- `static/css/admin.css` - Styles des cartes de thèmes
- `static/js/admin.js` - Gestion des thèmes
---
## [1.7.1] - 2025-12-27
### ⚡ Recherche parallèle
#### Ajouté
- **Recherche parallèle par tracker** - Chaque tracker est interrogé en parallèle
- Avant : Jackett recevait 10 trackers et les faisait séquentiellement (~17s)
- Après : 10 requêtes parallèles vers Jackett (~5s)
#### Logs améliorés
```
🔍 Recherche: 'fallout' | Catégorie: tv | Trackers: 10
✅ jackett:sharewood-api: 45 résultats
✅ jackett:yggtorrent: 38 résultats
...
📦 Recherche parallèle: 220 résultats bruts (en 5.24s)
```
---
## [1.7.0] - 2025-12-27
### ⚡ Requêtes parallèles - Performance améliorée
#### Ajouté
- **Requêtes parallèles pour Latest** - Tous les trackers sont interrogés simultanément
- **Requêtes parallèles Jackett/Prowlarr** - Les deux sources sont interrogées en même temps
- **Logging du temps d'exécution** - Affiche le temps total des recherches
#### Gain de performance
| Avant (séquentiel) | Après (parallèle) | Gain |
|-------------------|-------------------|------|
| 4 trackers × 3s = 12s | max(3s) = 3s | **~75%** |
| 6 trackers × 2s = 12s | max(2s) = 2s | **~85%** |
#### Technique
- Utilisation de `ThreadPoolExecutor` avec max 10 workers
- Timeout de 60s par requête
- Les erreurs d'un tracker n'affectent pas les autres
#### Fichiers modifiés
- `main.py` - Parallélisation de `/api/latest`
- `indexer_manager.py` - Parallélisation Jackett + Prowlarr
---
## [1.6.1] - 2025-12-27
### 📁 Gestion des catégories dans l'administration
#### Ajouté
- **Section "Catégories & Dossiers"** dans Admin → Client Torrent
- **Catégories personnalisées** avec chemin de destination par défaut
- **Auto-remplissage du chemin** quand on sélectionne une catégorie dans le modal
- **Synchronisation avec qBittorrent** - crée les catégories directement dans le client
- **API `/api/admin/torrent-client/categories`** - GET/POST pour gérer les catégories
- **API `/api/admin/torrent-client/sync-categories`** - Synchronise avec le client
#### Fonctionnalités admin
- Ajouter une catégorie avec son chemin
- ✏️ Modifier le nom et le chemin
- 🗑️ Supprimer une catégorie
- 🔄 Synchroniser avec qBittorrent (crée les catégories manquantes)
- 💾 Sauvegarder la configuration
#### Plugin qBittorrent v1.2.0
- `create_category(name, path)` - Crée une catégorie
- `edit_category(name, path)` - Modifie le chemin d'une catégorie
- `get_categories_with_paths()` - Récupère les catégories avec leurs chemins
---
## [1.6.0] - 2025-12-27
### 📥 Modal d'options de téléchargement
#### Ajouté
- **Modal de sélection** quand on clique sur 📥
- **Choix de la catégorie** - Liste déroulante des catégories du client
- **Chemin personnalisé** - Spécifier un dossier de destination
- **Option "Démarrer en pause"** - Ajouter le torrent sans le lancer
- **API `/api/torrent-client/categories`** - Récupère les catégories disponibles
#### Interface du modal
```
┌─────────────────────────────┐
│ 📥 Options de téléchargement │
├─────────────────────────────┤
│ Catégorie: [Films ▼] │
│ Dossier: [/downloads/films] │
│ ☐ Démarrer en pause │
│ [Annuler] [Envoyer] │
└─────────────────────────────┘
```
#### Support par client
| Option | qBittorrent | Transmission |
|--------|-------------|--------------|
| Catégorie | ✅ | ❌ (non supporté) |
| Dossier | ✅ | ✅ |
| Pause | ✅ | ✅ |
---
## [1.5.2] - 2025-12-27
### 🔧 Correction plugin qBittorrent
#### Corrigé
- **Téléchargement local des .torrent** - qBittorrent distant n'a pas accès aux URLs Jackett internes
- **Détection des redirections magnet** - Gère les URLs qui redirigent vers un magnet
- **Gestion des erreurs améliorée** - Meilleurs messages d'erreur
#### Plugin qBittorrent v1.2.0
- Télécharge les fichiers .torrent localement avant envoi
- Détecte les redirections HTTP vers magnet
- Vérifie le format bencode avant envoi
---
## [1.5.1] - 2025-12-26
### 📱 Amélioration affichage mobile des modals
#### Corrigé
- **Modal plein écran** sur mobile (plus de scroll horizontal)
- **Table des torrents responsive** - affichage en cartes sur mobile
- **Boutons d'action** bien alignés et accessibles
- **Labels visibles** pour chaque donnée (Tracker, Taille, Seeds, Date)
#### Changements CSS
- Modal en plein écran sur mobile (100vh)
- Table transformée en liste de cartes
- Boutons d'action avec flex-wrap
- Suppression du min-width qui causait le scroll
---
## [1.5.0] - 2025-12-26
### 📱 Progressive Web App (PWA)
#### Ajouté
- **Manifest PWA** - L'application est maintenant installable
- **Service Worker** - Cache des assets pour un chargement rapide
- **Icônes** - 8 tailles d'icônes (72x72 à 512x512)
- **Support iOS** - Meta tags pour Apple mobile web app
- **Raccourcis** - Accès rapide à Recherche et Nouveautés
#### Fonctionnalités PWA
- 📱 **Installable** sur mobile (Android/iOS) et desktop
- 🖥️ **Mode standalone** - Plein écran sans barre de navigateur
-**Cache intelligent** - Assets statiques mis en cache
- 🎨 **Thème** - Couleur #e63946 (rouge Lycostorrent)
#### Comment installer
- **Android** : Menu Chrome → "Ajouter à l'écran d'accueil"
- **iOS** : Safari → Partager → "Sur l'écran d'accueil"
- **Desktop** : Icône d'installation dans la barre d'adresse
#### Fichiers ajoutés
```
app/static/
├── manifest.json # Configuration PWA
├── sw.js # Service Worker
└── icons/ # Icônes PNG
├── icon-72x72.png
├── icon-96x96.png
├── icon-128x128.png
├── icon-144x144.png
├── icon-152x152.png
├── icon-192x192.png
├── icon-384x384.png
└── icon-512x512.png
```
---
## [1.4.1] - 2025-12-26
### 📥 Bouton "Envoyer au client torrent"
#### Ajouté
- **Bouton 📥** sur chaque résultat de recherche
- **Bouton 📥** sur chaque torrent dans les nouveautés
- **Notification toast** de succès/erreur
- **Support HTTP Basic Auth** pour les seedbox (reverse proxy)
#### Fonctionnement
- Le bouton n'apparaît que si un client torrent est configuré et connecté
- Clique sur 📥 → envoie le magnet/torrent au client
- Feedback visuel : ⏳ → ✅ ou ❌
#### Technique
- `checkTorrentClient()` vérifie le statut au chargement
- `sendToTorrentClient(url, button)` envoie via l'API
- Plugin qBittorrent v1.1.0 avec support HTTP Basic Auth
---
## [1.4.0] - 2025-12-26
### ⬇️ Système de plugins Client Torrent
#### Ajouté
- **Architecture de plugins** pour les clients torrent
- **Plugin qBittorrent** inclus et fonctionnel
- **Onglet "Client Torrent"** dans l'administration
- **Configuration via interface web** :
- Sélection du plugin
- Host, port, utilisateur, mot de passe
- Option SSL
- Test de connexion
- **API endpoints** :
- `GET /api/admin/torrent-client/plugins` - Liste des plugins
- `GET /api/admin/torrent-client/config` - Configuration actuelle
- `POST /api/admin/torrent-client/config` - Sauvegarder config
- `POST /api/admin/torrent-client/test` - Tester connexion
- `POST /api/torrent-client/add` - Envoyer un torrent
- `GET /api/torrent-client/status` - Statut du client
#### Structure des plugins
```
app/plugins/torrent_clients/
├── __init__.py # Gestionnaire auto-découverte
├── base.py # Classe abstraite
├── qbittorrent.py # Plugin qBittorrent
└── README.md # Guide création plugins
```
#### Pour créer un nouveau plugin
1. Créer un fichier `.py` dans `plugins/torrent_clients/`
2. Hériter de `TorrentClientPlugin`
3. Implémenter les méthodes requises
4. Définir `PLUGIN_CLASS = VotreClasse`
Le plugin sera automatiquement détecté au démarrage.
---
## [1.3.1] - 2025-12-26
### 🔧 RSS uniquement pour les Nouveautés
#### Modifié
- **Les flux RSS n'apparaissent plus dans la page Recherche**
- Les RSS sont maintenant uniquement disponibles dans la page Nouveautés
- Paramètre `?include_rss=true` sur `/api/trackers` pour inclure les RSS
#### Technique
- `/api/trackers` : par défaut sans RSS (pour la recherche)
- `/api/trackers?include_rss=true` : avec RSS (pour les nouveautés)
---
## [1.3.0] - 2025-12-26
### 🔐 Système d'authentification
#### Ajouté
- **Page de login** avec nom d'utilisateur et mot de passe
- **Protection de toutes les routes** - authentification requise pour accéder au site
- **Sessions persistantes** - reste connecté 7 jours par défaut
- **Bouton de déconnexion** 🚪 dans la navigation
- **Variables d'environnement** pour configurer :
- `AUTH_USERNAME` : nom d'utilisateur (défaut: `admin`)
- `AUTH_PASSWORD` : mot de passe (vide = pas d'auth requise)
- `SESSION_LIFETIME` : durée de session en secondes (défaut: 604800 = 7 jours)
- `SECRET_KEY` : clé secrète pour les sessions (auto-générée si non définie)
#### Technique
- Décorateur `@login_required` sur toutes les routes principales
- Sessions Flask sécurisées avec cookie permanent
- Redirection automatique vers `/login` si non authentifié
- Logs des connexions/déconnexions
#### Notes
- Si `AUTH_PASSWORD` est vide ou non défini, l'authentification est **désactivée**
- Compatible avec l'ancien système (ADMIN_PASSWORD toujours supporté)
---
## [1.2.6] - 2024-12-25
### 🐛 Fix images placeholder
#### Corrigé
- **Bug affichage SVG cassé** : Les images placeholder utilisent maintenant du base64 au lieu de SVG inline
- Plus de problèmes d'échappement de caractères dans les attributs HTML
- Les placeholders affichent une icône 🎵 pour la musique et 🎬 pour les films
---
## [1.2.5] - 2024-12-25
### 🎵 Amélioration affichage Musique
#### Corrigé
- **Bug affichage "No Album Art" en texte brut** : l'image de fallback s'affiche maintenant correctement
- Utilisation de `sanitizeUrl()` pour l'URL de la cover
- Ajout d'un handler `onerror` sur l'image pour le fallback
#### Amélioré
- Affichage " Infos Last.fm non disponibles" quand l'album n'est pas trouvé sur Last.fm
- Tentative d'extraire artiste/album du titre du torrent si Last.fm ne trouve pas
- Style amélioré pour le placeholder de l'image album
---
## [1.2.4] - 2024-12-25
### 🐛 Correction sauvegarde catégories
#### Corrigé
- **La sauvegarde des catégories des trackers fonctionne à nouveau !**
- Le format des données envoyées par le JavaScript était incorrect
- La fonction de sauvegarde fusionne maintenant correctement avec la config existante
#### Technique
- `admin.js`: Envoi de `{ config: { tracker, categories } }` au lieu de `{ tracker, categories }`
- `main.py`: La route POST `/api/admin/latest-config` fusionne les données au lieu d'écraser tout le fichier
---
## [1.2.3] - 2024-12-25
### 🔄 Rechargement automatique des filtres
#### Corrigé
- **Plus besoin de redémarrer Docker !** Le parser détecte automatiquement les modifications du fichier `filters_config.json`
- Les nouveaux filtres sont appliqués immédiatement à la prochaine recherche
#### Technique
- Le parser vérifie la date de modification du fichier config avant chaque parsing
- Si le fichier a changé, il recharge automatiquement la configuration
- Log "🔄 Config des filtres modifiée, rechargement..." dans les logs quand ça se produit
---
## [1.2.2] - 2024-12-25
### 🔄 Filtres dynamiques dans la recherche
#### Corrigé
- **Les filtres personnalisés apparaissent maintenant dans la recherche !**
- La page de recherche charge dynamiquement les filtres depuis l'API
- Plus besoin de modifier le code JS pour ajouter de nouveaux filtres
#### Ajouté
- Route publique `/api/filters` pour charger la config des filtres
- Les filtres créés dans Admin → Filtres sont immédiatement disponibles dans la recherche
#### Technique
- `FILTER_CONFIG` dans search.js est maintenant dynamique (chargé au démarrage)
- Fallback sur une config minimale si l'API ne répond pas
---
## [1.2.1] - 2024-12-25
### 🎮 Plus de catégories de filtres
#### Ajouté
- **Nouveaux filtres par défaut** :
- 🎮 **Plateforme** : PC, Windows, Linux, Mac, PS5, PS4, Xbox, Switch, Steam, GOG...
- 💻 **Type Logiciel** : Portable, Repack, ISO, Setup, Crack, Patch, x64, x86...
- 📚 **Format Ebook** : EPUB, PDF, MOBI, CBR, CBZ, DJVU...
- 📖 **Type Ebook** : Roman, BD, Comics, Manga, Magazine, Audiobook...
- 🕹️ **Type Jeu** : RPG, FPS, Action, Adventure, Strategy, Simulation...
#### Amélioré
- **Ajout de filtre simplifié** : plus besoin de connaître le nom technique, juste le nom et l'emoji
- Interface plus intuitive pour créer de nouveaux filtres
---
## [1.2.0] - 2024-12-25
### 🎛️ Gestion dynamique des filtres
#### Ajouté
- **Nouvel onglet "Filtres"** dans le panneau d'administration
- **Éditeur de filtres** : ajouter, modifier, supprimer des filtres
- **Configuration des valeurs** : définir les mots-clés à détecter pour chaque filtre
- **Test de détection** : tester un titre pour voir les filtres détectés
- **Fichier JSON** : `config/filters_config.json` pour persister la configuration
- **API endpoints** :
- `GET /api/admin/filters` - Récupérer la config
- `POST /api/admin/filters` - Sauvegarder la config
- `POST /api/admin/filters/reset` - Réinitialiser
- `POST /api/admin/filters/test` - Tester un titre
#### Modifié
- **torrent_parser.py** : charge les filtres depuis le JSON au lieu du code en dur
- Le parser se recharge automatiquement après sauvegarde
#### Technique
- Patterns regex construits dynamiquement à partir de la config
- Singleton pattern pour le parser avec reload
---
## [1.1.2] - 2024-12-25
### 🎵 Filtres Musique
#### Ajouté
- **Nouveaux filtres pour la musique** dans la recherche :
- **Format Audio** : FLAC, MP3, AAC, Lossless, 320, V0, 24bit...
- **Type** : Album, Single, EP, Live, Concert, Discography, Soundtrack...
- **Source Audio** : CD, Vinyl, WEB, SACD...
#### Modifié
- Parser de titres enrichi pour détecter les métadonnées musicales
---
## [1.1.1] - 2024-12-25
### 🎨 Amélioration interface Recherche
#### Modifié
- **Sélecteur de trackers** : nouveau design identique à la page Nouveautés
- Panneau dépliable "🔧 Sélectionner les trackers"
- Boutons "Tout sélectionner" / "Tout désélectionner"
- **Filtres masquables** : bouton ▼/▶ pour afficher/masquer les filtres
- Uniformisation du style entre les pages Recherche et Nouveautés
---
## [1.1.0] - 2024-12-25
### ✨ Nouveau panneau d'administration unifié
#### Ajouté
- **Page `/admin` unifiée** avec 3 onglets (Catégories, Tags, RSS)
- Design moderne avec onglets animés
- Toast notifications pour les actions
- Section aide repliable pour RSS
- Route `/api/admin/parsing-tags/reset` pour réinitialiser les tags
#### Modifié
- **Navigation simplifiée** : 3 liens au lieu de 5
- **CSS admin refait** : design cohérent et moderne
- Interface responsive améliorée pour mobile
#### Sécurité (v1.1.0)
- Headers HTTP de sécurité (X-Content-Type-Options, X-Frame-Options, etc.)
- Validation renforcée des entrées (longueur, nombre de trackers)
- Protection XSS avec `sanitizeUrl()` et `escapeHtml()`
- Protection SSRF dans les flux RSS (validation des URLs)
- Blocage des URLs locales (localhost, 127.0.0.1)
#### Technique
- Export `DEFAULT_PARSING_TAGS` dans tmdb_api.py
- Route alternative `/api/admin/tracker-categories?tracker=xxx`
---
## [1.0.0] - 2024-12-25
### 🎉 Version initiale stable
#### Fonctionnalités principales
- **Recherche multi-trackers** via Jackett et Prowlarr
- **Page Nouveautés** avec enrichissement TMDb (films/séries) et Last.fm (musique)
- **Parsing intelligent** des titres de torrents (qualité, codec, langue, HDR, etc.)
- **Interface responsive** adaptée aux smartphones
- **Filtres dynamiques** côté client (qualité, source, langue, tracker)
- **Tri et pagination** des résultats
#### Sources supportées
- Jackett (indexers configurés)
- Prowlarr (indexers configurés)
- Flux RSS génériques (avec support Flaresolverr + cookies)
#### Administration
- `/admin/latest` - Configuration des catégories par tracker
- `/admin/parsing` - Gestion des tags de nettoyage des titres
- `/admin/rss` - Gestion des flux RSS
#### Intégrations
- TMDb API - Métadonnées films/séries
- Last.fm API - Métadonnées musique
- Flaresolverr - Bypass Cloudflare pour RSS
---
## Versioning
- **MAJOR** (X.0.0) : Changements incompatibles, refonte majeure
- **MINOR** (0.X.0) : Nouvelles fonctionnalités rétrocompatibles
- **PATCH** (0.0.X) : Corrections de bugs, sécurité