2025-04-28 14:57:36 +00:00
|
|
|
#!/bin/bash
|
2025-04-20 12:11:47 +00:00
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Configuration des chemins et du fichier de log
|
|
|
|
|
# ----------------------------------
|
2025-04-28 14:57:36 +00:00
|
|
|
ORG_PATH="/home/************/downloads/rtorrent"
|
|
|
|
|
FINAL_PATH="/home/***********"
|
|
|
|
|
LOG_FILE="/home/*************/torrentend_debug.log"
|
|
|
|
|
BIN_PATH="/home/************/bin"
|
2025-04-20 12:11:47 +00:00
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Couleurs pour l'affichage (facultatif)
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
VERT="\033[0;32m"
|
|
|
|
|
BLEU="\033[1;34m"
|
|
|
|
|
NORMAL="\033[0;39m"
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Lecture des arguments
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
file="$1"
|
|
|
|
|
#etiq="$2"
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Fonction de log simplifiée
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
log() {
|
|
|
|
|
echo "$1" >> "$LOG_FILE"
|
|
|
|
|
}
|
|
|
|
|
log "-------------------------------"
|
|
|
|
|
log "$(date): Script exécuté"
|
|
|
|
|
log "Base filename: $file"
|
|
|
|
|
log "DEBUT DE TRAITEMENT"
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# N'exécute que pour les torrents étiquetés AUTO
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
#[[ "$etiq" != "AUTO" ]] && exit 0
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Nettoyage du répertoire : suppression des samples et renommage des espaces
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
clean_dir() {
|
2025-04-28 14:57:36 +00:00
|
|
|
rm -rf "${1}"/*sample*
|
|
|
|
|
rename 's/ /_/g' "${1}"/* 2>/dev/null || true
|
2025-04-20 12:11:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Copie en hardlink
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
copieorg() {
|
|
|
|
|
cp -rl "$1" "$2"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Suppression des accents
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
remove_accents() {
|
|
|
|
|
echo "$1" | iconv -f utf8 -t ascii//TRANSLIT
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Nettoyage du nom de fichier :
|
|
|
|
|
# - suppression du titre d'épisode
|
|
|
|
|
# - suppression de (TOS)
|
|
|
|
|
# - gestion des apostrophes + Majuscule suivante
|
|
|
|
|
# - conversion espaces/underscores en points
|
|
|
|
|
# - conservation uniquement des segments utiles
|
|
|
|
|
# - dernier segment préfixé par un tiret
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
sanitize_name() {
|
|
|
|
|
# Extraction du nom de base et de l'extension
|
|
|
|
|
local filepath="$1"
|
|
|
|
|
local filename="$(basename "$filepath")"
|
|
|
|
|
local ext="${filename##*.}"
|
|
|
|
|
local name="${filename%.*}"
|
2025-04-28 14:57:36 +00:00
|
|
|
|
|
|
|
|
# Calculer le nombre d'espaces dans le nom
|
|
|
|
|
local no_space
|
|
|
|
|
no_space=$(printf '%s' "$name" | tr -d ' ')
|
|
|
|
|
local space_count=$(( ${#name} - ${#no_space} ))
|
|
|
|
|
|
|
|
|
|
# Si le nom est entièrement en minuscules
|
|
|
|
|
# OU contient au moins 2 espaces (pas forcément contigus),
|
|
|
|
|
# on bascule sur le dossier parent
|
|
|
|
|
if [[ "$name" == "${name,,}" ]] || (( space_count >= 2 )); then
|
2025-04-20 12:11:47 +00:00
|
|
|
local parent="$(basename "$(dirname "$filepath")")"
|
|
|
|
|
name="$(remove_accents "$parent")"
|
|
|
|
|
fi
|
2025-04-28 14:57:36 +00:00
|
|
|
|
2025-04-20 12:11:47 +00:00
|
|
|
# Translit accents
|
|
|
|
|
name="$(remove_accents "$name")"
|
|
|
|
|
# Normalisation des séparateurs
|
|
|
|
|
name="${name//[ _]/.}"
|
|
|
|
|
|
|
|
|
|
# Découpage en segments
|
|
|
|
|
IFS='.' read -ra parts <<< "$name"
|
|
|
|
|
local total=${#parts[@]}
|
|
|
|
|
local keep=()
|
|
|
|
|
local i j k
|
2025-04-28 14:57:36 +00:00
|
|
|
local marker_index=-1
|
|
|
|
|
local pattern
|
2025-04-20 12:11:47 +00:00
|
|
|
|
2025-04-28 14:57:36 +00:00
|
|
|
# --- 1) d'abord, on regarde si on a un SxxEyy quelque part ---
|
|
|
|
|
for ((i=0; i<total; i++)); do
|
|
|
|
|
if [[ "${parts[i]}" =~ ^[Ss][0-9]{2}[Ee][0-9]{2}$ ]]; then
|
|
|
|
|
marker_index=$i
|
|
|
|
|
pattern='^[Ss][0-9]{2}[Ee][0-9]{2}$'
|
2025-04-20 12:11:47 +00:00
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
2025-04-28 14:57:36 +00:00
|
|
|
# --- 2) si pas de série, on cherche une année (film) ---
|
|
|
|
|
if (( marker_index < 0 )); then
|
|
|
|
|
for ((i=0; i<total; i++)); do
|
|
|
|
|
if [[ "${parts[i]}" =~ ^(19|20)[0-9]{2}$ ]]; then
|
|
|
|
|
marker_index=$i
|
|
|
|
|
pattern='^(19|20)[0-9]{2}$'
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# --- 3) si on a trouvé un marqueur, on construit keep[] ---
|
|
|
|
|
if (( marker_index >= 0 )); then
|
|
|
|
|
# on garde tout jusqu'au marqueur inclus
|
|
|
|
|
keep=("${parts[@]:0:marker_index+1}")
|
|
|
|
|
# on cherche ensuite le premier tag qualité/langue
|
|
|
|
|
for ((j=marker_index+1; j<total; j++)); do
|
|
|
|
|
tag="${parts[j]^^}"
|
|
|
|
|
if [[ "$tag" =~ ^(REPACK|PROPER|INTERNAL|FINAL|SUBFRENCH|TRUEFRENCH|FRENCH|MULTI|VOSTFR)$ ]] \
|
|
|
|
|
|| [[ "$tag" =~ ^[0-9]{3,4}P$ ]]; then
|
|
|
|
|
# on ajoute tout à partir de ce tag
|
|
|
|
|
keep+=("${parts[@]:j}")
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
else
|
|
|
|
|
# si pas de marqueur du tout, on garde tout
|
|
|
|
|
keep=("${parts[@]}")
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# reconstruire la base nettoyée
|
2025-04-20 12:11:47 +00:00
|
|
|
local out
|
|
|
|
|
out=$(IFS='.'; echo "${keep[*]}")
|
|
|
|
|
|
|
|
|
|
# nettoyage TOS, espaces, caractères interdits
|
|
|
|
|
out=$(echo "$out" | sed -e 's/(TOS)//Ig' -e 's/[ _]/./g' -e 's/[^A-Za-z0-9.-]//g')
|
|
|
|
|
# apostrophes + majuscule suivante avec perl
|
|
|
|
|
out=$(echo "$out" | perl -pe 's/'"'"'([A-Za-z])/.\U\1/g')
|
|
|
|
|
# forcer le "i" minuscule dans MULTI, FINAL et INTERNAL
|
|
|
|
|
out=${out//.MULTI./.MULTi.}
|
|
|
|
|
out=${out//.FINAL./.FiNAL.}
|
|
|
|
|
out=${out//.INTERNAL./.iNTERNAL.}
|
2025-04-28 14:57:36 +00:00
|
|
|
|
2025-04-20 12:11:47 +00:00
|
|
|
# Préfixe du dernier segment par un tiret uniquement si aucune autre tiret interne
|
|
|
|
|
local last="${out##*.}"
|
|
|
|
|
if [[ "$last" != *-* ]]; then
|
|
|
|
|
out="${out%.*}-$last"
|
|
|
|
|
fi
|
2025-04-28 14:57:36 +00:00
|
|
|
|
2025-04-20 12:11:47 +00:00
|
|
|
# Ajout de l'extension
|
|
|
|
|
printf "%s.%s" "$out" "$ext"
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-28 14:57:36 +00:00
|
|
|
|
2025-04-20 12:11:47 +00:00
|
|
|
# ----------------------------------
|
|
|
|
|
# Traitement des .mkv uniquement
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
process_mkv() {
|
|
|
|
|
local src="$1" dst="$2"
|
|
|
|
|
local out="$(sanitize_name "$src")"
|
|
|
|
|
copieorg "$src" "$dst/$out"
|
|
|
|
|
$BIN_PATH/postauto add "$dst/$out"
|
|
|
|
|
echo -e "${BLEU}OK:${NORMAL} $out ajouté"
|
|
|
|
|
log "$src -> $dst/$out"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
# Upload des .nfo avec renommage à la volée
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
upload_nfo() {
|
|
|
|
|
local src="$1"
|
|
|
|
|
# Génère un nom nettoyé pour le NFO
|
|
|
|
|
local fn="$(sanitize_name "$src")"
|
|
|
|
|
# Envoie le nfo sous le nom nettoyé sans renommer le fichier sur disque
|
|
|
|
|
curl -s -k -L -m 60 \
|
|
|
|
|
-F "nfo=@${src};filename=${fn}" \
|
|
|
|
|
-F upload=upload "https://unfr.pw/nfos-upload"
|
|
|
|
|
log "UPLOAD NFO $src -> $fn"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ----------------------------------
|
|
|
|
|
cd "$ORG_PATH" || exit 1
|
|
|
|
|
clean_dir "$file"
|
|
|
|
|
|
|
|
|
|
mapfile -d '' mkv_files < <(find "$file" -maxdepth 3 -type f -iname '*.mkv' -print0 | sort -z)
|
|
|
|
|
for mkv in "${mkv_files[@]}"; do
|
|
|
|
|
process_mkv "$mkv" "$FINAL_PATH"
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
mapfile -d '' nfo_files < <(find "$file" -maxdepth 3 -type f -iname '*.nfo' -print0)
|
|
|
|
|
for nfo in "${nfo_files[@]}"; do
|
|
|
|
|
upload_nfo "$nfo"
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
log "FIN DE TRAITEMENT"
|
|
|
|
|
log "-------------------------------"
|
|
|
|
|
exit 0
|