Linux_frogg-profile.d/script/rename_double_season.sh

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é."