178 lines
5.0 KiB
Bash
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/**********/psotprocess.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
|