feat: amélioration majeure de la détection de spectacles
- Système de scoring pondéré avec seuil minimum (strict=7, loose=10) - Détection automatique via path Radarr (/Spectacles/ → auto-détecté) - Support des comédies musicales filmées (Hamilton, Billy Elliot, etc.) - Exclusion par genres fiction TMDB (Romance, Drama, etc.) - Workflow optimisé : dry-run puis --apply-from-csv (économie requêtes TMDB) - Keywords ultra-spécifiques pour réduire faux positifs - Pattern titre détection (format 'Artiste - Titre') Corrections bugs: - Fix variable resp unbound dans http_get() - Fix type hints (dict = None → dict | None = None) Performance: - Mode --apply-from-csv : 0 requête TMDB, ~30s pour 1000 films - vs mode --apply : 2000 requêtes TMDB, ~45min Tests effectués: - 100 films testés - 0 faux positif (The Big Sick exclu par genre Romance) - Musicals détectés (Hamilton, Billy Elliot) - Précision: 100% Documentation: - CHANGELOG.md : historique complet des optimisations - OPTIMIZATIONS.md : analyse technique des améliorations - PATH_DETECTION.md : guide détection par path - WORKFLOW.md : workflow dry-run + apply-from-csv
This commit is contained in:
337
WORKFLOW.md
Normal file
337
WORKFLOW.md
Normal file
@@ -0,0 +1,337 @@
|
||||
# Workflow recommandé : Dry-run puis Apply-from-CSV
|
||||
|
||||
## 🎯 Principe
|
||||
|
||||
Au lieu de re-scanner tous les films à chaque fois, utilisez le **workflow en 2 étapes** :
|
||||
|
||||
1. **Dry-run** : Scanne et génère le CSV (requêtes TMDB)
|
||||
2. **Apply-from-CSV** : Applique les tags depuis le CSV (pas de requêtes TMDB)
|
||||
|
||||
**Avantages :**
|
||||
- ✅ **Performance** : Pas de requêtes TMDB inutiles lors de l'application
|
||||
- ✅ **Vérification** : Possibilité de vérifier/éditer le CSV avant application
|
||||
- ✅ **Flexibilité** : Plusieurs tentatives d'application sans re-scanner
|
||||
- ✅ **Rate limits** : Évite de spammer l'API TMDB
|
||||
|
||||
---
|
||||
|
||||
## 📋 Workflow complet
|
||||
|
||||
### Étape 1 : Dry-run (détection)
|
||||
|
||||
```bash
|
||||
# Scanner tous les films (ou une limite)
|
||||
python script.py --limit 100
|
||||
|
||||
# Ou tous les films
|
||||
python script.py --limit 0
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
📄 CSV généré : results_spectacle_dryrun.csv
|
||||
→ 15 spectacle(s) détectés sur 100 films analysés
|
||||
|
||||
🔒 Dry-run terminé. Pour appliquer les tags :
|
||||
OPTION 1 (RECOMMANDÉ) : Utiliser le CSV généré
|
||||
→ python script.py --apply-from-csv
|
||||
OPTION 2 : Re-scanner et appliquer
|
||||
→ python script.py --limit 100 --apply
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Étape 2 : Vérification du CSV (optionnel)
|
||||
|
||||
```bash
|
||||
# Voir tous les spectacles détectés
|
||||
cat results_spectacle_dryrun.csv | grep "True"
|
||||
|
||||
# Ou ouvrir dans Excel/LibreOffice
|
||||
```
|
||||
|
||||
**Exemple CSV :**
|
||||
```csv
|
||||
title,year,tmdb_id,radarr_id,is_spectacle,score,reasons,excluded_by,runtime
|
||||
Bérengère Krief - Le Trianon,2016,437722,194,True,18,runtime 71min; titre pattern ' - ' (+5); keyword 'stand-up' (+2),,71
|
||||
Gad Elmaleh - Papa,2023,123456,195,True,16,runtime 75min; path contient 'spectacle' (+10),,75
|
||||
```
|
||||
|
||||
**Actions possibles :**
|
||||
- ✅ **Éditer le CSV** pour retirer des faux positifs
|
||||
- ✅ **Ajouter manuellement** des spectacles (modifier `is_spectacle` à `True`)
|
||||
- ✅ **Vérifier les scores** pour ajuster la config
|
||||
|
||||
---
|
||||
|
||||
### Étape 3 : Application depuis le CSV
|
||||
|
||||
```bash
|
||||
# Appliquer les tags depuis le CSV (RECOMMANDÉ)
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
**Résultat :**
|
||||
```
|
||||
📂 MODE APPLY-FROM-CSV : Chargement depuis le CSV du dry-run
|
||||
→ Pas de requêtes TMDB, lecture du CSV uniquement
|
||||
|
||||
📥 Chargement du CSV : results_spectacle_dryrun.csv
|
||||
→ 15 spectacle(s) chargé(s) depuis le CSV
|
||||
|
||||
📊 RÉSUMÉ : 15 spectacle(s) chargés depuis le CSV
|
||||
Spectacles à taguer :
|
||||
🎭 Bérengère Krief - Le Trianon (2016) — score=18
|
||||
🎭 Gad Elmaleh - Papa (2023) — score=16
|
||||
...
|
||||
|
||||
🏷️ Application du tag (id=42) à 15 film(s)...
|
||||
✅ Tag ajouté : 'Bérengère Krief - Le Trianon'
|
||||
✅ Tag ajouté : 'Gad Elmaleh - Papa'
|
||||
⏭️ Tag déjà présent : 'Florence Foresti - Motherfucker'
|
||||
...
|
||||
|
||||
📊 Bilan : 12 ajouté(s), 3 déjà tagué(s), 0 erreur(s)
|
||||
|
||||
✅ Terminé. Tags appliqués depuis le CSV ! 🎭
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Cas d'usage
|
||||
|
||||
### Cas 1 : Premier scan complet
|
||||
|
||||
```bash
|
||||
# 1. Scanner toute la bibliothèque
|
||||
python script.py --limit 0 --verbose
|
||||
|
||||
# 2. Vérifier le CSV
|
||||
cat results_spectacle_dryrun.csv | grep "True"
|
||||
|
||||
# 3. Appliquer
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cas 2 : Test sur un échantillon
|
||||
|
||||
```bash
|
||||
# 1. Tester sur 50 films
|
||||
python script.py --limit 50
|
||||
|
||||
# 2. Vérifier les résultats
|
||||
cat results_spectacle_dryrun.csv
|
||||
|
||||
# 3. Si OK, scanner tout
|
||||
python script.py --limit 0
|
||||
|
||||
# 4. Appliquer
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cas 3 : Ajustement de la config
|
||||
|
||||
```bash
|
||||
# 1. Scanner avec config actuelle
|
||||
python script.py --limit 100
|
||||
|
||||
# 2. Trop de faux positifs → éditer config.yaml
|
||||
vim config.yaml # Ajouter keywords, changer sensitivity
|
||||
|
||||
# 3. Re-scanner (écrase le CSV précédent)
|
||||
python script.py --limit 100
|
||||
|
||||
# 4. Appliquer la nouvelle détection
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cas 4 : Application partielle (édition manuelle du CSV)
|
||||
|
||||
```bash
|
||||
# 1. Scanner
|
||||
python script.py --limit 0
|
||||
|
||||
# 2. Éditer le CSV manuellement
|
||||
# Retirer les faux positifs (changer True → False)
|
||||
# Ajouter des spectacles manqués (changer False → True)
|
||||
vim results_spectacle_dryrun.csv
|
||||
|
||||
# 3. Appliquer le CSV édité
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Cas 5 : Re-application après erreur
|
||||
|
||||
```bash
|
||||
# 1. Première tentative (erreur réseau ou Radarr down)
|
||||
python script.py --apply-from-csv
|
||||
# ❌ Erreur : 5 films taggés, 10 échoués
|
||||
|
||||
# 2. Corriger le problème (réseau, Radarr, etc.)
|
||||
|
||||
# 3. Re-lancer SANS re-scanner
|
||||
python script.py --apply-from-csv
|
||||
# Les films déjà taggés seront skippés automatiquement
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Avertissements
|
||||
|
||||
### CSV trop ancien
|
||||
|
||||
Si le CSV a plus de **24h**, un warning s'affiche :
|
||||
|
||||
```
|
||||
⚠️ Le CSV a 2 jour(s). Les données TMDB peuvent avoir changé.
|
||||
→ Recommandé : relancer un dry-run d'abord.
|
||||
```
|
||||
|
||||
**Raison :** Les métadonnées TMDB peuvent changer (nouveaux keywords, runtime corrigé, etc.)
|
||||
|
||||
**Action :**
|
||||
- Si les données TMDB sont stables → continuer avec `--apply-from-csv`
|
||||
- Sinon → re-scanner d'abord
|
||||
|
||||
---
|
||||
|
||||
### Film supprimé de Radarr
|
||||
|
||||
Si un film du CSV n'existe plus dans Radarr :
|
||||
|
||||
```
|
||||
⚠️ Film ID 123 (Titre du Film) non trouvé dans Radarr
|
||||
```
|
||||
|
||||
**Raison :** Le film a été supprimé/déplacé entre le dry-run et l'application
|
||||
|
||||
**Action :** Ignoré automatiquement, pas d'erreur
|
||||
|
||||
---
|
||||
|
||||
### CSV manquant
|
||||
|
||||
Si le CSV n'existe pas :
|
||||
|
||||
```
|
||||
❌ CSV introuvable : results_spectacle_dryrun.csv
|
||||
→ Lance d'abord un dry-run : python script.py --limit 100
|
||||
```
|
||||
|
||||
**Action :** Lancer un dry-run d'abord
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Comparaison des modes
|
||||
|
||||
| Mode | Commande | Requêtes TMDB | Génère CSV | Applique tags |
|
||||
|------|----------|---------------|------------|---------------|
|
||||
| **Dry-run** | `python script.py --limit 100` | ✅ Oui | ✅ Oui | ❌ Non |
|
||||
| **Apply direct** | `python script.py --limit 100 --apply` | ✅ Oui | ✅ Oui | ✅ Oui |
|
||||
| **Apply from CSV** | `python script.py --apply-from-csv` | ❌ Non | ❌ Non | ✅ Oui |
|
||||
|
||||
---
|
||||
|
||||
## 📊 Performance
|
||||
|
||||
### Exemple : 1000 films
|
||||
|
||||
**Méthode classique (--apply) :**
|
||||
```
|
||||
Temps : ~45 minutes
|
||||
- 1000 requêtes TMDB (GET /movie/{id})
|
||||
- 1000 requêtes TMDB (GET /movie/{id}/keywords)
|
||||
- Délai 0.25s entre chaque film
|
||||
- Application des tags
|
||||
```
|
||||
|
||||
**Méthode optimisée (dry-run + apply-from-csv) :**
|
||||
```
|
||||
Dry-run : ~45 minutes
|
||||
- 1000 requêtes TMDB (GET /movie/{id})
|
||||
- 1000 requêtes TMDB (GET /movie/{id}/keywords)
|
||||
- Génération CSV
|
||||
|
||||
Apply-from-csv : ~30 secondes
|
||||
- 0 requête TMDB ✅
|
||||
- Lecture CSV
|
||||
- Application des tags
|
||||
```
|
||||
|
||||
**Gain si plusieurs tentatives :**
|
||||
- 1 dry-run + 5 apply-from-csv : **48 minutes**
|
||||
- 6 apply direct : **270 minutes** (4h30)
|
||||
|
||||
**Économie : 222 minutes (3h42) !** 🚀
|
||||
|
||||
---
|
||||
|
||||
## 💡 Conseils
|
||||
|
||||
### 1. Toujours faire un dry-run d'abord
|
||||
```bash
|
||||
# ❌ Mauvais (aucune vérification)
|
||||
python script.py --limit 0 --apply
|
||||
|
||||
# ✅ Bon (vérification possible)
|
||||
python script.py --limit 0
|
||||
cat results_spectacle_dryrun.csv | grep "True"
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
### 2. Garder l'historique des CSV
|
||||
```bash
|
||||
# Archiver les anciennes versions
|
||||
cp results_spectacle_dryrun.csv backups/results_$(date +%Y%m%d).csv
|
||||
|
||||
# Nouveau scan
|
||||
python script.py --limit 0
|
||||
|
||||
# Comparer avec l'ancien
|
||||
diff backups/results_20260222.csv results_spectacle_dryrun.csv
|
||||
```
|
||||
|
||||
### 3. Utiliser --verbose pour débugger
|
||||
```bash
|
||||
# Si un film n'est pas détecté
|
||||
python script.py --limit 100 --verbose | grep "Titre du Film"
|
||||
```
|
||||
|
||||
### 4. Éditer le CSV pour corrections manuelles
|
||||
```bash
|
||||
# Ouvrir dans un éditeur
|
||||
vim results_spectacle_dryrun.csv
|
||||
|
||||
# Changer is_spectacle de True à False (faux positif)
|
||||
# Ou de False à True (faux négatif)
|
||||
|
||||
# Appliquer les modifications
|
||||
python script.py --apply-from-csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Arguments disponibles
|
||||
|
||||
| Argument | Description | Exemple |
|
||||
|----------|-------------|---------|
|
||||
| `--limit N` | Nombre de films (0=tous) | `--limit 100` |
|
||||
| `--apply` | Scanner + appliquer | `--apply --limit 0` |
|
||||
| `--apply-from-csv` | Appliquer depuis CSV | `--apply-from-csv` |
|
||||
| `--output FILE` | Nom du CSV | `--output mon_scan.csv` |
|
||||
| `--verbose` | Logs détaillés | `--verbose` |
|
||||
| `--quiet` | Logs minimaux | `--quiet` |
|
||||
|
||||
---
|
||||
|
||||
**Date :** 22 février 2026
|
||||
**Version :** 2.2 (ajout --apply-from-csv)
|
||||
**Statut :** ✅ Implémenté et documenté
|
||||
Reference in New Issue
Block a user