#!/bin/bash
## Anonyme
## sudo pacman -S ffmpeg handbrake-cli mkvtoolnix-cli mplayer lsdvd mediainfo
## x264
## x264_10bit
## nvenc_h264
## x265
## x265_10bit
## x265_12bit
## nvenc_h265
## mpeg4
## mpeg2
## VP8
## VP9
## theora
PATH=$PATH:/sbin:/usr/sbin
## CONDITION : UN SEUL DVD-VIDÉO.
mapfile -t BLKID < <(blkid /dev/sr* |sed -E 's/^([^:]+): .*/\1/')
if [[ "${#BLKID[@]}" -eq "0" ]] ; then
echo "Aucun DVD trouvé: abandon"
exit 0
fi
idx=0
for dev in "${BLKID[@]}"; do
mnt=$(mount |sed -n -E "s/^${dev//\//\\\/} on (.*) type .*\$/\\1/p")
[[ -z "$mnt" ]] && continue
if [[ -f "$mnt/VIDEO_TS/VIDEO_TS.IFO" ]]; then
DEVICES[$idx]="$dev"
MOUNT_POINTS[$idx]="$mnt"
idx=$((idx+1))
fi
done
if [[ "${#DEVICES[@]}" -eq 0 ]]; then
echo "Aucun dvd vidéo monté : Abandon"
exit 0
elif [[ "${#DEVICES[@]}" -gt 1 ]]; then
echo "Il y a plus d'un dvd video détecté : Abandon"
exit 0
fi
DEVICE=${DEVICES[0]}
MOUNT_POINT=${MOUNT_POINTS[0]}
## LABEL DVD-VIDÉO & NOMBRE TOTAL DE TITRES SUR CELUI-CI.
idx=0
TITLE_COUNT=0
regexp='^Title: '
while read -r line; do
idx=$((idx+1))
if [[ "$idx" -eq 1 ]]; then
TITLE=${line#*: }
elif [[ "$line" =~ $regexp ]]; then
TITLE_COUNT=$((TITLE_COUNT+1))
fi
done < <(lsdvd "$DEVICE" 2>/dev/null)
unset regexp dev mnt idx BLKID DEVICES MOUNT_POINTS
if [[ -z "$TITLE" ]]; then
echo "Pas de dvd vidéo trouvé : abandon"
exit 0
fi
echo "Proceed..."
echo "DVD-Vidéo : $TITLE"
read -r -p "Ce nom convient-il ? [Y/n] " input
case $input in
[yY][eE][sS]|[yY])
echo "Yes"
mkdir -p "$TITLE/IFOS"
;;
[nN][oO]|[nN])
echo "No"
read -p "Entrer un nouveau nom: " TITLE
mkdir -p "$TITLE/IFOS"
;;
*)
echo "Invalid input..."
echo "Quit"
exit 1
;;
esac
for (( i=1; i<=TITLE_COUNT; i++ ))
do
## TITRES D4UNE DURÉE ÉGALE OU PLUS DE .... SECONDES [ ICI, 2 SECONDES]
LENGTH=$(mplayer -noconfig all -nocache -vo null -ao null -frames 0 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | \
sed -E -n 's/^.*ID_LENGTH=([0-9]+).*$/\1/p')
LIMIT=5
[[ "$LENGTH" -le "$LIMIT" ]] && continue
## FRAMES 15
COUNT_AUDIO_MPLAYER=$(mplayer -noconfig all -nocache -vo null -ao null -frames 15 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | grep -c "AUDIO:")
## POUR N'AVOIR QUE LE FRANÇAIS.
AUDIO_FRENCH=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null | grep "Language: fr" | awk '{print$4}' )
COUNT_AUDIO_FRENCH=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null |grep -c 'Language: fr')
AUDIO_LANG_LIST_FRENCH=$(echo $AUDIO_FRENCH | sed 's/[[:blank:]]/,/g')
## ICI BITRATE ET RATIO ORIGINAUX.
BITRATE=$(mplayer -noconfig all -nocache -vo null -ao null -frames 0 -identify -dvd-device "$DEVICE" dvdnav://"$i" 2>/dev/null | \
grep "VIDEO:" | awk '{print$8}' | sed 's/\.[^ ]*/ /g')
RATIO=$(lsdvd -x $DEVICE -t "$i" | grep -m1 "Aspect ratio:" | awk '{print$11}' | sed -e 's/\//\:/g' | tr -d ',')
## ENCODAGE DE TOUS LES TITRES DU DVD-VIDÉO.
if [[ "$COUNT_AUDIO_MPLAYER" -ge "0" ]]; then
HandBrakeCLI --no-dvdnav \
--input $DEVICE --title $i \
--all-audio --all-subtitles --subtitle-lang-list fr \
-e x264 -b $BITRATE --loose-anamorphic --modulus 2 \
--hqdn3d=y-spatial=1.5:cb-spatial=1.5:cr-spatial=1.5:y-temporal=4:cb-temporal=4:cr-temporal=4 --unsharp=y-strength=0.5:y-size=5:cb-strength=0.5:cb-size=5 \
--crop 0:0:0:0 \
--aencoder copy \
--output "$TITLE/$i-$TITLE.mkv"
### SI LE TITRE N'A PAS D'AUDIO, ON NE FRANCHIRA PAS LES ÉTAPES SUIVANTES.
fi
## AUDIO(S) INDIQUÉS PAR LSDVD ET AUDIO(S) INDIQUÉS PAR FFPROBE EN CIBLANT KB/S.
COUNT_AUDIO=$(lsdvd -a "$DEVICE" -t "$i" 2> /dev/null |grep -c 'Audio:')
#COUNT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /ac3,/ && /kb\/s/ { print $2 }'| cut -c4-4 | wc -w)
COUNT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /kb\/s|\(LC),/ { print $2 }'| cut -c4-4 | wc -w)
## UN OU PLUSIEURS STREAMS AUDIO.
if [[ "$COUNT_AUDIO_MPLAYER" -ge "1" ]] && [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_AUDIO" != "$COUNT_VALID_AUDIO" ]] ; then
#### VÉRIFICATION ET REJET DES STREAMS AUDIOS INVALIDES (AU CAS OÙ).
DETECT_VALID_AUDIO=$(ffprobe "$TITLE/$i-$TITLE.mkv" 2>&1 | awk '/Audio:/ && /Stream/ && /kb\/s|\(LC),/ { print $2 }'| cut -c4-4)
VALID_AUDIO_PREPARE=$(echo $DETECT_VALID_AUDIO | sed -e 's/\ /\,/g' >> "$TITLE/$i-choix.txt")
VALID_AUDIO=$(head -n 1 "$TITLE/$i-choix.txt" | tail -n 1)
mkvmerge -o "$TITLE/$i-$TITLE-[vérifié].mkv" --atracks $VALID_AUDIO "$TITLE/$i-$TITLE.mkv"
mv "$TITLE/$i-$TITLE-[vérifié].mkv" "$TITLE/$i-$TITLE.mkv"
#rm -f "$TITLE/$i-choix.txt"
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A QU'UN SEUL STREAM AUDIO ET SANS INFO SUR LE LANGUAGE. ON NE PARLE PAS ICI DE (XX ou UNKNOWN)
COUNT=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "aid")
NULL_INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
awk '/alang/ { print $9 }' | wc -w)
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT" -eq "1" ]] && [[ "$NULL_INFO" -eq "0" ]] ; then
mkvpropedit "$TITLE/$i-$TITLE.mkv" --edit track:a1 --set language=und
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A UN OU PLUSIEURS STREAMS AUDIOS FR AVEC DES STREAMS AUDIOS ETRANGERS (POUR NE LAISSER QUE CELLES-CI).
## SI IL N'Y A QUE DU FRANÇAIS, CETTE OPTION NE SERA PAS UTILISÉE.
VERIF_AUDIO_ALL=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
grep -c "alang")
VERIF_AUDIOFR=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
grep -c "alang fre,")
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$VERIF_AUDIOFR" -ge "1" ]] && [[ "$VERIF_AUDIO_ALL" != "$VERIF_AUDIOFR" ]] ; then
mkvmerge -o "$TITLE/$i-$TITLE-[Language: Français].mkv" -a fre "$TITLE/$i-$TITLE.mkv"
rm -f "$TITLE/$i-$TITLE.mkv"
mv "$TITLE/$i-$TITLE-[Language: Français].mkv" "$TITLE/$i-$TITLE.mkv"
fi
## CETTE ÉTAPE NE SERA UTILISÉE QUE SI IL Y A UN STREAM AUDIO AU FORMAT LPCM.
## DUMPAUDIO ET SAUVEGARDE DU LPCM EN WAVE D'UN DVD DE CONCERT LIVE.
AIDS_LPCM=$(lsdvd -a "$DEVICE" -t "$i" 2>/dev/null | awk '/lpcm|id:/ { print $22 }')
COUNT_AUDIO_LPCM=$(lsdvd -a "$DEVICE" -t "$i" 2>/dev/null | grep -c "lpcm" )
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_AUDIO_LPCM" -ge "1" ]]; then
mkdir -p "$TITLE/WAVE"
for n in $AIDS_LPCM; do
mplayer -noconfig all -nocache -benchmark -vc null -vo null \
-ao pcm:fast:file="$TITLE/WAVE/[$i-($n)]-$TITLE.wav" \
-identify -dvd-device "$DEVICE" dvdnav://$i -ni -aid $n
done
fi
## ON INDIQUE LA LANGUE DE L'AUDIO DANS LE RENOMAGE DU TITRE ET LE NOMBRE.
INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | \
awk '/alang/ { x = x $9 ""}
END { sub(/,*$/, "", x); print x }')
COUNT_INFO=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "alang")
COUNT=$(mplayer -vo null -ao null -frames 0 -identify "$TITLE/$i-$TITLE.mkv" 2>/dev/null | grep -c "aid")
## UNE OU PLUSIEURS INFOS SUR L'AUDIO ET UN OU PLUSIEURS AUDIOS.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -ge "1" ]] && [[ "$COUNT" -ge "1" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: $INFO].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: $INFO].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: $INFO].log"
fi
## PAS D'INFO ET UN SEUL AUDIO.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -eq "0" ]] && [[ "$COUNT" -eq "1" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: und].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: und].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: und].log"
fi
## PAS D'AUDIO DONC PAS D'INFO.
if [[ -e "$TITLE/$i-$TITLE.mkv" ]] && [[ "$COUNT_INFO" -eq "0" ]] && [[ "$COUNT" -eq "0" ]] ; then
mv "$TITLE/$i-$TITLE.mkv" "$TITLE/$i-$TITLE-[Audio: nosound].mkv"
mediainfo "$TITLE/$i-$TITLE-[Audio: nosound].mkv" >> "$TITLE/IFOS/$i-$TITLE-[Audio: nosound].log"
fi
done