- 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
338 lines
8.0 KiB
Markdown
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é
|