Files
tmdb-radarr-tag/WORKFLOW.md
laurent 898a625088 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
2026-02-22 16:19:39 +01:00

338 lines
8.0 KiB
Markdown

# 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é