#!/bin/bash
BITRATE="1300"
TWO_PASS=
CROP=
FPS=
#MENCODER_OPTS=hqdn3d
INTERLACE_TOLERANCE=5 # if less than 5% is interlaced, than the video was likely edited after it was telecined. Perform IVTC and encode CFR.
X264_OPTIONS="keyint=120:keyint_min=1:frameref=16:bframes=16:b_pyramid:direct_pred=auto:weight_b:partitions=all:8x8dct:subq=9:chroma_me:mixed_refs:nofast_pskip:threads=0:nointerlaced"
X264_BITRATE="50%" # this can also be an integer like "2048". Measured in Kb.
FOUND_OVERVIEW=0
FOUND_DETAILS=0
FOUND_PLOT=0
FOUND_SYNOPSIS=0
function detect_identical_tracks
{
lsdvd -x -t $TRACK "./" | sed "s/Title: $TRACK/Title: XX/" > $TRACK.info
for OTHER in *.info
do
if [ "$OTHER" != "$TRACK.info" ]
then
if [ "`diff "$OTHER" "$TRACK.info" | wc -l`" = "0" ]
then
echo "Track $TRACK appears to be identical to another track"
fi
fi
done
}
function abdvde_detect_crop
{
CROP=`mplayer -dvd-device ./ dvd://$TRACK -vf cropdetect -sb 9000000 -sstep 10 -vo null -ao null -frames 100 -benchmark 2> /dev/null < /dev/null | grep "\[CROP\]" | tail -n 1`
CROP=`echo $CROP | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ' ' -f 2`
echo "Detected crop of \"$CROP\""
if [ `echo $CROP | grep -c "^crop="` = 1 ]
then
CROP="$CROP"
else
CROP=
fi
}
function abdvde_detect_telecine
{
mplayer -dvd-device ./ -msglevel identify=6 -frames 0 dvd://$TRACK 2>/dev/null < /dev/null > "./tmp_$TRACK.info"
T=`grep ID_DVD_CURRENT_TITLE "./tmp_$TRACK.info" | sed -r "s/ID_DVD_CURRENT_TITLE=([0-9]+)(\\..*)?/\\1/"`
LENGTH=`grep ID_DVD_TITLE_${T}_LENGTH "./tmp_$TRACK.info" | sed -r "s/ID_DVD_TITLE_${T}_LENGTH=([0-9]+)(\\..*)?/\\1/"`
unset TELECINE_METHOD
echo "Length: $LENGTH seconds"
echo "Format: $FORMAT"
echo "Detecting telecine method: "
# format and framerate
case "$FORMAT" in
"NTSC")
mplayer -dvd-device ./ dvd://${TRACK} -vo null -nosound -quiet -benchmark 2> "./mplayer_output_2" > "./mplayer_output_1" < /dev/null
DEMUX_MPG_COUNT=`grep "demux_mpg" "./mplayer_output_1" | wc -l`
echo "Demux count: -$DEMUX_MPG_COUNT-"
if [ "$DEMUX_MPG_COUNT" = "0" ]; then
# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001000 ))
FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001 ))
INPUT_FRAMERATE="30000/1001"
elif [ "$DEMUX_MPG_COUNT" = "1" ]; then
# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 24000 / 1001000 ))
FRAMES=$(( `printf "$LENGTH" | tr -d .` * 24000 / 1001 ))
INPUT_FRAMERATE="24000/1001"
else
# FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001000 ))
FRAMES=$(( `printf "$LENGTH" | tr -d .` * 30000 / 1001 ))
INPUT_FRAMERATE="VFR"
fi
;;
"PAL")
FRAMES=$(( `printf "$LENGTH" | tr -d .` * 25 ))
INPUT_FRAMERATE="25"
;;
esac
echo "Input framerate is $INPUT_FRAMERATE"
#detect telecine method
case "$INPUT_FRAMERATE" in
"24000/1001")
TELECINE_METHOD="24000/1001p soft telecined to 30000/1001t"
PROGRESSIVE_PERCENTAGE=100
printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
;;
"25")
TELECINE_METHOD="25p telecined to 25i"
PROGRESSIVE_PERCENTAGE="unknown"
printf "Unknown. Assuming ${TELECINE_METHOD}\n"
;;
"30000/1001")
# look for 24000/1001
mencoder dvd://$TRACK -dvd-device ./ -fps 30000/1001 -vf pullup,softskip,decimate -ofps 24000/1001 -nosound -ovc raw -of avi -o /dev/null 2> "./temp" > /dev/null < /dev/null
SKIPPED_FRAMES=`grep "Skipping frame" "./temp" | wc -l`
if [ $SKIPPED_FRAMES -eq 0 ]; then
TELECINE_METHOD="24000/1001p hard telecined to 30000/1001t"
PROGRESSIVE_PERCENTAGE=100
printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
# if less than $INTERLACE_TOLERANCE% is interlaced, than the video was likely edited after it was telecined
elif [ $SKIPPED_FRAMES -lt $(( $FRAMES * $INTERLACE_TOLERANCE / 100 )) ]; then
TELECINE_METHOD="24000/1001p hard telecined to 30000/1001t"
PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
# look for 30000/1001. $SKIPPED_FRAMES should equal $FRAMES / 5
elif [ $(( $SKIPPED_FRAMES * 500 / $FRAMES )) -gt $(( 100 - $INTERLACE_TOLERANCE )) ]; then
# is it 30000/1001i or 60000/1001f, hard to tell...
TELECINE_METHOD="30000/1001p telecined to 30000/1001i"
PROGRESSIVE_PERCENTAGE="unknown"
printf "Unknown. Assuming ${TELECINE_METHOD}\n"
fi
;;
"VFR")
# look for 24000/1001
mencoder dvd://$TRACK -dvd-device ./ -fps 30000/1001 -vf pullup,softskip,decimate -ofps 24000/1001 -nosound -ovc raw -of avi -o /dev/null 2> "./temp" > /dev/null < /dev/null
SKIPPED_FRAMES=`grep "Skipping frame" "./temp" | wc -l`
if [ $SKIPPED_FRAMES -eq 0 ]; then
TELECINE_METHOD="24000/1001p randomly soft and hard telecined to 30000/1001t"
PROGRESSIVE_PERCENTAGE=100
printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
# if less than $INTERLACE_TOLERANCE% is interlaced, than the video was likely edited after it was telecined
elif [ $SKIPPED_FRAMES -lt $(( $FRAMES * $INTERLACE_TOLERANCE / 100 )) ]; then
TELECINE_METHOD="24000/1001p randomly soft and hard telecined to 30000/1001t"
PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
printf "${TELECINE_METHOD}. Input is ${PROGRESSIVE_PERCENTAGE}%% progressive\n"
fi
;;
esac
if [ "$TELECINE_METHOD" = "" ]; then
TELECINE_METHOD="unknown"
PROGRESSIVE_PERCENTAGE=$(( ( $FRAMES - $SKIPPED_FRAMES ) * 100 / $FRAMES ))
printf "Unknown. Assuming VFR. ${PROGRESSIVE_PERCENTAGE}%% is progressive material\n"
fi
# inverse telecine
case "$TELECINE_METHOD" in
"24000/1001p soft telecined to 30000/1001t")
# 300.1
# ALPHA_DOG.1
# AUSTIN_POWERS_2.1
# BALLISTIC_ECKS_VS_SEVER.1
# BIGMAMA.1
# BIG_BULLY.1
# BLACKSHEEP.1
# BODY_OF_LIES.1
# BRAVHART.1
# CAPN_CORELLIS_MANDOLIN.1
# CONSTANTINE_DISC_1.1
# TIM_BURTONS_CORPSE_BRIDE.1
INPUT_FRAMERATE=""
MENCODER_FILTERS=""
OUTPUT_FRAMERATE="24000/1001"
;;
"24000/1001p hard telecined to 30000/1001t")
INPUT_FRAMERATE=""
MENCODER_FILTERS="filmdint=io=5:4:fast=0,softskip"
OUTPUT_FRAMERATE="24000/1001"
;;
"24000/1001p randomly soft and hard telecined to 30000/1001t")
# ALIEN_VS_PREDATOR.1
# AUSTIN_WS.1
# A_BEAUTIFUL_MIND.1
# BOOGEYMAN.1
# CABIN_FEVER.1
# CHEAPER_BY_THE_DOZEN.1
# CHILDREN_OF_MEN.1
# CHRISTMAS_WITH_THE_KRANKS.1
# FARSCAPE_S2_V1D1.5
# FARSCAPE_S2_V1D1.10
# GOLDMEMBER.2
# TEENAGE_DRAMA_QUEEN.1
INPUT_FRAMERATE=""
MENCODER_FILTERS="filmdint=io=5:4:fast=0,softskip"
OUTPUT_FRAMERATE="24000/1001"
;;
"25p telecined to 25i")
# RICHMAN_POORMAN_DISC1.3
# RICHMAN_POORMAN_DISC1.4
INPUT_FRAMERATE=""
#MENCODER_FILTERS="pullup,softskip" # this works much better
#MENCODER_FILTERS="tfields"
#OUTPUT_FRAMERATE="50"
MENCODER_FILTERS="phase,softskip" # this works best, PAL guys have it easy!
OUTPUT_FRAMERATE="25"
;;
"30000/1001p telecined to 30000/1001i")
INPUT_FRAMERATE=""
MENCODER_FILTERS="filmdint=io=1:1:fast=0,softskip"
OUTPUT_FRAMERATE="30000/1001"
;;
"60000/1001f") # not currently used
echo "If you see this, it is not expected"
INPUT_FRAMERATE=""
MENCODER_FILTERS=""
OUTPUT_FRAMERATE=""
;;
*)
INPUT_FRAMERATE=""
MENCODER_FILTERS="filmdint=io=1:4:=fast=0,softskip"
OUTPUT_FRAMERATE="120000/1001"
;;
esac
}
function abdvde_encode_video
{
MENCODER_FILTERS=""
abdvde_detect_telecine
# if [ "25p telecined to 25i" != "$TELECINE_METHOD" ]
# then
abdvde_detect_crop
# fi
# crop
if [ "$MENCODER_FILTERS" = "" ]; then
MENCODER_FILTERS="${CROP}"
else
if [ "$CROP" != "" ]; then
MENCODER_FILTERS="${MENCODER_FILTERS},${CROP}"
fi
fi
# scale
if [ "$MENCODER_FILTERS" = "" ]; then
MENCODER_FILTERS="hqdn3d=2:1:2,scale=-9:-9,harddup"
else
MENCODER_FILTERS="${MENCODER_FILTERS},hqdn3d=2:1:2,scale=-9:-9,harddup"
fi
echo "Transcoding \"$DISC\" title $TRACK to \"$TARGET\""
if [ "$INPUT_FRAMERATE" != "" ]; then
echo "Didnt expect INPUT_FRAMERATE still set: $INPUT_FRAMERATE"
fi
/usr/bin/time \
mencoder -dvd-device ./ dvd://$TRACK -quiet -vf ${MENCODER_FILTERS} -nosound -ovc x264 \
-x264encopts crf=22:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=2:b_pyramid:weight_b:threads=auto:chroma_me:mixed_refs:nointerlaced \
-ofps $OUTPUT_FRAMERATE -sws 9 -mc 0 \
-of rawvideo -o "$TARGET" < /dev/null
# 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
# h264 Options:
# crf=22:qcomp=0.7:subq=6:8x8dct:frameref=4:bframes=4:b_pyramid:weight_b:threads=auto:chroma_me:mixed_refs:nofast_pskip:nointerlaced
echo "Finished transcoding \"$DISC\" title $TRACK to \"$TARGET\""
}
function lookup_title
{
wget "http://www.imdb.com/find?s=all&q=$1" -O - 2> /dev/null > tmp.p
if [ x`grep -c "<title>IMDb Search</title>" tmp.p` = x1 ]
then
grep "Titles.*<a href=\"/title/" tmp.p | perl -pe 's|(.*?<a href=\"/title/)||' | cut -d '/' -f 1 > tmp.1
while read IMDB_TITLE
do
echo "$IMDB_TITLE"
break 1
done < tmp.1
else
grep "\<link rel=\"canonical\" href=\"http://www\.imdb\.com/title/" tmp.p | sed "s/.*\"http:\/\/www\.imdb\.com\/title\/\([a-z0-9]*\)\/.*/\1/"
fi
}
function get_basic_details
{
echo "<html><head><title>$1 (IMDB)</title>"
echo "<link href=\"../style.css\" rel=\"stylesheet\" type=\"text/css\" />"
# echo "<style>"
# echo "body { font: 13px Gill Sans, sans-serif; } .info { margin-left: 10em; margin-bottom: 1em; } hr { border: 1px #999; height: 1px; border-style: dotted none none none; clear: none; margin-left: 0px; } .info h5 { margin-top: 0; position: absolute; margin-left: -10em; } .headerinline { margin-top: 0px; margin-bottom: 6px; }"
# echo "td { font: 12px Arial; } #Cast .info { margin-left: 3em; font: 10px Arial; } .cast * { font: 10px Arial; } .odd * { background-color: #efefff; } table.cast { border-collapse: collapse; } table.cast td { height: 36px; border-top: 1px dotted #999; border-bottom: 1px dotted #999; vertical-align: middle; padding-left: 0.5em; padding-right: 0.5em; } table tr.odd { background: #fafafa; } table tr.even { background: #f0f1f7; }"
# echo "#Cast { float: right; width: 295px; top: 0; } #Overview { float: left; width: 295px; }"
# echo ".break { clear: both; padding-top: 1px; }"
# echo "h1, h5 { color: darkorange; }"
# echo "#Photo, #Fun, #Cast, #Details, #Plot, #Synopsis, #Overview { background: #f8f8f8; margin: 6px; padding: 4px; }"
# echo "body table { background: #e0e8f0; }"
# echo "h3 { color: darkblue; }"
# echo "#Title h1 { font: 25px Gill Sans, sans-serif; color: #ffffff; padding-left: 12px; padding-top: 9px; margin: 0px; }"
# echo "#Photo { float: right; width: 295px; }"
# echo "#Photo img { margin-left: 24px; margin-bottom: 10px; width: 250px; }"
# echo "#Overview { float: left; width: 295px; }"
# echo "#Cast { float: right; width: 295px; }"
# echo "#Details { float: left; width: 295px; }"
# echo "</style>"
echo "</head><body>"
echo "<center><table><tr><td width=630>"
echo "<div id=\"Title\"><h1>$1</h1></div>"
echo "<hr/>"
echo "<!-- looking up overview for \"$1\" which is \"$2\" in IMDB -->"
wget "http://www.imdb.com/title/$2/" -O - 2> /dev/null > tmp.2
while read LINE
do
PHOTO=`echo "$LINE" | grep -c "<div class=\"photo\">"`
BEGIN1=`echo "$LINE" | grep -c "<h5>Director"`
END1=`echo "$LINE" | grep -c "<h3>Cast</h3>"`
BEGIN2=`echo "$LINE" | grep -c "<h3>Additional Details</h3>"`
END2=`echo "$LINE" | grep -c "<h3>FAQ</h3>"`
if [ x"$PHOTO" = x"1" ]
then
read LINE
IMG=`echo "$LINE" | sed "s/.*src\=\"\(http:\/\/ia.media-imdb.com\/.*@@\).*/\1/"`
wget "$IMG" -O "$1 - Title Cover.jpg" > /dev/null 2>&1
echo "<div id=\"Photo\"><h3>Photo</h3><img src=\"$1 - Title Cover.jpg\" width=250></div>"
fi
if [ x"$FOUND_OVERVIEW" = x"1" ]
then
if [ x"$END1" = x"1" ]
then
echo "</div>"
echo "<div id=\"Cast\">"
echo "$LINE" | sed "s/\(.*\)<div><form.*<\/form><\/div>\(.*\)/\1\2/"
echo "</div>"
echo "<!-- Got to end of overview data -->"
echo "<div id=\"Details\">"
FOUND_OVERVIEW=2
else
if [ "$LINE" != "<hr/>" ]
then
echo "$LINE"
fi
fi
fi
if [ x"$BEGIN1" = x"1" ]
then
echo "<div id=\"Overview\">"
echo "<h3>Overview</h3>"
echo "<div class=\"info\">"
echo "$LINE"
FOUND_OVERVIEW=1
fi
if [ x"$FOUND_DETAILS" = x"1" ]
then
if [ x"$END2" = x"1" ]
then
echo "</div>"
echo "<!-- Got to end of details data -->"
echo "<div class=\"break\"><hr/></div>"
FOUND_DETAILS=2
break
else
if [ "$LINE" = "<h3>Fun Stuff</h3>" ]
then
echo "</div><div class=\"break\"><hr/></div><div id=\"Fun\">"
fi
if [ "$LINE" != "<hr/>" ]
then
echo "$LINE"
fi
fi
fi
if [ x"$BEGIN2" = x"1" ]
then
echo "$LINE"
FOUND_DETAILS=1
fi
done < tmp.2
}
function get_more_details
{
echo "<!-- looking up plot for \"$1\" which is \"$2\" in IMDB -->"
echo "<div id=\"Plot\">"
echo "<h3>Plot</h3>"
echo "<div class=\"info\">"
wget "http://www.imdb.com/title/$2/plotsummary" -O - 2> /dev/null > tmp.2
while read LINE
do
BEGIN=`echo "$LINE" | grep -c "<p class=\"plotpar\">"`
END=`echo "$LINE" | grep -c "<div class=\"info\">"`
if [ x"$FOUND_PLOT" = x"1" ]
then
if [ x"$END" = x"1" ]
then
echo "<!-- Got to end of plot data -->"
break 1
else
if [ "$LINE" != "<hr/>" ]
then
echo "$LINE"
fi
fi
fi
if [ x"$BEGIN" = x"1" ]
then
FOUND_PLOT=1
fi
done < tmp.2
echo "</div>"
echo "</div>"
echo "<!-- looking up synopsis for \"$1\" which is \"$2\" in IMDB -->"
echo "<div class=\"break\"><hr/></div>"
echo "<div id=\"Synopsis\">"
echo "<h3>Synopsis</h3>"
echo "<div class=\"info\">"
wget "http://www.imdb.com/title/$2/synopsis" -O - 2> /dev/null > tmp.2
while read LINE
do
BEGIN=`echo "$LINE" | grep -c "<div id=\"swiki\.2\.1\">"`
END=`echo "$LINE" | grep -c "</div>"`
if [ x"$FOUND_SYNOPSIS" = x"1" ]
then
if [ x"$END" = x"1" ]
then
echo "<!-- Got to end of synopsis data -->"
break 1
else
echo "$LINE"
fi
fi
if [ x"$BEGIN" = x"1" ]
then
FOUND_SYNOPSIS=1
fi
done < tmp.2
echo "</div>"
echo "</div>"
}
function lookupIMDB
{
DISC_LNK="$DISC - Title Info.desktop"
IMDB_TITLE=Unknown
if [ ! -f "$DISC_LNK" ]
then
IMDB_TITLE=`lookup_title "$1"`
echo "[Desktop Entry]" > "$DISC_LNK"
echo "Encoding=UTF-8" >> "$DISC_LNK"
echo "Name=$1 - Title Info" >> "$DISC_LNK"
echo "Type=Link" >> "$DISC_LNK"
echo "URL=http://www.imdb.com/title/$IMDB_TITLE/" >> "$DISC_LNK"
echo "Icon=gnome-fs-bookmark" >> "$DISC_LNK"
else
IMDB_TITLE=`grep "URL=" "$DISC_LNK" | sed "s/URL=http:\/\/www\.imdb\.com\/title\/\(.*\)\//\1/"`
fi
get_basic_details "$1" "$IMDB_TITLE" | sed "s/href=\"\//href=\"http:\/\/www.imdb.com\//g"
get_more_details "$1" "$IMDB_TITLE" | sed "s/href=\"\//href=\"http:\/\/www.imdb.com\//g"
echo "</td></tr></table></center>"
echo "</body></html>"
rm tmp.1 tmp.2 2> /dev/null > /dev/null
}
# Crop detection
function crop_detection
{
if [ -f "$VIDEO" ]
then
V_SIZE=`ls -s --block-size=1 "$VIDEO" | cut -d ' ' -f 1`
if [ $V_SIZE -gt "500000000" ] # Video over 500 MB we take more care with
then
TWO_PASS=0 # 1
CROP=`mplayer "$VIDEO" -vf cropdetect -sb 10000000 -sstep 60 -vo null -ao null 2>&1 < /dev/null | grep "[CROP]" | tail -n 1`
# output:
# [CROP] Crop area: X: 0..719 Y: 56..422 (-vf crop=720:352:0:64).0
CROP=`echo $CROP | cut -d '(' -f 2 | cut -d ')' -f 1 | cut -d ' ' -f 2`
echo "Detected crop of \"$CROP\""
if [ `echo $CROP | grep -c "^crop="` = 1 ]
then
CROP="$CROP"
else
CROP=
fi
else
TWO_PASS=0
CROP=
fi
else
echo "transcode.sh error: \"$VIDEO\" does not exist"
exit
fi
}
# Transcode
function encode_video
{
crop_detection
echo "Transcoding \"$VIDEO\" to \"$TARGET\""
if [ "$TWO_PASS" == "1" ]
then
#mencoder -really-quiet "$VIDEO" -vf pullup,softskip,${CROP},harddup -nosound -ovc x264 \
/usr/bin/time \
mencoder -really-quiet "$VIDEO" -vf kerndeint,${CROP},scale -nosound -ovc x264 \
-x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=1:frameref=1:bframes=3:b_pyramid:weight_b:turbo=1:threads=auto:pass=1 \
-of rawvideo -o /dev/null < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
echo "Finished pass one"
#mencoder -really-quiet "$VIDEO" -vf pullup,softski,p${CROP},harddup -nosound -ovc x264 \
/usr/bin/time \
mencoder -really-quiet "$VIDEO" -vf kerndeint,${CROP},scale -nosound -ovc x264 \
-x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto:pass=2 \
-of rawvideo -o "$TARGET" < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
else
#mencoder -really-quiet "$VIDEO" -vf pullup,softskip,harddup -nosound -ovc x264 \
#/usr/bin/time \
# yadif=0
#mencoder -really-quiet "$VIDEO" -vf kerndeint,scale -nosound -ovc x264 \
# -x264encopts bitrate=${BITRATE}:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto \
# -of rawvideo -o "$TARGET" < /dev/null 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
/usr/bin/time \
mencoder -quiet "$VIDEO" -vf pullup,softskip,${CROP},harddup -nosound -ovc x264 \
-x264encopts crf=24:qcomp=0.7:subq=5:8x8dct:frameref=3:bframes=3:b_pyramid:weight_b:threads=auto \
-of rawvideo -o "$TARGET" < /dev/null
# 2>&1 | grep "user.*system.*elapsed" | sed "s/.*system\(.*elapsed\).*/\1/"
fi
if [ -f "$TARGET" ]
then
V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
if [ $V_SIZE != "0" ]
then
rm -rf "$VIDEO"
fi
fi
echo "Finished transcoding \"$VIDEO\" to \"$TARGET\""
}
function input_fps
{
FPS=`mplayer "$VIDEO" -vo null -ao null -frames 1 < /dev/null 2>&1 | grep "VIDEO:" | cut -d ' ' -f 10`
# echo "Input video FPS is -$FPS-"
}
function lookup_mkv_lang_code
{
mkvmerge --list-languages | while read line ; do if [ `echo $line | cut -d '|' -f 3 | grep -c " $1"` = '1' ] ; then echo $line ; fi ; done | cut -d '|' -f 2 | tr -d ' ' | head -n 1
}
function lookup_mkv_lang_name
{
mkvmerge --list-languages | while read line
do
if [ `echo $line | cut -d '|' -f 1 | tr -d ' '` = "$1" ]
then
echo $line | cut -d '|' -f 2 | tr -d ' '
fi
done
}
if [ "$1" = "--setup" ]
then
wget http://download.videolan.org/pub/libdvdcss/1.2.9/deb/libdvdcss2_1.2.9-1_i386.deb
sudo dpkg --install libdvdcss2_1.2.9-1_i386.deb
rm libdvdcss2_1.2.9-1_i386.deb
sudo apt-get install mplayer transcode subtitleripper ffmpeg mencoder mkvtoolnix gpac ogmtools acidrip
wget http://www.robelix.com/sub2srt/download/sub2srt-0.5.3.tar.gz
tar zxf sub2srt-0.5.3.tar.gz
rm -rf sub2srt-0.5.3.tar.gz
mv sub2srt-0.5.3/sub2srt ./
rm -rf sub2srt-0.5.3
fi
# Download subtitles
function download_subtitles
{
echo "Downloading Subtitles for $DISC"
mkdir -p OnlineSubtitles
cd OnlineSubtitles
wget "http://divxtitles.com/$DISC/English/any/1" -O - 2> /dev/null | grep "window.location='http://divxtitles\.com" | sed s/.*window\.location.*divxtitles\.com\.subtitles\.//g | cut -d '/' -f 1 > tmp.1
while read SUB_ID
do
wget --post-data subtitle_id=$SUB_ID http://divxtitles.com/download_subtitle.php -O "$DISC - $SUB_ID.zip" 2> /dev/null
unzip "$DISC - $SUB_ID.zip" < /dev/null > /dev/null 2> /dev/null
for SUB in *.sub
do
if [ -f "$SUB" ]
then
rm "$SUB.srt" 2> /dev/null > /dev/null
sub2srt "$SUB" "$SUB.srt" < /dev/null 2> /dev/null > /dev/null
rm "$SUB"
fi
done
rm -rf "$DISC - $SUB_ID.zip" 2> /dev/null > /dev/null
done < tmp.1
rm tmp.1
# Remove duplicates
for SUB1 in *.srt
do
for SUB2 in *.srt
do
if [ "$SUB1" != "$SUB2" ]
then
if [ -f "$SUB1" -a -f "$SUB2" ]
then
if [ "`diff -q "$SUB1" "$SUB2"`" = "" ]
then
rm -rf "$SUB2" 2> /dev/null > /dev/null
fi
fi
fi
done
done
cd - > /dev/null
}
DISC=`basename "$1"`
cd "$1"
if [ ! -d "OnlineSubtitles" ]
then
download_subtitles
fi
DISC_HTML="$DISC - Title Info.html"
if [ ! -f "$DISC_HTML" ]
then
lookupIMDB "$DISC" > "$DISC_HTML"
fi
if [ -d "./VIDEO_TS" -o -d "./video_ts" ]
then
echo "Getting disc info for $DISC"
lsdvd ./ -x -Oh 2> /dev/null | sed "s/Pan&Scan/Pan\&Scan/g" > "$DISC - Title Info.ifo"
lsdvd ./ -x -Ox 2> /dev/null | sed "s/Pan&Scan/Pan\&Scan/g" > "$DISC - Title Info.xml"
lsdvd ./ 2> /dev/null | grep "^Title:" > tmp.1
while read TITLE
do
TRACK=`echo "$TITLE" | cut -d ' ' -f 2 | cut -d ',' -f 1`
OUTPUT_FILE="$DISC - Title $TRACK.mkv"
DUPLICATE=`detect_identical_tracks`
if [ "$DUPLICATE" != "" ]
then
echo "$DUPLICATE"
touch "$OUTPUT_FILE"
fi
if [ ! -f "$OUTPUT_FILE" ]
then
VIDEO_INFO=`lsdvd ./ -t $TRACK -x 2> /dev/null | grep VTS`
VTS=`echo $VIDEO_INFO | cut -d ' ' -f 2 | cut -d ',' -f 1`
FORMAT=`echo $VIDEO_INFO | sed "s/.*Format: \([A-Z]*\).*/\1/"`
INPUT_FILES=
# if [ "$TRACK" != "08" ]
# then
# echo "Skip track $TRACK"
# continue
# fi
# if [ "$TRACK" = "02" ]
# then
# exit
# continue
# fi
MERGE_CMD_LINE=" --chapters \"$DISC - Title $TRACK - Chapters.txt\""
INPUT_FILES="\"$DISC - Title $TRACK - Chapters.txt\""
if [ ! -f "$DISC - Title $TRACK - Chapters.txt" ]
then
dvdxchap ./ -t $TRACK 2> /dev/null > "$DISC - Title $TRACK - Chapters.txt"
fi
# Video Track
VIDEO="./$DISC - Title $TRACK - Video.mpeg2"
TARGET="./$DISC - Title $TRACK - Video.h264"
INPUT_FILES="${INPUT_FILES} \"$TARGET\" \"$VIDEO\""
if [ ! -f "$TARGET" ]
then
# if [ ! -f "$VIDEO" ]
# then
# echo "Ripping video track $TRACK (vts: $VTS) of $DISC"
# #mplayer -dvd-device ./ dvd://$TRACK -dumpvideo -dumpfile "./$DISC - Title $TRACK - Video.mpeg2" < /dev/null
# tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x mpeg2 -t vob > "$VIDEO"
# fi
# Transcode
#encode_video
abdvde_encode_video
rm -rf divx2pass.log 2> /dev/null > /dev/null
# echo "Results: TWO_PASS=$TWO_PASS, CROP=$CROP, FPS=$FPS"
else
# work out again the output FPS
abdvde_detect_telecine
fi
V_TRACK_COUNT=0
V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
if [ "$V_SIZE" != "0" ]
then
#FPS=`mplayer -dvd-device ./ dvd://$TRACK -vo null -ao null -frames 1 < /dev/null 2>&1 | grep "VIDEO:" | cut -d ' ' -f 10`
# FPS=`echo "2 * $FPS" | bc`
# MERGE_CMD_LINE="${MERGE_CMD_LINE} --default-duration 0:${FPS}fps --track-name 0:'Track 1' --language 0:eng \"$TARGET\""
MERGE_CMD_LINE="${MERGE_CMD_LINE} --default-duration 0:${OUTPUT_FRAMERATE}fps --track-name 0:'Track 1' --language 0:eng \"$TARGET\""
V_TRACK_COUNT=1
fi
# Audio Tracks
A_TRACK_COUNT=0
lsdvd ./ -t $TRACK -a 2> /dev/null | grep "^ Audio:" > tmp.2
while read AUDIO
do
A_TRACK=`echo "$AUDIO" | cut -d ' ' -f 2 | cut -d ',' -f 1`
# Use mplayer to detect instead
A_ID=`mplayer -dvd-device ./ dvd://$TRACK -frames 0 2>&1 | grep "audio stream: $A_TRACK_COUNT" | sed "s/.*aid: \([0-9]*\)\./\1/"`
#echo "A_ID = -$A_ID-"
if [ x"$A_ID" = x"" ]
then
# Seems like lsdvd gets the track ids wrong
# However fallback to lsdvd if mplayer doesn't know about this audio track
echo "Using lsdvd to find A_ID"
HEX_A_ID=`echo "$AUDIO" | cut -d ' ' -f 21 | cut -d ',' -f 1 | sed "s/0x\([0-9|a-f]*\)/\1/"`
# Convert hex to decimal
D1=`echo $HEX_A_ID | cut -b 1`
D1=$((`echo $D1 | grep -c "[a-f]"` * 10 + `echo $D1 | tr "0123456789abcdef" "0123456789012345"`))
D2=`echo $HEX_A_ID | cut -b 2`
D2=$((`echo $D2 | grep -c "[a-f]"` * 10 + `echo $D2 | tr "0123456789abcdef" "0123456789012345"`))
A_ID=$(($D1 * 16 + $D2))
fi
#echo "A_ID = -$A_ID-"
A_LANG=`echo "$AUDIO" | cut -d ' ' -f 4,5,6`
A_LANG_CODE=`echo "$A_LANG" | cut -d ' ' -f 1`
A_LANG_NAME=`echo "$A_LANG" | cut -d ' ' -f 3 | cut -d ',' -f 1`
A_FILE="./$DISC - Title $TRACK - $A_LANG_NAME Audio ($A_ID).ac3"
INPUT_FILES="${INPUT_FILES} \"$A_FILE\""
if [ ! -f "$A_FILE" ]
then
echo "Ripping audio track $A_TRACK ($A_ID $A_LANG_NAME) from track $TRACK of $DISC"
#mplayer -dvd-device ./ dvd://$TRACK -aid $A_ID -dumpaudio -dumpfile "$A_FILE"
tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x ac3 -t vob -a `expr $A_ID - 128` > "$A_FILE"
fi
A_SIZE=`ls -s --block-size=1 "$A_FILE" | cut -d ' ' -f 1`
if [ "$A_SIZE" != "0" ]
then
MERGE_CMD_LINE="${MERGE_CMD_LINE} --track-name 0:\"Track $A_TRACK\""
MKV_LANG_CODE=`lookup_mkv_lang_code $A_LANG_CODE`
echo "Got --$MKV_LANG_CODE-- for --$A_LANG_CODE--"
if [ "$MKV_LANG_CODE" = "" -o "$A_LANG_CODE" = "xx" ]
then
MKV_LANG_CODE=`lookup_mkv_lang_name $S_LANG_NAME | head -n 1`
echo "Got --$MKV_LANG_CODE-- for --$A_LANG_NAME--"
fi
if [ "$MKV_LANG_CODE" != "" ]
then
MERGE_CMD_LINE="${MERGE_CMD_LINE} --language 0:$MKV_LANG_CODE"
fi
MERGE_CMD_LINE="${MERGE_CMD_LINE} \"$A_FILE\""
A_TRACK_COUNT=`expr $A_TRACK_COUNT + 1`
fi
done < tmp.2
# Soundtrack test
SOUNDTRACK=0
if [ "$A_TRACK_COUNT" = "1" ]
then
if [ -f "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" ]
then
A_SIZE=`ls -s --block-size=1 "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" | cut -d ' ' -f 1`
if [ -f "./$DISC - Title $TRACK - Video.mpeg2" ]
then
V_SIZE=`ls -s --block-size=1 "$TARGET" | cut -d ' ' -f 1`
if [ $A_SIZE -gt $V_SIZE ]
then
echo "Appears that track $TRACK of $DISC is a soundtrack"
SOUNDTRACK=1
fi
fi
fi
# else
# echo "atracks -$A_TRACK_COUNT-"
fi
# Subtitles
S_TRACK_COUNT=0
S_TRACK_CMD_LINE=
if [ ! -f "./$DISC - Title $TRACK - Subtitles.ifo" ]
then
if [ ! -f "./$DISC - Title $TRACK - Subtitles.sub" ]
then
if [ -f ./tmp-sub.sub ]
then
rm -rf ./tmp-sub.sub ./tmp-sub.idx
fi
lsdvd ./ -t $TRACK -s 2> /dev/null | grep "^ Subtitle:" > tmp.2
while read SUBTITLE
do
S_TRACK=`echo $SUBTITLE | cut -d ' ' -f 2 | cut -d ',' -f 1`
S_ID=`echo $SUBTITLE | cut -d ' ' -f 11 | cut -d ',' -f 1`
S_LANG=`echo $SUBTITLE | cut -d ' ' -f 4,5,6`
S_LANG_CODE=`echo $S_LANG | cut -d ' ' -f 1`
S_LANG_NAME=`echo $S_LANG | cut -d ' ' -f 3 | cut -d ',' -f 1`
if [ $S_TRACK_COUNT -gt 7 -a "$S_LANG_CODE" = "xx" -a "$S_LANG_NAME" = "Unknown" ]
then
echo "Skipping subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC"
else
echo "Ripping subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC"
tccat -i ./ -T $TRACK -L 2> /dev/null | tcextract -x ps1 -t vob -a $S_ID > tmp.sub
S_SIZE=`ls -s --block-size=1 "./tmp.sub" | cut -d ' ' -f 1`
if [ "$S_SIZE" != "0" ]
then
if [ -f "VIDEO_TS/VTS_${VTS}_0.IFO" ]
then
if [ -f ./tmp-sub.sub ]
then
cat tmp.sub | subtitle2vobsub -i "VIDEO_TS/VTS_${VTS}_0.IFO" -o "./tmp-sub" -a `expr $S_TRACK - 1`,$SUB_LANG_CODE
else
cat tmp.sub | subtitle2vobsub -i "VIDEO_TS/VTS_${VTS}_0.IFO" -o "./tmp-sub"
fi
else
echo "Error with finding \"$1/VIDEO_TS/VTS_${VTS}_0.IFO\" for converting subtitle track $S_TRACK ($S_ID $S_LANG) from track $TRACK of $DISC."
fi
S_TRACK=`expr $S_TRACK_COUNT + 1`
S_TRACK_CMD_LINE="${S_TRACK_CMD_LINE} --track-name $S_TRACK_COUNT:\"Track $S_TRACK\""
MKV_LANG_CODE=`lookup_mkv_lang_code $S_LANG_CODE`
if [ "$MKV_LANG_CODE" = "" -o "$S_LANG_CODE" = "xx" ]
then
MKV_LANG_CODE=`lookup_mkv_lang_name $S_LANG_NAME | head -n 1`
fi
if [ "$MKV_LANG_CODE" != "" ]
then
S_TRACK_CMD_LINE="${S_TRACK_CMD_LINE} --language $S_TRACK_COUNT:$MKV_LANG_CODE"
fi
S_TRACK_COUNT=`expr $S_TRACK_COUNT + 1`
fi
rm tmp.sub
fi
done < tmp.2
if [ -f ./tmp-sub.sub ]
then
mv ./tmp-sub.sub "./$DISC - Title $TRACK - Subtitles.sub"
mv ./tmp-sub.idx "./$DISC - Title $TRACK - Subtitles.idx"
INPUT_FILES="${INPUT_FILES} \"$DISC - Title $TRACK - Subtitles.idx\" \"$DISC - Title $TRACK - Subtitles.sub\""
fi # -f ./tmp-sub.sub
fi # ! -f "./$DISC - Title $TRACK - Subtitles.sub"
else
. "./$DISC - Title $TRACK - Subtitles.ifo"
fi # ! -f "./$DISC - Title $TRACK - Subtitles.ifo"
if [ "$S_TRACK_COUNT" != "0" ]
then
S_SIZE=`ls -s --block-size=1 "./$DISC - Title $TRACK - Subtitles.sub" | cut -d ' ' -f 1`
if [ "$S_SIZE" != "0" ]
then
MERGE_CMD_LINE="${MERGE_CMD_LINE} ${S_TRACK_CMD_LINE} \"$DISC - Title $TRACK - Subtitles.idx\""
else
S_TRACK_COUNT=0
fi
fi
TRACK_COUNT=`expr $V_TRACK_COUNT + $A_TRACK_COUNT + $S_TRACK_COUNT`
if [ ! -f "$OUTPUT_FILE" ]
then
if [ "$TRACK_COUNT" != "0" ]
then
# echo "merge cmdline: `echo $MERGE_CMD_LINE`"
echo "mkvmerge --title \"$DISC - Title $TRACK\" -o \"$OUTPUT_FILE\" $MERGE_CMD_LINE"
eval "mkvmerge --title \"$DISC - Title $TRACK\" -o \"$OUTPUT_FILE\" $MERGE_CMD_LINE"
# 2>&1 > /dev/null
else
echo "All tracks for $DISC - title $TRACK are empty or missing, nothing to do for this title"
fi
fi
if [ "$SOUNDTRACK" = "1" ]
then
echo "Perhaps $DISC title $TITLE is a soundtrack"
# mv "./$DISC - Title $TRACK - Unknown Audio (0x80).ac3" "./$DISC - Title $TRACK - Soundtrack.ac3"
# mv "./$DISC - Title $TRACK - Video.h264" "./$DISC - Title $TRACK - Soundtrack.h264"
else
echo "could free up space from the vobs here"
fi
# Cleanup
if [ -f "$OUTPUT_FILE" ]
then
eval "rm -rf $INPUT_FILES"
# 2>&1 > /dev/null
fi
fi
done < tmp.1
rm tmp.1 tmp.2 *.info
else
echo "ripDVD.sh error: $DISC did not contain a VIDEO_TS directory, ignoring."
fi
echo "Did everything for $DISC"