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:
412
README.md
412
README.md
@@ -1,209 +1,217 @@
|
||||
# 🎭 Radarr ↔ TMDB Tagueur Automatique
|
||||
# 🎭 Radarr-TMDB Spectacle Tagger
|
||||
|
||||
Un script Python qui détecte automatiquement les spectacles vivants (stand-up, théâtre, one-man shows...) dans votre bibliothèque Radarr et leur applique un tag "spectacle".
|
||||
> Parce qu'à 50 ans, on a le droit d'avoir une bibliothèque Radarr bien rangée
|
||||
> ET de savoir distinguer un one-man-show d'un concert de Céline Dion.
|
||||
|
||||
**Important** : Les concerts de musique sont explicitement exclus.
|
||||
## Quoi ?
|
||||
|
||||
## 📋 Sommaire
|
||||
Un script Python qui :
|
||||
1. Scanne ta bibliothèque Radarr
|
||||
2. Interroge TMDB pour chaque film
|
||||
3. Détecte les **spectacles vivants** (stand-up, théâtre, one-man/woman show, cabaret, monologues, etc.)
|
||||
4. Exclut explicitement les **concerts de musique**
|
||||
5. Ajoute un tag **"spectacle"** dans Radarr
|
||||
|
||||
- [Installation](#installation)
|
||||
- [Configuration](#configuration)
|
||||
- [Utilisation](#utilisation)
|
||||
- [Sécurité](#sécurité)
|
||||
- [Rollback](#rollback)
|
||||
- [Checklist](#checklist)
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### 1. Cloner le repo
|
||||
|
||||
|
||||
|
||||
### 2. Créer un environnement virtuel (recommandé)
|
||||
|
||||
|
||||
|
||||
### 3. Installer les dépendances
|
||||
|
||||
Defaulting to user installation because normal site-packages is not writeable
|
||||
Collecting requests>=2.28.0 (from -r requirements.txt (line 1))
|
||||
Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB)
|
||||
Collecting pyyaml>=6.0 (from -r requirements.txt (line 2))
|
||||
Downloading pyyaml-6.0.3-cp313-cp313-win_amd64.whl.metadata (2.4 kB)
|
||||
Collecting python-dotenv>=1.0.0 (from -r requirements.txt (line 3))
|
||||
Downloading python_dotenv-1.2.1-py3-none-any.whl.metadata (25 kB)
|
||||
Collecting charset_normalizer<4,>=2 (from requests>=2.28.0->-r requirements.txt (line 1))
|
||||
Downloading charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl.metadata (38 kB)
|
||||
Collecting idna<4,>=2.5 (from requests>=2.28.0->-r requirements.txt (line 1))
|
||||
Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB)
|
||||
Collecting urllib3<3,>=1.21.1 (from requests>=2.28.0->-r requirements.txt (line 1))
|
||||
Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB)
|
||||
Collecting certifi>=2017.4.17 (from requests>=2.28.0->-r requirements.txt (line 1))
|
||||
Downloading certifi-2026.1.4-py3-none-any.whl.metadata (2.5 kB)
|
||||
Downloading requests-2.32.5-py3-none-any.whl (64 kB)
|
||||
Downloading charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl (107 kB)
|
||||
Downloading idna-3.11-py3-none-any.whl (71 kB)
|
||||
Downloading urllib3-2.6.3-py3-none-any.whl (131 kB)
|
||||
Downloading pyyaml-6.0.3-cp313-cp313-win_amd64.whl (154 kB)
|
||||
Downloading python_dotenv-1.2.1-py3-none-any.whl (21 kB)
|
||||
Downloading certifi-2026.1.4-py3-none-any.whl (152 kB)
|
||||
Installing collected packages: urllib3, pyyaml, python-dotenv, idna, charset_normalizer, certifi, requests
|
||||
|
||||
Successfully installed certifi-2026.1.4 charset_normalizer-3.4.4 idna-3.11 python-dotenv-1.2.1 pyyaml-6.0.3 requests-2.32.5 urllib3-2.6.3
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
### Fichier des secrets ()
|
||||
|
||||
**⚠️ Important** : Ce fichier est situé **UN NIVEAU AU-DESSUS** du repo Git pour ne jamais être commité par accident.
|
||||
|
||||
#### Option 1 : Création automatique (recommandée)
|
||||
|
||||
Lancez simplement le script. S'il ne trouve pas le fichier, il vous demandera les informations :
|
||||
|
||||
|
||||
|
||||
Le script créera automatiquement avec vos secrets.
|
||||
|
||||
#### Option 2 : Création manuelle
|
||||
|
||||
Créez le fichier (un dossier au-dessus du repo) :
|
||||
|
||||
|
||||
|
||||
Contenu :
|
||||
|
||||
|
||||
**Obtenir vos clés API :**
|
||||
- **Radarr** : Paramètres → Général → Clé API
|
||||
- **TMDB** : https://www.themoviedb.org/settings/api → Créer une clé
|
||||
|
||||
### Fichier de configuration ()
|
||||
|
||||
Copiez l'exemple et adaptez :
|
||||
|
||||
|
||||
|
||||
Modifiez selon vos besoins :
|
||||
|
||||
|
||||
|
||||
## 🎯 Utilisation
|
||||
|
||||
### Dry-run (par défaut - recommandé pour tester)
|
||||
|
||||
Analyse 5 films et montre ce qui serait tagué sans rien modifier :
|
||||
|
||||
|
||||
|
||||
**Sortie :**
|
||||
- Liste des films détectés dans le terminal
|
||||
- Export CSV avec les détails ()
|
||||
|
||||
### Appliquer les tags
|
||||
|
||||
Une fois satisfait du dry-run, appliquez réellement les tags :
|
||||
|
||||
|
||||
|
||||
### Options disponibles
|
||||
|
||||
|
||||
|
||||
Options :
|
||||
- : Limite à N films
|
||||
- : Applique réellement les tags (sinon dry-run)
|
||||
- : Utilise un autre fichier de config
|
||||
- ou : Mode verbeux (plus de logs)
|
||||
|
||||
### Exemples
|
||||
|
||||
|
||||
|
||||
## 🔒 Sécurité
|
||||
|
||||
### Protection des secrets
|
||||
|
||||
✅ **Bien** :
|
||||
- Les secrets sont dans (hors du repo)
|
||||
- Les clés API sont masquées lors de la saisie interactive
|
||||
- Les secrets ne sont jamais logués ni affichés
|
||||
- Le fichier CSV d'export ne contient aucun secret
|
||||
|
||||
❌ **Ne faites jamais** :
|
||||
- Ne copiez pas dans le repo
|
||||
- Ne committez jamais vos clés API
|
||||
- Ne partagez pas votre fichier CSV s'il contient des chemins sensibles
|
||||
|
||||
### Sauvegarde avant modifications
|
||||
|
||||
**Avant d'utiliser **, sauvegardez votre base Radarr :
|
||||
|
||||
|
||||
|
||||
Ou exportez vos tags actuels via l'API.
|
||||
|
||||
## ↩️ Rollback
|
||||
|
||||
En cas d'erreur, vous pouvez retirer les tags facilement.
|
||||
|
||||
### Méthode 1 : Via le CSV généré
|
||||
|
||||
Le fichier CSV contient tous les films tagués. Vous pouvez utiliser cette liste pour identifier les films à corriger.
|
||||
|
||||
### Méthode 2 : Via l'API Radarr (manuel)
|
||||
|
||||
|
||||
|
||||
### Méthode 3 : Via l'interface Radarr
|
||||
|
||||
1. Allez dans Films
|
||||
2. Filtrez par tag "spectacle"
|
||||
3. Sélectionnez les films concernés
|
||||
4. Actions en masse → Supprimer le tag
|
||||
|
||||
## ✅ Checklist avant commit
|
||||
|
||||
Voir [checklist.txt](checklist.txt)
|
||||
|
||||
## 🐛 Dépannage
|
||||
|
||||
### Erreur : "Fichier ../.env.global non trouvé"
|
||||
|
||||
Le script va vous demander de créer le fichier interactivement. Suivez les instructions.
|
||||
|
||||
### Erreur : "Variable manquante dans ../.env.global"
|
||||
|
||||
Vérifiez que les 3 variables sont bien présentes :
|
||||
- RADARR_URL
|
||||
- RADARR_APIKEY
|
||||
- TMDB_APIKEY
|
||||
|
||||
Supprimez le fichier et relancez le script pour le recréer.
|
||||
|
||||
### Erreur de connexion à Radarr
|
||||
|
||||
Vérifiez :
|
||||
- L'URL Radarr est accessible depuis la machine
|
||||
- La clé API est correcte
|
||||
- Radarr est en ligne
|
||||
|
||||
### Rate limit TMDB
|
||||
|
||||
Si vous avez beaucoup de films, vous pouvez atteindre la limite de requêtes TMDB. Le script attend automatiquement, mais soyez patient.
|
||||
|
||||
## 📝 Notes
|
||||
|
||||
- Le script analyse uniquement les films ayant un ID TMDB
|
||||
- Le mode "loose" (défaut) détecte plus de spectacles mais peut avoir des faux positifs
|
||||
- Le mode "strict" est plus conservateur
|
||||
- Les concerts de musique sont TOUJOURS exclus, même avec des mots-clés ambigus
|
||||
|
||||
## 🍷 Une petite touche d'humour
|
||||
|
||||
> *"À cinquante ans, on ne tague plus les films avec ses doigts fatigués.
|
||||
> On laisse Python faire le boulot pendant qu'on savoure un bon café."*
|
||||
**Dry-run par défaut** — on ne touche à rien sans `--apply`.
|
||||
|
||||
---
|
||||
|
||||
**Bon tagging !** 🎭
|
||||
## 📁 Structure du projet
|
||||
|
||||
mon-projet/
|
||||
├── .env.global ← UN NIVEAU AU-DESSUS (../), JAMAIS commité
|
||||
├── spectacle-tagger/ ← TON REPO
|
||||
│ ├── script.py
|
||||
│ ├── config.yaml ← ta config personnalisée (optionnel)
|
||||
│ ├── config.yaml.example
|
||||
│ ├── requirements.txt
|
||||
│ ├── .gitignore
|
||||
│ ├── README.md
|
||||
│ └── checklist.txt
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Gestion des secrets (../.env.global)
|
||||
|
||||
Le fichier `../.env.global` contient tes clés API. Il est stocké **un niveau au-dessus** du repo pour ne jamais être commité accidentellement.
|
||||
|
||||
### Création automatique
|
||||
|
||||
Si `../.env.global` n'existe pas au lancement du script, **il te demandera les 3 valeurs interactivement** (les clés sont saisies en mode masqué) :
|
||||
Création de ../.env.global
|
||||
(Tes secrets restent entre toi et ton serveur)
|
||||
RADARR_URL (ex: http://localhost:7878) : http://mon-radarr:7878
|
||||
RADARR_APIKEY (saisie masquée) : ********
|
||||
TMDB_APIKEY (saisie masquée) : ********
|
||||
✅ Fichier créé : /home/moi/projets/.env.global
|
||||
⚠️ Ne le commite JAMAIS. Jamais. Nada. Que dalle.
|
||||
|
||||
### Création manuelle
|
||||
|
||||
Tu peux aussi le créer toi-même :
|
||||
|
||||
```bash
|
||||
cat > ../.env.global << 'EOF'
|
||||
RADARR_URL="http://localhost:7878"
|
||||
RADARR_APIKEY="ta-clé-radarr-ici"
|
||||
TMDB_APIKEY="ta-clé-tmdb-ici"
|
||||
EOF
|
||||
chmod 600 ../.env.global
|
||||
Messages d'erreur courants
|
||||
Copier le tableau
|
||||
|
||||
|
||||
Situation
|
||||
Message
|
||||
|
||||
|
||||
|
||||
Fichier absent
|
||||
Fichier ../.env.global introuvable → création interactive
|
||||
|
||||
|
||||
Variable manquante
|
||||
Variables manquantes dans ../.env.global : TMDB_APIKEY
|
||||
|
||||
|
||||
Radarr injoignable
|
||||
Impossible de vérifier/créer le tag dans Radarr
|
||||
|
||||
|
||||
Rate limit TMDB
|
||||
Rate limit TMDB — on patiente Xs
|
||||
|
||||
|
||||
|
||||
🚀 Installation
|
||||
# Cloner le repo
|
||||
git clone https://ta-forge-gitea.local/ton-user/spectacle-tagger.git
|
||||
cd spectacle-tagger
|
||||
|
||||
# Environnement virtuel (recommandé, on n'est plus des sauvages)
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate # Linux/Mac
|
||||
# venv\Scripts\activate # Windows
|
||||
|
||||
# Dépendances
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Config (optionnel — le script marche avec les défauts)
|
||||
cp config.yaml.example config.yaml
|
||||
# Édite config.yaml selon tes goûts
|
||||
|
||||
🎮 Utilisation
|
||||
Dry-run (par défaut — on regarde, on touche pas)
|
||||
# 5 premiers films
|
||||
python script.py
|
||||
|
||||
# 50 films
|
||||
python script.py --limit 50
|
||||
|
||||
# Tous les films
|
||||
python script.py --limit 0
|
||||
|
||||
# Mode verbeux
|
||||
python script.py --verbose
|
||||
|
||||
# Mode silencieux
|
||||
python script.py --quiet
|
||||
Application réelle des tags
|
||||
# Tagger les spectacles détectés (5 films)
|
||||
python script.py --limit 5 --apply
|
||||
|
||||
# Tagger TOUT (fais un backup Radarr avant !)
|
||||
python script.py --limit 0 --apply
|
||||
Tous les arguments
|
||||
Copier le tableau
|
||||
|
||||
|
||||
Argument
|
||||
Description
|
||||
Défaut
|
||||
|
||||
|
||||
|
||||
--apply
|
||||
Applique réellement les tags
|
||||
dry-run
|
||||
|
||||
|
||||
--limit N
|
||||
Nombre de films (0 = tous)
|
||||
5
|
||||
|
||||
|
||||
--tag NOM
|
||||
Nom du tag Radarr
|
||||
spectacle
|
||||
|
||||
|
||||
--output FICHIER
|
||||
Chemin du CSV
|
||||
results_spectacle_dryrun.csv
|
||||
|
||||
|
||||
--sensitivity strict|loose
|
||||
strict = keyword+runtime, loose = keyword suffit
|
||||
loose
|
||||
|
||||
|
||||
--verbose
|
||||
Logs détaillés
|
||||
non
|
||||
|
||||
|
||||
--quiet
|
||||
Logs minimaux
|
||||
non
|
||||
|
||||
|
||||
|
||||
⚙️ Configuration (config.yaml)
|
||||
Copie config.yaml.example en config.yaml et adapte :
|
||||
TAG_NAME: "spectacle"
|
||||
DRY_RUN: true
|
||||
MIN_RUNTIME: 15
|
||||
MAX_RUNTIME: 240
|
||||
LIMIT: 5
|
||||
SENSITIVITY: "loose" # ou "strict"
|
||||
OUTPUT_CSV: "results_spectacle_dryrun.csv"
|
||||
LOG_LEVEL: "INFO"
|
||||
|
||||
EXTRA_KEYWORDS:
|
||||
- "stand-up"
|
||||
- "one-man"
|
||||
- "théâtre"
|
||||
# ... voir config.yaml.example pour la liste complète
|
||||
|
||||
EXCLUDE_KEYWORDS:
|
||||
- "concert"
|
||||
- "music"
|
||||
# ... voir config.yaml.example
|
||||
|
||||
🔄 Rollback (retirer un tag)
|
||||
Si tu as tagué un film par erreur :
|
||||
Via l'interface Radarr
|
||||
Ouvre le film → Éditer → Retire le tag "spectacle" → Sauvegarder.
|
||||
Via l'API (curl)
|
||||
# 1. Trouver l'ID du tag
|
||||
curl -s -H "X-Api-Key: TA_CLÉ" http://localhost:7878/api/v3/tag | python3 -m json.tool
|
||||
|
||||
# 2. Récupérer le film (ex: id=42)
|
||||
curl -s -H "X-Api-Key: TA_CLÉ" http://localhost:7878/api/v3/movie/42 > film.json
|
||||
|
||||
# 3. Éditer film.json : retirer l'ID du tag du tableau "tags"
|
||||
# 4. Mettre à jour
|
||||
curl -X PUT -H "X-Api-Key: TA_CLÉ" -H "Content-Type: application/json" \
|
||||
-d @film.json http://localhost:7878/api/v3/movie/42
|
||||
|
||||
⚠️ Sécurité — Les trucs importants
|
||||
|
||||
../.env.global n'est JAMAIS commité (il est dans .gitignore ET un niveau au-dessus)
|
||||
Les clés ne sont jamais loggées ni écrites dans le CSV
|
||||
Fais une sauvegarde Radarr avant toute modification massive :
|
||||
Radarr → System → Backup → Backup Now
|
||||
|
||||
|
||||
Le dry-run est activé par défaut — il faut explicitement passer --apply
|
||||
Reference in New Issue
Block a user