postprocess/postprocess.sh

209 lines
6.0 KiB
Bash
Raw Normal View History

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 22:50:50 +00:00
# Supprime tous les répertoires ou fichiers avec "sample" (n'importe quelle casse)
2025-04-29 08:45:30 +00:00
find "$file" -maxdepth 1 -iname '*sample*' -exec rm -rf {} +
2025-04-28 22:50:50 +00:00
# Renommage des espaces
2025-04-29 08:45:30 +00:00
rename 's/ /_/g' "$file"/* 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
2025-04-29 08:09:03 +00:00
# On veut vérifier que name ne contient PAS lun des mots suivants
local upper_name="${name^^}"
2025-04-28 14:57:36 +00:00
# Si le nom est entièrement en minuscules
2025-04-29 08:09:03 +00:00
# OU ne contient aucun des mots-clés SUBFRENCH|TRUEFRENCH|FRENCH|MULTI|VOSTFR
if [[ "$name" == "${name,,}" ]] || ! [[ "$upper_name" =~ SUBFRENCH|TRUEFRENCH|FRENCH|MULTI|VOSTFR ]]; 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