Last active
February 5, 2019 22:41
-
-
Save Gwerlas/c25473f76c74f8cf63da606bf1721ba9 to your computer and use it in GitHub Desktop.
A small script to backup a DVD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -Eeuo pipefail | |
WORKDIR=$(mktemp -d) | |
TMDB_API_KEY="your-key-here" | |
VIDEOS="$HOME/Videos" | |
trap "An error occured, temporary files have been kept in $WORKDIR" ERR | |
pushd "$WORKDIR" > /dev/null | |
TITLE="${1:-$(lsdvd | grep '^Disc Title:' | cut -d: -f2 | tr -d '[:space:]')}" | |
TRACK="$(lsdvd | grep '^Longest' | cut -d: -f2 | tr -d '[:space:]')" | |
SOURCE="dvd://$TRACK" | |
if [ ! -f stream.dump ]; then | |
echo -e "\e[32;1mCaching files\e[0m" | |
mplayer $SOURCE -quiet -dumpstream | grep '^dump: ' | |
fi | |
if [ ! -f chapters.txt ]; then | |
echo -e "\e[32;1mExtract chapters\e[0m" | |
dvdxchap -t $TRACK /dev/dvd > chapters.txt | |
fi | |
if [ ! -f video.avi ]; then | |
echo -e "\e[32;1mCrop and scale detection\e[0m" | |
crop=$(mplayer $SOURCE -quiet -vf cropdetect -nosound -vo null -frames 10 \ | |
-sstep 211 -nocache 2> /dev/null | awk -F '[()]' '/\-vf/ {print $2}' | \ | |
tail -n1 | cut -d' ' -f2) | |
width=$(echo $crop | cut -d= -f2 | cut -d: -f1) | |
width=`awk "BEGIN {printf \"%.0f\", $width*(1024/720)}"` | |
height=$(echo $crop | cut -d= -f2 | cut -d: -f2) | |
for vpass in 1 2; do | |
if [ $vpass -eq 1 ]; then | |
[ -f divx2pass.log ] && continue | |
file=/dev/null | |
else | |
file=video.avi | |
fi | |
echo -e "\e[32;1mPass $vpass\e[0m" | |
mencoder stream.dump -nosound -nosub \ | |
-ovc lavc \ | |
-lavcopts vcodec=mpeg4:vhq:v4mv:vqmin=2:vbitrate=1500:vpass=$vpass \ | |
-vf pp=de,$crop,scale=$width:$height \ | |
-o "$file" 2> pass_$vpass.log | |
done | |
fi | |
for lang in en fr; do | |
[ -f $lang.avi ] && continue | |
echo -e "\e[32;1mLang $lang\e[0m" | |
mencoder stream.dump \ | |
-ovc frameno \ | |
-slang $lang -vobsubout $lang \ | |
-alang $lang -oac copy \ | |
-o $lang.avi 2> /dev/null | |
done | |
# This product uses the TMDb API but is not endorsed or certified by TMDb. | |
set -x | |
if [ ! -f cover.jpg ]; then | |
echo -e "\e[32;1mFetch data from TMDb\e[0m" | |
base_url=$(curl -q -G \ | |
--data-urlencode "api_key=$TMDB_API_KEY" \ | |
https://api.themoviedb.org/3/configuration | jq -r '.images.secure_base_url') | |
poster_size="original" | |
data=$(curl -q -G \ | |
--data-urlencode "language=fr_FR" \ | |
--data-urlencode "query=$TITLE" \ | |
--data-urlencode "api_key=$TMDB_API_KEY" \ | |
https://api.themoviedb.org/3/search/movie | jq '.results[0]') | |
poster_path=$(echo $data | jq -r '.poster_path') | |
#movie_description=$(echo $data | jq -r '.overview') | |
curl -L --output cover.jpg ${base_url}${poster_size}${poster_path} || { | |
echo -e "\e[31;1Failed... \e[32mSo we generate the thumbnail\e[0m" | |
ffmpeg -i video.avi \ | |
-ss 100 \ | |
-vf "thumbnail,scale=640:360" \ | |
-frames:v 1 cover.jpg > /dev/null | |
} | |
fi | |
set +e | |
echo -e "\e[32;1mMerge\e[0m" | |
mkvmerge --title "$TITLE" \ | |
--language 1:eng -D en.avi \ | |
--language 1:fre -D fr.avi \ | |
--language 0:eng en.idx \ | |
--language 0:fre fr.idx \ | |
--default-language fre \ | |
-A video.avi \ | |
--attachment-name "cover" --attachment-mime-type "image/jpeg" \ | |
--attach-file cover.jpg \ | |
--chapters chapters.txt \ | |
-o "$TITLE.mkv" | |
if [ $? -eq 2 ]; then | |
echo -e "\e[33;1mThe merge failed\e[0m" | |
exit 1 | |
fi | |
echo -e "\e[32;1mFinishing\e[0m" | |
mv -v "$TITLE.mkv" $VIDEOS/ | |
rm -vf * | |
popd > /dev/null | |
rmdir "$WORKDIR" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment