205 lines
4.8 KiB
Bash
Executable File
205 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ==========================================
|
|
# Fonctions utilitaires
|
|
# ==========================================
|
|
|
|
echo "AVANT D UTILISER VOIR LE PB DU FAIT QUE CA FAIT A LA SUITE AU LIEU DE DOUBLER LES NUM EXISTANT"
|
|
echo "Ex E01 => E01-E02 / E02 => E03-E04 / E04 => E07-E08 actuellement E05-E06"
|
|
exit
|
|
|
|
# Extrait le nom de la série depuis un nom de fichier.
|
|
# Exemple :
|
|
# "Adventure Time - S02E01.mkv" -> "Adventure Time"
|
|
extract_series_name() {
|
|
local filename="$1"
|
|
local basename="${filename%.*}"
|
|
|
|
if [[ "$basename" =~ ^(.+)[[:space:]]-[[:space:]]S[0-9]{1,2}E[0-9]{1,3} ]]; then
|
|
echo "${BASH_REMATCH[1]}"
|
|
fi
|
|
}
|
|
|
|
# Extrait le numéro de saison depuis un nom de fichier.
|
|
# Exemple :
|
|
# "Adventure Time - S02E01.mkv" -> "2"
|
|
extract_season() {
|
|
local filename="$1"
|
|
|
|
if [[ "$filename" =~ [Ss]([0-9]{1,2})[Ee][0-9]{1,3} ]]; then
|
|
# Supprime les zéros initiaux (02 -> 2)
|
|
echo $((10#${BASH_REMATCH[1]}))
|
|
fi
|
|
}
|
|
|
|
# Retourne la valeur si tous les éléments sont identiques.
|
|
# Sinon retourne une chaîne vide.
|
|
get_uniform_value() {
|
|
local values=("$@")
|
|
local first="${values[0]}"
|
|
|
|
[ -z "$first" ] && return 1
|
|
|
|
for value in "${values[@]}"; do
|
|
[ "$value" != "$first" ] && return 1
|
|
done
|
|
|
|
echo "$first"
|
|
}
|
|
|
|
# Demande une valeur non vide à l'utilisateur.
|
|
# Si une valeur par défaut est fournie, Entrée seule l'utilise.
|
|
prompt_required() {
|
|
local label="$1"
|
|
local default="$2"
|
|
local value
|
|
|
|
while true; do
|
|
if [ -n "$default" ]; then
|
|
read -rp "$label [$default] : " value
|
|
value="${value:-$default}"
|
|
else
|
|
read -rp "$label : " value
|
|
fi
|
|
|
|
if [ -n "$value" ]; then
|
|
echo "$value"
|
|
return
|
|
fi
|
|
|
|
echo "Cette valeur est obligatoire."
|
|
done
|
|
}
|
|
|
|
# Génère le nouveau nom de fichier.
|
|
generate_filename() {
|
|
local index="$1"
|
|
local original_file="$2"
|
|
|
|
local extension="${original_file##*.}"
|
|
local ep1=$((index * 2 - 1))
|
|
local ep2=$((index * 2))
|
|
|
|
printf "%s - S%02dE%02d-E%02d.%s" \
|
|
"$SERIE" "$SAISON" "$ep1" "$ep2" "$extension"
|
|
}
|
|
|
|
# Demande confirmation.
|
|
confirm() {
|
|
local response
|
|
read -rp "Continuer ? [y/N] : " response
|
|
[[ "$response" =~ ^[Yy]$ ]]
|
|
}
|
|
|
|
# ==========================================
|
|
# Recherche des fichiers
|
|
# ==========================================
|
|
|
|
shopt -s nullglob
|
|
FILES=( *.* )
|
|
|
|
if [ ${#FILES[@]} -eq 0 ]; then
|
|
echo "Aucun fichier trouvé dans : $(pwd)"
|
|
exit 1
|
|
fi
|
|
|
|
# ==========================================
|
|
# Détection automatique
|
|
# ==========================================
|
|
|
|
SERIES_FOUND=()
|
|
SEASONS_FOUND=()
|
|
|
|
for file in "${FILES[@]}"; do
|
|
series="$(extract_series_name "$file")"
|
|
season="$(extract_season "$file")"
|
|
|
|
[ -n "$series" ] && SERIES_FOUND+=("$series")
|
|
[ -n "$season" ] && SEASONS_FOUND+=("$season")
|
|
done
|
|
|
|
DEFAULT_SERIE="$(get_uniform_value "${SERIES_FOUND[@]}")"
|
|
DEFAULT_SAISON="$(get_uniform_value "${SEASONS_FOUND[@]}")"
|
|
|
|
# ==========================================
|
|
# Informations de détection
|
|
# ==========================================
|
|
|
|
echo "Répertoire courant : $(pwd)"
|
|
echo "Nombre de fichiers trouvés : ${#FILES[@]}"
|
|
echo
|
|
|
|
if [ -z "$DEFAULT_SERIE" ]; then
|
|
echo "Le nom de série n'a pas pu être détecté de manière uniforme."
|
|
else
|
|
echo "Nom de série détecté : $DEFAULT_SERIE"
|
|
fi
|
|
|
|
if [ -z "$DEFAULT_SAISON" ]; then
|
|
echo "Le numéro de saison n'a pas pu être détecté de manière uniforme."
|
|
else
|
|
echo "Saison détectée : $DEFAULT_SAISON"
|
|
fi
|
|
|
|
echo
|
|
|
|
# ==========================================
|
|
# Saisie utilisateur
|
|
# ==========================================
|
|
|
|
SERIE="$(prompt_required "Nom de la série" "$DEFAULT_SERIE")"
|
|
SAISON="$(prompt_required "Numéro de saison" "$DEFAULT_SAISON")"
|
|
|
|
# Validation numérique
|
|
if ! [[ "$SAISON" =~ ^[0-9]+$ ]]; then
|
|
echo "Le numéro de saison doit être un entier positif."
|
|
exit 1
|
|
fi
|
|
|
|
# ==========================================
|
|
# Aperçu
|
|
# ==========================================
|
|
|
|
FIRST_FILE="${FILES[0]}"
|
|
FIRST_NEW_NAME="$(generate_filename 1 "$FIRST_FILE")"
|
|
|
|
echo
|
|
echo "Exemple de renommage :"
|
|
echo " '$FIRST_FILE'"
|
|
echo " ->"
|
|
echo " '$FIRST_NEW_NAME'"
|
|
echo
|
|
|
|
# ==========================================
|
|
# Confirmation
|
|
# ==========================================
|
|
|
|
if ! confirm; then
|
|
echo "Opération annulée."
|
|
exit 0
|
|
fi
|
|
|
|
# ==========================================
|
|
# Renommage
|
|
# ==========================================
|
|
|
|
echo
|
|
echo "Renommage en cours..."
|
|
|
|
INDEX=1
|
|
|
|
for file in "${FILES[@]}"; do
|
|
new_name="$(generate_filename "$INDEX" "$file")"
|
|
|
|
if [ -e "$new_name" ]; then
|
|
echo "Ignoré (fichier existant) : '$new_name'"
|
|
else
|
|
mv -- "$file" "$new_name"
|
|
echo "'$file' -> '$new_name'"
|
|
fi
|
|
|
|
((INDEX++))
|
|
done
|
|
|
|
echo
|
|
echo "Terminé." |