# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*-
# ex: ts=8 sw=8 noet filetype=sh
#
# mplayer(1) completion

have mplayer && {
_mplayer_options_list()
{
	cur=${cur%\\}
	COMPREPLY=( $( compgen -W "$( $1 $2 help 2>/dev/null | \
		sed -e '1,/^Available/d' | awk '{print $1}' | \
		sed -e 's/:$//' -e 's/^'${2#-}'$//' -e 's/<.*//' )" -- $cur ) )
}

_mplayer()
{
	local cmd cur prev skinsdir IFS=$' \t\n' i j k=0

	COMPREPLY=()
	cmd=${COMP_WORDS[0]}
	cur=`_get_cword`
	prev=${COMP_WORDS[COMP_CWORD-1]}

	case "$prev" in
		-@([av][cfo]|[av]fm|vop|fstype|demuxer|o[av]c|of|profile))
			_mplayer_options_list $cmd $prev
			return 0
			;;
		-audiofile)
			_filedir '@(mp3|MP3|mpg|MPG|ogg|OGG|w?(a)v|W?(A)V|mid|MID|flac|FLAC|mka|MKA|ape|APE)'
			return 0
			;;
		-font)
			_filedir '@(desc|ttf)'
			return 0
			;;
		-sub)
			_filedir '@(srt|SRT|sub|SUB|txt|TXT|utf|UTF|rar|RAR|mpsub|smi|js|ssa|SSA|ass|ASS)'
			return 0
			;;
		-vobsub)
			_filedir '@(idx|IDX|ifo|IFO|sub|SUB)'
			IFS=$'\t\n'
			COMPREPLY=( $( for i in "${COMPREPLY[@]}"; do
						if [ -f $i -a -r $i ]; then
							echo ${i%.*}
						else
							echo $i
						fi
				       done ) )
			IFS=$' \t\n'
			return 0
			;;
		-ifo)
			_filedir '@(ifo|IFO)'
			return 0
			;;
		-cuefile)
			_filedir '@(bin|BIN|cue|CUE)'
			return 0
			;;
		-skin)
			# if you don't have installed mplayer in /usr you
			# may want to set the MPLAYER_SKINS_DIR global variable
			if [ -n "$MPLAYER_SKINS_DIR" ]; then
				skinsdir=$MPLAYER_SKINS_DIR
			else
				skinsdir=/usr/share/mplayer/Skin
			fi

			IFS=$'\t\n'
			for i in ~/.mplayer/Skin $skinsdir; do
				if [ -d $i -a -r $i ]; then
					for j in $( compgen -d $i/$cur ); do
						COMPREPLY[$k]=${j#$i/}
						k=$((++k))
					done
				fi
			done
			IFS=$' \t\n'
			return 0
			;;
		-@(mixer|@(cdrom|dvd)-device|dvdauth|fb|zrdev))
			cur=${cur:=/dev/}
			_filedir
			return 0
			;;
		-@(edl?(out)|lircconf|menu-cfg|playlist|csslib|dumpfile)| \
		-@(subfile|vobsub|aofile|fbmodeconfig|include|o|dvdkey)| \
		-passlogfile)
			_filedir
			return 0
			;;
		-@(auto@(q|sync)|loop|menu-root|speed|sstep|aid|alang)| \
		-@(?(@(audio|sub)-)demuxer|bandwidth|cache|chapter)| \
		-@(dvd?(angle)|fps|frames|mc|passwd|user|sb|srate|ss|vcd)| \
		-@(vi?(d|vo)|ffactor|sid|slang|spu@(align|aa|gauss))| \
		-@(vobsubid|delay|bpp|brightness|contrast|dfbopts|display)| \
		-@(fbmode|geometry|guiwid|hue|icelayer|screen[wh]|wid)| \
		-@(monitor@(aspect|-@(dotclock|[hv]freq))|panscan|saturation)| \
		-@(xineramascreen|zr@(crop|norm|quality|[xy]doff|[vh]dec))| \
		-@(aspect|pp|x|y|xy|z|stereo|audio-@(density|delay|preload))| \
		-@(endpos|osdlevel|ffourcc|sws|channels|skiplimit|format)| \
		-@(ofps|aa@(driver|@(osd|sub)color)|vobsubout?(i@(ndex|d)))| \
		-sub@(-bg-@(alpha|color)|cp|delay|fps|pos|align|width)| \
		-sub@(font-@(blur|outline|autoscale|encoding|@(osd|text)-scale)))
			return 0
			;;
		-lavdopts)
			COMPREPLY=( $( compgen -W 'ec er= bug= idct= gray' \
					-- $cur ) )
			return 0
			;;
		-lavcopts)
			COMPREPLY=( $( compgen -W 'vcodec= vqmin= vqscale= \
					vqmax= mbqmin= mbqmax= vqdiff= \
					vmax_b_frames= vme= vhq v4mv \
					keyint= vb_strategy= vpass= \
					aspect= vbitrate= vratetol= \
					vrc_maxrate= vrc_minrate= \
					vrc_buf_size= vb_qfactor= vi_qfactor= \
					vb_qoffset= vi_qoffset= vqblur= \
					vqcomp= vrc_eq= vrc_override= \
					vrc_init_cplx= vqsquish= vlelim= \
					vcelim= vstrict= vdpart vpsize= gray \
					vfdct= idct= lumi_mask= dark_mask= \
					tcplx_mask= scplx_mask= naq ildct \
					format= pred qpel precmp= cmp= \
					subcmp= predia= dia= trell last_pred= \
					preme= subq= psnr mpeg_quant aic umv' \
					-- $cur ) )
			return 0
			;;
		-ssf)
			COMPREPLY=( $( compgen -W 'lgb= cgb= ls= cs= chs= \
					cvs=' -- $cur ) )
			return 0
			;;
		-jpeg)
			COMPREPLY=( $( compgen -W 'noprogressive progressive \
					nobaseline baseline optimize= \
					smooth= quality= outdir=' -- $cur ) )
			return 0
			;;
		-xvidopts)
			COMPREPLY=( $( compgen -W 'dr2 nodr2' -- $cur ) )
			return 0
			;;
		-xvidencopts)
			COMPREPLY=( $( compgen -W 'pass= bitrate= \
					fixed_quant= me_quality= 4mv \
					rc_reaction_delay_factor= \
					rc_averaging_period= rc_buffer= \
					quant_range= min_key_interval= \
					max_key_interval= mpeg_quant \
					mod_quant lumi_mask hintedme \
					hintfile debug keyframe_boost= \
					kfthreshold= kfreduction=' -- $cur ) )
			return 0
			;;
		-divx4opts)
			COMPREPLY=( $( compgen -W 'br= key= deinterlace q= \
					min_quant= max_quant= rc_period= \
					rc_reaction_period= crispness= \
					rc_reaction_ratio= pass= vbrpass= \
					help' -- $cur ) )
			return 0
			;;
		-info)
			COMPREPLY=( $( compgen -W 'name= artist= genre= \
					subject= copyright= srcform= \
					comment= help' -- $cur ) )
			return 0
			;;
		-lameopts)
			COMPREPLY=( $( compgen -W 'vbr= abr cbr br= q= aq= \
					ratio= vol= mode= padding= fast \
					preset= help' -- $cur ) )
			return 0
			;;
		-rawaudio)
			COMPREPLY=( $( compgen -W 'on channels= rate= \
					samplesize= format=' -- $cur ) )
			return 0
			;;
		-rawvideo)
			COMPREPLY=( $( compgen -W 'on fps= sqcif qcif cif \
					4cif pal ntsc w= h= y420 yv12 yuy2 \
					y8 format= size=' -- $cur ) )
			return 0
			;;
		-aop)
			COMPREPLY=( $( compgen -W 'list= delay= format= fout= \
					volume= mul= softclip' -- $cur ) )
			return 0
			;;
		-dxr2)
			COMPREPLY=( $( compgen -W 'ar-mode= iec958-encoded \
					iec958-decoded mute ucode= 75ire bw \
					color interlaced macrovision= norm= \
					square-pixel ccir601-pixel cr-left= \
					cr-right= cr-top= cr-bot= ck-rmin= \
					ck-gmin= ck-bmin= ck-rmax= ck-gmax= \
					ck-bmax= ck-r= ck-g= ck-b= \
					ignore-cache= ol-osd= olh-cor= \
					olw-cor= olx-cor= oly-cor= overlay \
					overlay-ratio= update-cache' -- $cur ))
			return 0
			;;
		-tv)
			COMPREPLY=( $( compgen -W 'on noaudio driver= device= \
					input= freq= outfmt= width= height= \
					buffersize= norm= channel= chanlist= \
					audiorate= forceaudio alsa amode= \
					forcechan= adevice= audioid= volume= \
					bass= treble= balance= fps= \
					channels= immediatemode=' -- $cur ) )
			return 0
			;;
		-mf)
			COMPREPLY=( $( compgen -W 'on w= h= fps= type=' \
					-- $cur ) )
			return 0
			;;
		-cdda)
			COMPREPLY=( $( compgen -W 'speed= paranoia= \
					generic-dev= sector-size= overlap= \
					toc-bias toc-offset= skip noskip' \
					-- $cur ) )
			return 0
			;;
		-input)
			COMPREPLY=( $( compgen -W 'conf= ar-delay ar-rate \
					keylist cmdlist js-dev file' -- $cur ) )
			return 0
			;;
		-af)
			COMPREPLY=( $( compgen -W 'resample resample= \
					channels channels= format format= \
					volume volume= delay delay= pan \
					pan= sub sub= surround surround=' \
					-- $cur ) )
			return 0
			;;
		-af-adv)
			COMPREPLY=( $( compgen -W 'force= list=' -- $cur ) )
			return 0
			;;
	esac

	case "$cur" in
		-*)
			COMPREPLY=( $( compgen -W '$( $cmd -list-options 2>/dev/null | \
			sed -ne '1,/^[[:space:]]*Name/d' \
			     -e "s/^[[:space:]]*/-/" -e "s/[[:space:]:].*//" \
			     -e "/^-\(Total\|.*\*\)\?$/!p" )' -- $cur ) )
			;;
		*)
			_filedir '@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|ASF|vob|VOB|bin|BIN|dat|DAT|vcd|VCD|ps|PS|pes|PES|fl[iv]|FL[IV]|viv|VIV|rm?(j)|RM?(J)|ra?(m)|RA?(M)|yuv|YUV|mov|MOV|qt|QT|mp[234]|MP[234]|m4[av]|M4[AV]|og[gmavx]|OG[GMAVX]|w?(a)v|W?(A)V|dump|DUMP|mk[av]|MK[AV]|m4a|M4A|aac|AAC|m2v|M2V|dv|DV|rmvb|RMVB|mid|MID|ts|TS|3g[p2]|mpc|MPC|flac|FLAC|vro|VRO|divx|DIVX|aif?(f)|AIF?(F)|m2ts|M2TS|vdr|VDR|xvid|XVID|ape|APE|flv|FLV)'
			;;
	esac

	return 0
}
complete $filenames -F _mplayer mplayer mencoder gmplayer kplayer
}
