#!/usr/bin/python3

# Sodara HANG   v1.0    2016-02-08    Version initiale
# Sodara HANG   v1.1    2016-02-09    Verification fichier existant avant de renommer

import os,re,unicodedata,datetime,argparse

def renommage(pattern, root, fichier, isTraitement):
    # Si le fichier ou repertoire contient des caracteres non autorises
    if re.search(pattern, fichier):
        print(str(datetime.datetime.now()) + " Répertoire: " + root.encode('utf-8','replace').decode('utf-8'))
        # On remplace les espaces
        s = fichier.replace(" ", "_")
        # On enleve les accents
        s1 = unicodedata.normalize('NFKD', s).encode('ascii','ignore').decode("utf-8")
        # S'il reste des caracteres interdits on les remplace par des tirets
        if re.search(pattern, s1):
            s1 = re.sub(pattern, "-", s1)
        # On affiche l'ancien et le nouveau
        print(str(datetime.datetime.now()) + " Avant Renommage: " + fichier.encode('utf-8','replace').decode('utf-8'))
        # Si ce n'est pas du test, on renomme
        if isTraitement:
            # Vérifier que le fichier ou repertoire cible n'existe pas déjà
            if os.path.exists(os.path.join(root, s1)):
                s1 += "-renomme"
            os.rename(os.path.join(root, fichier), os.path.join(root, s1))
            print(str(datetime.datetime.now()) + " Renommage effectué")
        print(str(datetime.datetime.now()) + " Après Renommage: " + s1)

pattern = "[^0-9a-zA-Z._-]"

parser = argparse.ArgumentParser(description='Renomme les répertoires et fichiers contenant des caractères spéciaux ou encodés différemment. Les accents sont supprimés, les espaces remplacés par des underscores, les autres caractères spéciaux par des tirets. Par défaut, le script ne fait qu\'analyser la situation dans le répertoire.\nLe script doit être exécuté plusieurs fois car dans certains cas, les répertoires ne sont pas analysables avant renommage.')
parser.add_argument('-t', action='store_true', default=False, dest='traitement', help='Effectue réellement le traitement en renommant les fichiers')
parser.add_argument('-p', action='store', default=".", dest='path', help='Chemin racine qui sera analysé pour le renommage récursif')
args = parser.parse_args()

print(str(datetime.datetime.now()) + " Analyse du répertoire: " + args.path)
if not args.traitement:
    print(str(datetime.datetime.now()) + " ANALYSE SEULEMENT, pas de renommage")
print(str(datetime.datetime.now()) + " ANALYSE DES *REPERTOIRES*")
for root, dirs, files in os.walk(args.path):
    for d in dirs:
        renommage(pattern, root, d, args.traitement)
print(str(datetime.datetime.now()) + " ANALYSE DES *FICHIERS*")
for root, dirs, files in os.walk(args.path):
    for f in files:
        renommage(pattern, root, f, args.traitement)
