Skip to content

Instantly share code, notes, and snippets.

@Gwerlas
Last active February 5, 2019 22:41
Show Gist options
  • Save Gwerlas/c25473f76c74f8cf63da606bf1721ba9 to your computer and use it in GitHub Desktop.
Save Gwerlas/c25473f76c74f8cf63da606bf1721ba9 to your computer and use it in GitHub Desktop.
A small script to backup a DVD
#!/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