postprocess/postprocess.sh
2025-04-20 12:13:57 +00:00

178 lines
5.0 KiB
Bash

#!/bin/bash -x
# ----------------------------------
# Configuration des chemins et du fichier de log
# ----------------------------------
ORG_PATH="/home/**********/downloads/rtorrent"
FINAL_PATH="/home/************"
LOG_FILE="/home/**********/postprocess.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() {
rm -rf "${1}"/*sample*
rename 's/ /_/g' "${1}"/* 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%.*}"
# Si le nom de fichier est entièrement en minuscules, on utilise le dossier parent
if [[ "$name" == "${name,,}" ]]; 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
# Parcours des segments pour trouver e.g. S01E02
for ((i=0;i<total;i++)); do
keep+=("${parts[i]}")
if [[ ${parts[i]} =~ ^[Ss][0-9]{2}[Ee][0-9]{2}$ ]]; then
# trouver marqueur qualite/langue
for ((j=i+1;j<total;j++)); do
tag="${parts[j]^^}"
if [[ "$tag" =~ ^(REPACK|PROPER|INTERNAL|FINAL|SUBFRENCH|FRENCH|MULTI|VOSTFR)$ ]] || [[ "$tag" =~ ^[0-9]{3,4}P$ ]]; then
break
fi
done
# conserver la suite
for ((k=j;k<total;k++)); do
keep+=("${parts[k]}")
done
break
fi
done
# construire 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