209 lines
6.0 KiB
Bash
209 lines
6.0 KiB
Bash
#!/bin/bash
|
||
|
||
# ----------------------------------
|
||
# Configuration des chemins et du fichier de log
|
||
# ----------------------------------
|
||
ORG_PATH="/home/************/downloads/rtorrent"
|
||
FINAL_PATH="/home/***********"
|
||
LOG_FILE="/home/*************/torrentend_debug.log"
|
||
BIN_PATH="/home/************/bin"
|
||
|
||
# ----------------------------------
|
||
# 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() {
|
||
# Supprime tous les répertoires ou fichiers avec "sample" (n'importe quelle casse)
|
||
find "$file" -maxdepth 1 -iname '*sample*' -exec rm -rf {} +
|
||
# Renommage des espaces
|
||
rename 's/ /_/g' "$file"/* 2>/dev/null || true
|
||
}
|
||
|
||
# ----------------------------------
|
||
# 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%.*}"
|
||
|
||
# On veut vérifier que name ne contient PAS l’un des mots suivants
|
||
local upper_name="${name^^}"
|
||
|
||
# Si le nom est entièrement en minuscules
|
||
# OU ne contient aucun des mots-clés SUBFRENCH|TRUEFRENCH|FRENCH|MULTI|VOSTFR
|
||
if [[ "$name" == "${name,,}" ]] || ! [[ "$upper_name" =~ SUBFRENCH|TRUEFRENCH|FRENCH|MULTI|VOSTFR ]]; then
|
||
local parent="$(basename "$(dirname "$filepath")")"
|
||
name="$(remove_accents "$parent")"
|
||
fi
|
||
|
||
# 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
|
||
local marker_index=-1
|
||
local pattern
|
||
|
||
# --- 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}$'
|
||
break
|
||
fi
|
||
done
|
||
|
||
# --- 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
|
||
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.}
|
||
|
||
# Préfixe du dernier segment par un tiret uniquement si aucune autre tiret interne
|
||
local last="${out##*.}"
|
||
if [[ "$last" != *-* ]]; then
|
||
out="${out%.*}-$last"
|
||
fi
|
||
|
||
# Ajout de l'extension
|
||
printf "%s.%s" "$out" "$ext"
|
||
}
|
||
|
||
|
||
# ----------------------------------
|
||
# 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
|