Téléverser les fichiers vers "/"
This commit is contained in:
commit
91c6df7457
226
FixEncoding.py
Normal file
226
FixEncoding.py
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
#
|
||||||
|
# Corrige les problèmes d'encodage dans les noms de fichiers.
|
||||||
|
#
|
||||||
|
# Ce script détecte et corrige les noms de fichiers qui ont été mal encodés
|
||||||
|
# (UTF-8 interprété comme ISO-8859-1/Windows-1252) et les renomme correctement.
|
||||||
|
#
|
||||||
|
# NOTE: Ce script utilise Python 3.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
### OPTIONS ###
|
||||||
|
|
||||||
|
# Activer le mode débogage (affiche plus d'informations dans les logs).
|
||||||
|
#
|
||||||
|
# yes, no.
|
||||||
|
#Debug=no
|
||||||
|
|
||||||
|
# Extensions de fichiers à traiter (séparées par des virgules).
|
||||||
|
# Laisser vide pour traiter tous les fichiers.
|
||||||
|
#
|
||||||
|
# Exemples: .flac,.mp3,.mkv,.mp4
|
||||||
|
#FileExtensions=
|
||||||
|
|
||||||
|
# Mode de simulation (ne renomme pas les fichiers, affiche seulement ce qui serait fait).
|
||||||
|
#
|
||||||
|
# yes, no.
|
||||||
|
#DryRun=no
|
||||||
|
|
||||||
|
### NZBGET POST-PROCESSING SCRIPT ###
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
# Exit codes utilisés par NZBGet
|
||||||
|
POSTPROCESS_SUCCESS = 93
|
||||||
|
POSTPROCESS_ERROR = 94
|
||||||
|
POSTPROCESS_NONE = 95
|
||||||
|
|
||||||
|
|
||||||
|
def is_debug():
|
||||||
|
"""Vérifie si le mode debug est activé."""
|
||||||
|
return os.environ.get('NZBPO_DEBUG', 'no').lower() == 'yes'
|
||||||
|
|
||||||
|
|
||||||
|
def is_dry_run():
|
||||||
|
"""Vérifie si le mode simulation est activé."""
|
||||||
|
return os.environ.get('NZBPO_DRYRUN', 'no').lower() == 'yes'
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_extensions():
|
||||||
|
"""Récupère la liste des extensions de fichiers à traiter."""
|
||||||
|
extensions = os.environ.get('NZBPO_FILEEXTENSIONS', '')
|
||||||
|
if not extensions:
|
||||||
|
return None
|
||||||
|
return [ext.strip().lower() for ext in extensions.split(',')]
|
||||||
|
|
||||||
|
|
||||||
|
def print_log(message, level='INFO'):
|
||||||
|
"""Affiche un message dans les logs NZBGet."""
|
||||||
|
print(f'[{level}] {message}')
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def is_encoding_issue(filename):
|
||||||
|
"""
|
||||||
|
Détecte si un nom de fichier contient des problèmes d'encodage typiques.
|
||||||
|
|
||||||
|
Recherche des motifs caractéristiques de l'UTF-8 mal interprété comme ISO-8859-1:
|
||||||
|
- Ã suivi de caractères accentués (à, â, é, è, ê, ô, etc.)
|
||||||
|
"""
|
||||||
|
# Motifs caractéristiques d'un problème d'encodage UTF-8 -> ISO-8859-1
|
||||||
|
patterns = [
|
||||||
|
'é', # é mal encodé
|
||||||
|
'è', # è mal encodé
|
||||||
|
'ê', # ê mal encodé
|
||||||
|
'ë', # ë mal encodé
|
||||||
|
'Ã ', # à mal encodé
|
||||||
|
'â', # â mal encodé
|
||||||
|
'ä', # ä mal encodé
|
||||||
|
'ç', # ç mal encodé
|
||||||
|
'ô', # ô mal encodé
|
||||||
|
'ö', # ö mal encodé
|
||||||
|
'ù', # ù mal encodé
|
||||||
|
'û', # û mal encodé
|
||||||
|
'ü', # ü mal encodé
|
||||||
|
'î', # î mal encodé
|
||||||
|
'ï', # ï mal encodé
|
||||||
|
'Å"', # œ mal encodé
|
||||||
|
'É', # É mal encodé
|
||||||
|
'À', # À mal encodé
|
||||||
|
]
|
||||||
|
|
||||||
|
return any(pattern in filename for pattern in patterns)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_encoding(filename):
|
||||||
|
"""
|
||||||
|
Corrige le nom de fichier en supposant qu'il a été mal interprété.
|
||||||
|
|
||||||
|
Le problème typique est: UTF-8 -> interprété comme ISO-8859-1
|
||||||
|
Solution: encoder en ISO-8859-1 (pour revenir aux octets originaux UTF-8)
|
||||||
|
puis décoder en UTF-8
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Tente de corriger l'encodage
|
||||||
|
# On encode d'abord en ISO-8859-1 pour récupérer les octets originaux
|
||||||
|
# puis on décode en UTF-8
|
||||||
|
fixed = filename.encode('iso-8859-1').decode('utf-8')
|
||||||
|
return fixed
|
||||||
|
except (UnicodeDecodeError, UnicodeEncodeError):
|
||||||
|
# Si la conversion échoue, on retourne le nom original
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def process_file(filepath, dirname, filename, extensions_filter, dry_run):
|
||||||
|
"""
|
||||||
|
Traite un fichier et le renomme si nécessaire.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True si le fichier a été renommé, False sinon
|
||||||
|
"""
|
||||||
|
# Vérifie l'extension si un filtre est défini
|
||||||
|
if extensions_filter:
|
||||||
|
file_ext = os.path.splitext(filename)[1].lower()
|
||||||
|
if file_ext not in extensions_filter:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Vérifie si le nom contient des problèmes d'encodage
|
||||||
|
if not is_encoding_issue(filename):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Tente de corriger l'encodage
|
||||||
|
fixed_filename = fix_encoding(filename)
|
||||||
|
|
||||||
|
if not fixed_filename or fixed_filename == filename:
|
||||||
|
if is_debug():
|
||||||
|
print_log(f'Impossible de corriger: {filename}', 'DEBUG')
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Construit les chemins complets
|
||||||
|
old_path = os.path.join(dirname, filename)
|
||||||
|
new_path = os.path.join(dirname, fixed_filename)
|
||||||
|
|
||||||
|
# Vérifie que le nouveau nom n'existe pas déjà
|
||||||
|
if os.path.exists(new_path):
|
||||||
|
print_log(f'Le fichier de destination existe déjà: {fixed_filename}', 'WARNING')
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Affiche l'action
|
||||||
|
print_log(f'Renommage: {filename}')
|
||||||
|
print_log(f' -> {fixed_filename}')
|
||||||
|
|
||||||
|
# Renomme le fichier (sauf en mode simulation)
|
||||||
|
if not dry_run:
|
||||||
|
try:
|
||||||
|
os.rename(old_path, new_path)
|
||||||
|
return True
|
||||||
|
except OSError as e:
|
||||||
|
print_log(f'Erreur lors du renommage: {e}', 'ERROR')
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
print_log('[MODE SIMULATION - Fichier non renommé]', 'INFO')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Fonction principale du script."""
|
||||||
|
|
||||||
|
# Récupère le répertoire de travail depuis les variables d'environnement NZBGet
|
||||||
|
nzb_directory = os.environ.get('NZBPP_DIRECTORY')
|
||||||
|
|
||||||
|
if not nzb_directory:
|
||||||
|
print_log('Erreur: NZBPP_DIRECTORY non défini', 'ERROR')
|
||||||
|
sys.exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
if not os.path.isdir(nzb_directory):
|
||||||
|
print_log(f'Erreur: Le répertoire n\'existe pas: {nzb_directory}', 'ERROR')
|
||||||
|
sys.exit(POSTPROCESS_ERROR)
|
||||||
|
|
||||||
|
print_log('=== Début du traitement de correction d\'encodage ===')
|
||||||
|
print_log(f'Répertoire: {nzb_directory}')
|
||||||
|
|
||||||
|
# Récupère les options
|
||||||
|
extensions_filter = get_file_extensions()
|
||||||
|
dry_run = is_dry_run()
|
||||||
|
|
||||||
|
if dry_run:
|
||||||
|
print_log('MODE SIMULATION ACTIVÉ - Aucun fichier ne sera modifié', 'WARNING')
|
||||||
|
|
||||||
|
if extensions_filter:
|
||||||
|
print_log(f'Filtrage par extensions: {", ".join(extensions_filter)}')
|
||||||
|
|
||||||
|
# Parcourt tous les fichiers récursivement
|
||||||
|
files_renamed = 0
|
||||||
|
files_processed = 0
|
||||||
|
|
||||||
|
for dirpath, dirnames, filenames in os.walk(nzb_directory):
|
||||||
|
for filename in filenames:
|
||||||
|
files_processed += 1
|
||||||
|
|
||||||
|
if process_file(os.path.join(dirpath, filename), dirpath, filename, extensions_filter, dry_run):
|
||||||
|
files_renamed += 1
|
||||||
|
|
||||||
|
# Affiche le résumé
|
||||||
|
print_log('=== Résumé ===')
|
||||||
|
print_log(f'Fichiers traités: {files_processed}')
|
||||||
|
print_log(f'Fichiers renommés: {files_renamed}')
|
||||||
|
|
||||||
|
if files_renamed > 0:
|
||||||
|
print_log('Correction d\'encodage terminée avec succès')
|
||||||
|
sys.exit(POSTPROCESS_SUCCESS)
|
||||||
|
else:
|
||||||
|
print_log('Aucun fichier à corriger')
|
||||||
|
sys.exit(POSTPROCESS_NONE)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
67
QUICKSTART.md
Normal file
67
QUICKSTART.md
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
# 🚀 DÉMARRAGE RAPIDE
|
||||||
|
|
||||||
|
## Test AVANT installation (recommandé)
|
||||||
|
|
||||||
|
Testez d'abord le script sur vos fichiers existants :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Simulation (ne modifie rien)
|
||||||
|
python3 test_fix_encoding.py /chemin/vers/vos/fichiers
|
||||||
|
|
||||||
|
# Application réelle des corrections
|
||||||
|
python3 test_fix_encoding.py /chemin/vers/vos/fichiers --fix
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation dans NZBGet
|
||||||
|
|
||||||
|
### 1. Copiez le script
|
||||||
|
|
||||||
|
**Linux/macOS/Docker :**
|
||||||
|
```bash
|
||||||
|
cp FixEncoding.py /path/to/nzbget/scripts/
|
||||||
|
chmod +x /path/to/nzbget/scripts/FixEncoding.py
|
||||||
|
```
|
||||||
|
|
||||||
|
**Windows :**
|
||||||
|
Copiez `FixEncoding.py` dans `C:\ProgramData\NZBGet\scripts\`
|
||||||
|
|
||||||
|
### 2. Configurez NZBGet
|
||||||
|
|
||||||
|
1. Ouvrez l'interface web de NZBGet
|
||||||
|
2. **Settings** → Cliquez **Reload** (en bas à droite)
|
||||||
|
3. Cherchez **FIXENCODING** dans les paramètres
|
||||||
|
4. (Optionnel) Activez **DryRun=yes** pour un premier test
|
||||||
|
5. **Save all changes**
|
||||||
|
|
||||||
|
### 3. Activez le script
|
||||||
|
|
||||||
|
**Pour tous les téléchargements :**
|
||||||
|
- **Settings** → **Extension Scripts** → Cochez **FixEncoding.py**
|
||||||
|
|
||||||
|
**OU par catégorie :**
|
||||||
|
- **Settings** → **Categories** → Sélectionnez une catégorie
|
||||||
|
- **Extensions** → Ajoutez **FixEncoding.py**
|
||||||
|
|
||||||
|
### 4. Testez
|
||||||
|
|
||||||
|
1. **History** → Sélectionnez un téléchargement
|
||||||
|
2. **Post-Process Again** → Cochez **FixEncoding.py**
|
||||||
|
3. **Start**
|
||||||
|
4. Consultez **Messages** pour voir les résultats
|
||||||
|
|
||||||
|
## ✅ C'est tout !
|
||||||
|
|
||||||
|
Le script corrigera automatiquement :
|
||||||
|
- `19-La grâce.flac` → `19-La grâce.flac`
|
||||||
|
- `06-La fièvre dans le sang.flac` → `06-La fièvre dans le sang.flac`
|
||||||
|
- `02-Géant.flac` → `02-Géant.flac`
|
||||||
|
|
||||||
|
## 📖 Documentation complète
|
||||||
|
|
||||||
|
Consultez **README.md** pour plus de détails et options.
|
||||||
|
|
||||||
|
## ⚙️ Options principales
|
||||||
|
|
||||||
|
- **Debug=yes** : Affiche plus d'informations dans les logs
|
||||||
|
- **FileExtensions=.flac,.mp3** : Limite aux extensions spécifiées
|
||||||
|
- **DryRun=yes** : Mode simulation (recommandé pour le premier test)
|
||||||
190
README.md
Normal file
190
README.md
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
# Script de Correction d'Encodage pour NZBGet
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Ce script de post-processing pour NZBGet corrige automatiquement les problèmes d'encodage dans les noms de fichiers. Il est particulièrement utile pour corriger les caractères français mal encodés (UTF-8 interprété comme ISO-8859-1).
|
||||||
|
|
||||||
|
### Problèmes corrigés
|
||||||
|
|
||||||
|
Le script détecte et corrige automatiquement :
|
||||||
|
- `é` → `é`
|
||||||
|
- `è` → `è`
|
||||||
|
- `ê` → `ê`
|
||||||
|
- `Ã ` → `à`
|
||||||
|
- `â` → `â`
|
||||||
|
- `ç` → `ç`
|
||||||
|
- `ô` → `ô`
|
||||||
|
- Et tous les autres caractères accentués français
|
||||||
|
|
||||||
|
**Exemple :**
|
||||||
|
- `19-La grâce.flac` → `19-La grâce.flac`
|
||||||
|
- `06-La fièvre dans le sang.flac` → `06-La fièvre dans le sang.flac`
|
||||||
|
- `02-Géant.flac` → `02-Géant.flac`
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### 1. Prérequis
|
||||||
|
|
||||||
|
- NZBGet installé et fonctionnel
|
||||||
|
- Python 3.x installé sur votre système
|
||||||
|
|
||||||
|
### 2. Installation du script
|
||||||
|
|
||||||
|
1. **Téléchargez** le fichier `FixEncoding.py`
|
||||||
|
|
||||||
|
2. **Copiez le script** dans le répertoire des scripts de NZBGet :
|
||||||
|
- **Linux/macOS** : `/path/to/nzbget/scripts/`
|
||||||
|
- **Windows** : `C:\ProgramData\NZBGet\scripts\`
|
||||||
|
- **Docker** : montez le script dans `/scripts/`
|
||||||
|
|
||||||
|
3. **Rendez le script exécutable** (Linux/macOS/Docker uniquement) :
|
||||||
|
```bash
|
||||||
|
chmod +x FixEncoding.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configuration dans NZBGet
|
||||||
|
|
||||||
|
1. Ouvrez l'interface web de NZBGet
|
||||||
|
2. Allez dans **Settings** (Paramètres)
|
||||||
|
3. Cliquez sur **Reload** en bas à droite pour que NZBGet détecte le nouveau script
|
||||||
|
4. Cherchez la section **FIXENCODING**
|
||||||
|
5. Configurez les options selon vos besoins (voir ci-dessous)
|
||||||
|
|
||||||
|
### 4. Activation du script
|
||||||
|
|
||||||
|
#### Option A : Global (pour tous les téléchargements)
|
||||||
|
|
||||||
|
1. Allez dans **Settings → Extension Scripts**
|
||||||
|
2. Activez **FixEncoding.py**
|
||||||
|
|
||||||
|
#### Option B : Par catégorie
|
||||||
|
|
||||||
|
1. Allez dans **Settings → Categories**
|
||||||
|
2. Sélectionnez une catégorie
|
||||||
|
3. Dans **Extensions**, ajoutez **FixEncoding.py**
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Le script propose plusieurs options configurables dans NZBGet :
|
||||||
|
|
||||||
|
### Debug
|
||||||
|
- **Valeurs** : `yes` / `no`
|
||||||
|
- **Défaut** : `no`
|
||||||
|
- **Description** : Active le mode débogage pour afficher plus d'informations dans les logs
|
||||||
|
|
||||||
|
### FileExtensions
|
||||||
|
- **Valeurs** : Extensions séparées par des virgules (ex: `.flac,.mp3,.mkv`)
|
||||||
|
- **Défaut** : Vide (tous les fichiers)
|
||||||
|
- **Description** : Limite le traitement aux fichiers avec ces extensions
|
||||||
|
|
||||||
|
### DryRun
|
||||||
|
- **Valeurs** : `yes` / `no`
|
||||||
|
- **Défaut** : `no`
|
||||||
|
- **Description** : Mode simulation - affiche ce qui serait fait sans modifier les fichiers
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
### Automatique
|
||||||
|
|
||||||
|
Une fois configuré, le script s'exécute automatiquement après chaque téléchargement et corrige les noms de fichiers si nécessaire.
|
||||||
|
|
||||||
|
### Test manuel
|
||||||
|
|
||||||
|
Pour tester le script sur un téléchargement déjà terminé :
|
||||||
|
|
||||||
|
1. Ouvrez l'interface web de NZBGet
|
||||||
|
2. Allez dans **History** (Historique)
|
||||||
|
3. Sélectionnez un téléchargement
|
||||||
|
4. Cliquez sur **Post-Process Again**
|
||||||
|
5. Sélectionnez **FixEncoding.py**
|
||||||
|
6. Cliquez sur **Start**
|
||||||
|
|
||||||
|
### Mode simulation (recommandé pour le premier test)
|
||||||
|
|
||||||
|
1. Dans **Settings**, activez **DryRun=yes** pour FixEncoding
|
||||||
|
2. Exécutez le script sur un téléchargement de test
|
||||||
|
3. Vérifiez les logs pour voir ce qui serait modifié
|
||||||
|
4. Si tout est correct, désactivez DryRun
|
||||||
|
|
||||||
|
## Vérification des logs
|
||||||
|
|
||||||
|
Pour voir ce que le script a fait :
|
||||||
|
|
||||||
|
1. Allez dans **Messages** dans NZBGet
|
||||||
|
2. Cherchez les messages `[INFO]` de FixEncoding
|
||||||
|
3. Vous verrez :
|
||||||
|
- Les fichiers détectés avec des problèmes d'encodage
|
||||||
|
- Les anciens et nouveaux noms
|
||||||
|
- Un résumé du nombre de fichiers traités
|
||||||
|
|
||||||
|
## Exemples de logs
|
||||||
|
|
||||||
|
### Succès
|
||||||
|
```
|
||||||
|
[INFO] === Début du traitement de correction d'encodage ===
|
||||||
|
[INFO] Répertoire: /downloads/Music/Album
|
||||||
|
[INFO] Renommage: 19-La grâce.flac
|
||||||
|
[INFO] -> 19-La grâce.flac
|
||||||
|
[INFO] Renommage: 06-La fièvre dans le sang.flac
|
||||||
|
[INFO] -> 06-La fièvre dans le sang.flac
|
||||||
|
[INFO] === Résumé ===
|
||||||
|
[INFO] Fichiers traités: 15
|
||||||
|
[INFO] Fichiers renommés: 2
|
||||||
|
[INFO] Correction d'encodage terminée avec succès
|
||||||
|
```
|
||||||
|
|
||||||
|
### Aucun fichier à corriger
|
||||||
|
```
|
||||||
|
[INFO] === Début du traitement de correction d'encodage ===
|
||||||
|
[INFO] Répertoire: /downloads/Music/Album
|
||||||
|
[INFO] === Résumé ===
|
||||||
|
[INFO] Fichiers traités: 10
|
||||||
|
[INFO] Fichiers renommés: 0
|
||||||
|
[INFO] Aucun fichier à corriger
|
||||||
|
```
|
||||||
|
|
||||||
|
## Compatibilité
|
||||||
|
|
||||||
|
Le script est compatible avec :
|
||||||
|
- ✅ Linux (toutes distributions)
|
||||||
|
- ✅ Windows (avec Python installé)
|
||||||
|
- ✅ macOS
|
||||||
|
- ✅ Docker (NZBGet en conteneur)
|
||||||
|
- ✅ NAS Synology, QNAP, etc. (avec Python)
|
||||||
|
|
||||||
|
## Dépannage
|
||||||
|
|
||||||
|
### Le script ne s'exécute pas
|
||||||
|
|
||||||
|
1. Vérifiez que Python 3 est installé :
|
||||||
|
```bash
|
||||||
|
python3 --version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Vérifiez les permissions du script :
|
||||||
|
```bash
|
||||||
|
ls -l /path/to/scripts/FixEncoding.py
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Activez le mode Debug et consultez les logs
|
||||||
|
|
||||||
|
### Les fichiers ne sont pas renommés
|
||||||
|
|
||||||
|
1. Vérifiez que le script est bien activé dans la configuration
|
||||||
|
2. Activez DryRun pour voir ce que le script détecte
|
||||||
|
3. Consultez les logs dans NZBGet
|
||||||
|
|
||||||
|
### Erreur "File exists"
|
||||||
|
|
||||||
|
Le script ne renommera pas un fichier si le nom de destination existe déjà. Vous devrez renommer manuellement l'un des deux fichiers.
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Pour toute question ou problème :
|
||||||
|
- Consultez les logs avec Debug=yes
|
||||||
|
- Vérifiez que vous utilisez Python 3.x
|
||||||
|
- Assurez-vous que le script a les bonnes permissions
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Script libre d'utilisation et de modification.
|
||||||
105
test_fix_encoding.py
Normal file
105
test_fix_encoding.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Script de test standalone pour vérifier la correction d'encodage.
|
||||||
|
Utilisez ce script pour tester la correction AVANT de l'intégrer à NZBGet.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python3 test_fix_encoding.py /chemin/vers/dossier
|
||||||
|
python3 test_fix_encoding.py /chemin/vers/dossier --fix (pour vraiment renommer)
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def is_encoding_issue(filename):
|
||||||
|
"""Détecte si un nom de fichier contient des problèmes d'encodage."""
|
||||||
|
patterns = [
|
||||||
|
'é', 'è', 'ê', 'ë', 'à ', 'â', 'ä', 'ç',
|
||||||
|
'ô', 'ö', 'ù', 'û', 'ü', 'î', 'ï', 'Å"',
|
||||||
|
'É', 'À'
|
||||||
|
]
|
||||||
|
return any(pattern in filename for pattern in patterns)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_encoding(filename):
|
||||||
|
"""Corrige le nom de fichier."""
|
||||||
|
try:
|
||||||
|
fixed = filename.encode('iso-8859-1').decode('utf-8')
|
||||||
|
return fixed
|
||||||
|
except (UnicodeDecodeError, UnicodeEncodeError):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Usage: python3 test_fix_encoding.py /chemin/vers/dossier [--fix]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
directory = sys.argv[1]
|
||||||
|
do_fix = '--fix' in sys.argv
|
||||||
|
|
||||||
|
if not os.path.isdir(directory):
|
||||||
|
print(f"Erreur: Le répertoire '{directory}' n'existe pas")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"\n{'='*70}")
|
||||||
|
print(f"TEST DE CORRECTION D'ENCODAGE")
|
||||||
|
print(f"{'='*70}")
|
||||||
|
print(f"Répertoire: {directory}")
|
||||||
|
print(f"Mode: {'CORRECTION' if do_fix else 'SIMULATION'}")
|
||||||
|
print(f"{'='*70}\n")
|
||||||
|
|
||||||
|
files_with_issues = 0
|
||||||
|
files_corrected = 0
|
||||||
|
|
||||||
|
for dirpath, dirnames, filenames in os.walk(directory):
|
||||||
|
for filename in filenames:
|
||||||
|
if is_encoding_issue(filename):
|
||||||
|
files_with_issues += 1
|
||||||
|
fixed = fix_encoding(filename)
|
||||||
|
|
||||||
|
if fixed and fixed != filename:
|
||||||
|
rel_path = os.path.relpath(dirpath, directory)
|
||||||
|
if rel_path == '.':
|
||||||
|
rel_path = ''
|
||||||
|
|
||||||
|
print(f"\n📁 {rel_path if rel_path else '(racine)'}")
|
||||||
|
print(f" ❌ Avant : {filename}")
|
||||||
|
print(f" ✅ Après : {fixed}")
|
||||||
|
|
||||||
|
if do_fix:
|
||||||
|
old_path = os.path.join(dirpath, filename)
|
||||||
|
new_path = os.path.join(dirpath, fixed)
|
||||||
|
|
||||||
|
if os.path.exists(new_path):
|
||||||
|
print(f" ⚠️ ERREUR: Le fichier de destination existe déjà!")
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
os.rename(old_path, new_path)
|
||||||
|
print(f" ✔️ Renommé avec succès")
|
||||||
|
files_corrected += 1
|
||||||
|
except OSError as e:
|
||||||
|
print(f" ❌ ERREUR: {e}")
|
||||||
|
else:
|
||||||
|
files_corrected += 1
|
||||||
|
|
||||||
|
print(f"\n{'='*70}")
|
||||||
|
print(f"RÉSUMÉ")
|
||||||
|
print(f"{'='*70}")
|
||||||
|
print(f"Fichiers avec problèmes d'encodage: {files_with_issues}")
|
||||||
|
print(f"Fichiers {'corrigés' if do_fix else 'à corriger'}: {files_corrected}")
|
||||||
|
|
||||||
|
if not do_fix and files_corrected > 0:
|
||||||
|
print(f"\n💡 Pour appliquer les corrections, relancez avec: --fix")
|
||||||
|
elif do_fix and files_corrected > 0:
|
||||||
|
print(f"\n✅ Les fichiers ont été corrigés avec succès!")
|
||||||
|
elif files_corrected == 0:
|
||||||
|
print(f"\n✅ Aucun problème d'encodage détecté!")
|
||||||
|
|
||||||
|
print(f"{'='*70}\n")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Loading…
x
Reference in New Issue
Block a user