Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Script to run mplayer with two subtitles tracks at the same time. Usage: mplayer2 video sub1 sub2. merge2ass.sh (http://www.abclinuxu.cz/blog/Joseho_blog/2007/7/30/188299) script must be in the path.
#!/bin/bash
# merge2ass.sh - script for merging two text-subtitles into an ass subtitle file
# version 0.9b, 02-feb-2013
# comments/criticism/praise to jose1711-gmail-com
# dependencies: mplayer (if your subtitle files need to be converted to srt), gnu utils
# thanks to:
# - d.watzke for comments
# - belisarivs for testing
# - boris dušek <boris (dot) dusek - gmail - com> for testing/ideas
# - swans100 - patch for milliseconds precision srt subs
#
# $1 is a movie file
# $2 is a subtitle1
# $3 is a subtitle2
# $4 is optional and could be "-pm" or "--play-movie" for instant watching of the movie
# example:
# merge2ass.sh movie.avi english.srt slovak.sub
# mplayer -noautosub -ass movie.avi -sub movie-bilingual.ass -subcp utf8
#
# or just
# merge2ass.sh movie.avi english.srt slovak.sub -pm
#
# or even only
# merge2ass.sh --detect movie.avi -pm
#
#
#
# release history:
# 0.8a (29. 7. 2007)
# - initial public release
# 0.8.1a (30. 7. 2007)
# - check_syntax fixed (d.watzke)
# - multiline echo -> cat (d.watzke)
# - removes temp files after conversion
# 0.8.2 (1. 8. 2007)
# - check whether the input files exist prior to running MPlayer
# - check for MPlayer binary
# - help page added
# - new optional CLI parameters: -pm (plays movie after conversion), --help
# 0.8.2.1 (2. 8. 2007)
# - timestamp in output more compatible (reported by belisarivs)
# 0.9 (8. 8. 2007)
# - performs a check for writable output
# - check for MPlayer's support of ass/ssa if -pm is used
# - pointers to subtitle files stored as arraysF
# - autorecognition of subtitles based on MPlayer's -sub-fuzziness feature (--detect)
# - output filename based on movie filename (+bilingual.ass)
# - bash now mandatory (non-POSIX syntax used)
# - flag -pm has a long alias (--play-movie)
# 0.9a (27. 4. 2012)
# - added compatibility with SRT subtitles using milliseconds precision (thanks juan!)
# 0.9b (2. 2. 2013)
# - define encoding in ssa header (thanks mathieuu!)
#
# some future thoughts:
# - more optional flags (do_not_remove_temp_files, play_but_dont_delete_output_afterwards,dont_do
# the_conversion_just_merging,output_file..)
# - cleaner sed/awk code
# - support for other players (xine, totem, kmplayer, vlc..)
# - subtitle encoding detection based on enca (if present) - boris?
#
# docs:
# - http://en.wikipedia.org/wiki/SubStation_Alpha
# - http://www.perlfu.co.uk/projects/asa/ass-specs.doc
#
# THE STORY ENDS HERE
# set -x
# normally you do not want to see mplayer's error output
#mplayer_err=/dev/stderr
mplayer_err=/dev/null
arg_count="$#"
movie="$1"
sub[1]="$2"
sub[2]="$3"
show_help(){
cat << EOF
----------------------------------------------------------------------------------
| |
| Merge2ass - a script for merging two text subtitles into ass/ssa subtitle file |
| author: jose1711 - gmail - com, 2007/08 |
----------------------------------------------------------------------------------
Usage: merge2ass.sh [--help] [movie subtitle1 subtitle2] [-pm|--play-movie]
or
merge2ass.sh --detect movie [-pm|--play-movie]
--help show this help page and exit
--detect try to detect subtitles using MPlayer's sub-fuzziness=1 flag
movie movie file (anything that MPlayer recognizes)
subtitle[12] file(s) containing text subtitles that MPlayer recognizes
-pm play movie immediately and remove the output after finishing
--play-movie
EOF
}
detect_subtitles(){
while read -r line; do
sub[++i]="$line"
done < <(mplayer -sub-fuzziness 1 -frames 0 "$movie" 2>/dev/null | sed -n "s/^SUB: Added subtitle file ([0-9]*): \(.*\)$/\1/p")
echo "$i subtitles were detected in total."
echo "These two will be used:"
echo "${sub[1]}"
echo "${sub[2]}"
}
convert_subs(){
type mplayer || { echo "MPlayer not installed or binary not in path, please investigate. Exiting.."; exit 1; }
echo "Converting the 1st subtitle file (${sub[1]}) to a time-based format..."
# slower but does not require the video file for conversion
# mplayer /dev/zero -rawvideo pal:fps=25 -demuxer rawvideo -vc null -vo null -noframedrop -benchmark -sub "$movie" -dumpsrtsub
mplayer -dumpsrtsub -noautosub -really-quiet -frames 0 -sub "${sub[1]}" "$movie" 2>>"$mplayer_err" && echo "Done"
mv dumpsub.srt "${sub[1]}-temp"
echo "Converting the 2nd subtitle file (${sub[2]}) to a time-based format..."
mplayer -dumpsrtsub -noautosub -really-quiet -frames 0 -sub "${sub[2]}" "$movie" 2>>"$mplayer_err" && echo "Done"
mv dumpsub.srt "${sub[2]}-temp"
}
generate_ssa_header(){
cat > "$output" << EOF
[Script Info]
Title:
Original Script:
Original Translation:
Original Editing:
Original Timing:
Original Script Checking:
ScriptType: v4.00
Collisions: Normal
PlayResY: 1024
PlayDepth: 0
Timer: 100,0000
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: lang1style,Arial,64,65535,65535,65535,-2147483640,-1,0,1,3,0,6,30,30,30,0,0
Style: lang2style,Arial,64,15724527,15724527,15724527,4144959,0,0,1,1,2,2,5,5,30,0,0
Encoding:0
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
EOF
}
generate_ssa_dialogs(){
sed -e "/ --> /s/,/./g" "${sub[1]}-temp" | tr -d "\r" | awk 'BEGIN{ORS="";print " "} / --> /,/^$/ {ORS=" ";print} /^$/{print "\n"}' | sed -e "s/ --> /,/g" -e "s/^ \([^ ]*\) \(.*\)/Dialogue: Marked=0,\1,lang1style,Cher,0000,0000,0000,,\2/" -e "s/,00:/,0:/g" -e "s/\([:,]\)0\([0-9]\)/\1\2/g" -e "s/\([0-9]\)\(\.\)\([0-9]\)\([0-9]\)0\(,\)/\1\2\3\4\5/g" >>"$output"
sed -e "/ --> /s/,/./g" "${sub[2]}-temp" | tr -d "\r" | awk 'BEGIN{ORS="";print " "} / --> /,/^$/ {ORS=" ";print} /^$/{print "\n"}' | sed -e "s/ --> /,/g" -e "s/^ \([^ ]*\) \(.*\)/Dialogue: Marked=0,\1,lang2style,Cher,0000,0000,0000,,\2/" -e "s/,00:/,0:/g" -e "s/^ *//g" -e "s/\([:,]\)0\([0-9]\)/\1\2/g" -e "s/\([0-9]\)\(\.\)\([0-9]\)\([0-9]\)0\(,\)/\1\2\3\4\5/g" >>"$output"
}
remove_temp_files(){
rm "${sub[1]}-temp" "${sub[2]}-temp"
}
play_movie(){
mplayer -ass 2>/dev/null >/dev/null || { echo "Too old MPlayer version, can't understand ASS/SSA subs. Install a newer version."; exit 1; }
mplayer -really-quiet -fs "$movie" -sub "$output" -ass -subcp utf8 -noautosub
}
delete_output(){
rm "$output"
}
eval last_arg='$'${arg_count}
if [ $arg_count -eq 0 ]; then
show_help
exit 0
fi
for param in $*
do
if [ $param = "--help" ]; then show_help; exit 0; fi
done
if [ "$movie" = "--detect" ]; then
movie="${sub[1]}"
output="${movie%.*}-bilingual.ass"
> "$output" #|| { echo "Can't write here! Exiting.." && echo 1; }
detect_subtitles
fi
if [ ! -f "$movie" ]; then echo "Movie file ($movie) does not exist. Going back to shell.."; exit 1; fi
if [ ! -f "${sub[1]}" ]; then echo "Subtitle1 file (${sub[1]}) does not exist. Going back to shell.."; exit 1; fi
if [ ! -f "${sub[2]}" ]; then echo "Subtitle2 file (${sub[2]}) does not exist. Going back to shell.."; exit 1; fi
echo "Processing.."
# reset output
output="${movie%.*}-bilingual.ass"
> "$output" #|| { echo "Can't write here! Exiting.." && echo 1; }
convert_subs
generate_ssa_header
generate_ssa_dialogs
remove_temp_files
if [ "$last_arg" = "-pm" -o "$last_arg" = "--play-movie" ]; then
play_movie
delete_output
fi
exit 0
# set +x
#!/bin/sh
if [ $# = 0 ]; then
echo "Usage: mplayer2 movie sub1 sub2 [margin] [extra-params]"
exit 0
fi
movie="$1"
extension=".${movie##*.}"
dirname=`dirname "$1"`
basename=`basename "$1" $extension`
sub_1="$2"
sub_2="$3"
if [ x${4} = x ]; then
margin=0
else
margin=$4
fi
if [ x${5} = x ]; then
extra_params=''
else
extra_params="$5"
fi
merge2ass.sh "$movie" "$sub_1" "$sub_2"
mplayer "$movie" -sub "${dirname}/${basename}-bilingual.ass" -ass -ass-use-margins -ass-bottom-margin $margin -ass-top-margin $margin $extra_params
@AlanSurface

This comment has been minimized.

Copy link

AlanSurface commented Dec 26, 2015

It does not work under ubuntu 15.10 64 bit. It seems that mplayer do not generate dumpsub.srt.
merge2ass.sh outputs :
mplayer is /usr/bin/mplayer
Converting the 1st subtitle file (D.fra.srt) to a time-based format...
Done
mv: cannot stat ‘dumpsub.srt’: No such file or directory
Converting the 2nd subtitle file (D.eng.srt) to a time-based format...
Done
mv: cannot stat ‘dumpsub.srt’: No such file or directory
sed: can't read D.fra.srt-temp: No such file or directory
sed: can't read D.eng.srt-temp: No such file or directory
rm: cannot remove ‘D.fra.srt-temp’: No such file or directory
rm: cannot remove ‘D.eng.srt-temp’: No such file or directory

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.