# mplayer(1) completion                                    -*- shell-script -*-

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

_mplayer()
{
    local cur prev words cword
    _init_completion -n : || return

    local cmd=${words[0]} i j k=0

    case $prev in
        -[av][cfo]|-[av]fm|-vop|-fstype|-demuxer|-o[av]c|-of|-profile| \
        -audio-demuxer|-sub-demuxer)
            _mplayer_options_list $cmd $prev
            return
            ;;
        -show-profile)
            _mplayer_options_list $cmd -profile
            return
            ;;
        -audiofile|-audio-file)
            _filedir '@(mp3|mpg|ogg|w?(a)v|mid|flac|mka|ac3|ape)'
            return
            ;;
        -font|-subfont)
            if [[ $prev == -font ]]; then
                _filedir '@(desc|ttf)'
            else
                _filedir ttf
            fi
            local IFS=$'\n'
            COMPREPLY+=( $( compgen -W '$( fc-list 2>/dev/null )' -- "$cur" ) )
            return
            ;;
        -sub|-sub-file)
            _filedir '@(srt|sub|txt|utf|rar|mpsub|smi|js|ssa|ass)'
            return
            ;;
        -vobsub)
            _filedir '@(idx|ifo|sub)'
            local IFS=$'\n'
            COMPREPLY=( $( for i in "${COMPREPLY[@]}"; do
                        if [[ -f $i && -r $i ]]; then
                            printf '%s\n' ${i%.*}
                        else
                            printf '%s\n' $i
                        fi
                        done ) )
            return
            ;;
        -subcp|-msgcharset)
            local cp
            cp=( $( iconv --list 2>/dev/null | command sed -e "s@//@@;" 2>/dev/null ) )
            if [[ "$cur" == "${cur,,}" ]]; then
                COMPREPLY=( $( compgen -W '${cp[@],,}' -- "$cur" ) )
            else
                COMPREPLY=( $( compgen -W '${cp[@]^^}' -- "$cur" ) )
            fi
            return
            ;;
        -ifo)
            _filedir ifo
            return
            ;;
        -cuefile)
            _filedir '@(bin|cue)'
            return
            ;;
        -skin)
            # if you don't have installed mplayer in /usr you
            # may want to set the MPLAYER_SKINS_DIR global variable
            local -a dirs
            if [[ -n $MPLAYER_SKINS_DIR ]]; then
                dirs=($MPLAYER_SKINS_DIR)
            else
                dirs=(/usr/share/mplayer/skins /usr/local/share/mplayer/skins)
            fi

            local IFS=$'\n'
            for i in ~/.mplayer/skins ${dirs[@]}; do
                if [[ -d $i && -r $i ]]; then
                    for j in $( compgen -d -- $i/$cur ); do
                        COMPREPLY[$k]=${j#$i/}
                        k=$((++k))
                    done
                fi
            done
            return
            ;;
        -cdrom-device)
            _cd_devices
            _dvd_devices
            return
            ;;
        -dvd-device)
            _dvd_devices
            _filedir iso
            return
            ;;
        -bluray-device)
            _filedir -d
            return
            ;;
        -mixer|-dvdauth|-fb|-zrdev)
            cur=${cur:=/dev/}
            _filedir
            return
            ;;
        -edl|-edlout|-lircconf|-menu-cfg|-playlist|-csslib|-dumpfile| \
        -subfile|-vobsub|-aofile|-fbmodeconfig|-include|-o|-dvdkey| \
        -passlogfile)
            _filedir
            return
            ;;
        -autoq|-autosync|-loop|-menu-root|-speed|-sstep|-aid|-alang| \
        -bandwidth|-bluray-angle|-bluray-chapter|-cache|-chapter|-dvd-speed| \
        -dvdangle|-fps|-frames|-mc|-passwd|-user|-sb|-srate|-ss|-vcd| \
        -vi|-vid|-vivo|-ffactor|-sid|-slang|-spualign|-spuaa|-spugauss| \
        -vobsubid|-delay|-bpp|-brightness|-contrast|-dfbopts|-display| \
        -fbmode|-geometry|-guiwid|-hue|-icelayer|-screen[wh]|-wid| \
        -monitor-dotclock|-monitor-[hv]freq|-panscan| \
        -saturation|-xineramascreen|-zrcrop|-zrnorm|-zrquality| \
        -zr[xy]doff|-zr[vh]dec|-pp|-x|-y|-xy|-z|-stereo| \
        -audio-density|-audio-delay|-audio-preload|-endpos|-osdlevel| \
        -ffourcc|-sws|-skiplimit|-format|-ofps|-aadriver| \
        -aaosdcolor|-aasubcolor|-vobsubout|-vobsuboutid|-vobsuboutindex| \
        -sub-bg-alpha|-sub-bg-color|-subdelay|-subfps|-subpos| \
        -subalign|-subwidth|-subfont-blur|-subfont-outline| \
        -subfont-autoscale|-subfont-encoding|-subfont-osd-scale| \
        -subfont-text-scale)
            return
            ;;
        -channels)
            COMPREPLY=( $( compgen -W '2 4 6 8' -- "$cur" ) )
            return
            ;;
        -aspect|-monitoraspect)
            COMPREPLY=( $( compgen -W '1:1 3:2 4:3 5:4 14:9 14:10 16:9 16:10
                2.35:1' -- "$cur" ) )
            __ltrim_colon_completions "$cur"
            return
            ;;
        -lavdopts)
            COMPREPLY=( $( compgen -W 'bitexact bug= debug= ec= er= fast gray
                idct= lowres= sb= st= skiploopfilter= skipidct= skipframe=
                threads= vismv= vstats' -- "$cur" ) )
            return
            ;;
        -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
            ;;
        -ssf)
            COMPREPLY=( $( compgen -W 'lgb= cgb= ls= cs= chs= cvs=' \
                -- "$cur" ) )
            return
            ;;
        -jpeg)
            COMPREPLY=( $( compgen -W 'noprogressive progressive nobaseline
                baseline optimize= smooth= quality= outdir=' -- "$cur" ) )
            return
            ;;
        -xvidopts)
            COMPREPLY=( $( compgen -W 'dr2 nodr2' -- "$cur" ) )
            return
            ;;
        -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
            ;;
        -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
            ;;
        -info)
            COMPREPLY=( $( compgen -W 'name= artist= genre= subject=
                copyright= srcform= comment= help' -- "$cur" ) )
            return
            ;;
        -lameopts)
            COMPREPLY=( $( compgen -W 'vbr= abr cbr br= q= aq= ratio= vol=
                mode= padding= fast preset= help' -- "$cur" ) )
            return
            ;;
        -rawaudio)
            COMPREPLY=( $( compgen -W 'on channels= rate= samplesize= format=' \
                -- "$cur" ) )
            return
            ;;
        -rawvideo)
            COMPREPLY=( $( compgen -W 'on fps= sqcif qcif cif 4cif pal ntsc w=
                h= y420 yv12 yuy2 y8 format= size=' -- "$cur" ) )
            return
            ;;
        -aop)
            COMPREPLY=( $( compgen -W 'list= delay= format= fout= volume= mul=
                softclip' -- "$cur" ) )
            return
            ;;
        -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
            ;;
        -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
            ;;
        -mf)
            COMPREPLY=( $( compgen -W 'on w= h= fps= type=' -- "$cur" ) )
            return
            ;;
        -cdda)
            COMPREPLY=( $( compgen -W 'speed= paranoia= generic-dev=
                sector-size= overlap= toc-bias toc-offset= skip noskip' \
                -- "$cur" ) )
            return
            ;;
        -input)
            COMPREPLY=( $( compgen -W 'conf= ar-delay ar-rate keylist cmdlist
                js-dev file' -- "$cur" ) )
            return
            ;;
        -af-adv)
            COMPREPLY=( $( compgen -W 'force= list=' -- "$cur" ) )
            return
            ;;
        -noconfig)
            COMPREPLY=( $( compgen -W 'all gui system user' -- "$cur" ) )
            return
            ;;
        -*)
            # Assume arg is required for everything else except options
            # for which -list-options says Type is Flag or Print.
            $cmd -nomsgcolor -nomsgmodule -list-options 2>/dev/null \
            | while read -r i j k; do
                if [[ $i == ${prev#-} ]]; then
                    [[ ${j,,} != @(flag|print) ]] && return 1
                    break
                fi
            done || return
            ;;
    esac

    case $cur in
        -*)
            COMPREPLY=( $( compgen -W '$( $cmd -nomsgcolor -nomsgmodule -list-options 2>/dev/null | \
                command sed -ne '1,/^[[:space:]]*Name/d' \
                    -e "s/^[[:space:]]*/-/" -e "s/[[:space:]:].*//" \
                    -e "/^-\(Total\|.*\*\)\{0,1\}$/!p" )' -- "$cur" ) )
            ;;
        *)
            _filedir '@(m?(j)p?(e)g|M?(J)P?(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]|fxm|FXM|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|m[24]v|M[24]V|dv|DV|rmvb|RMVB|mid|MID|t[ps]|T[PS]|3g[p2]|3gpp?(2)|mpc|MPC|flac|FLAC|vro|VRO|divx|DIVX|aif?(f)|AIF?(F)|m2t?(s)|M2T?(S)|mts|MTS|vdr|VDR|xvid|XVID|ape|APE|gif|GIF|nut|NUT|bik|BIK|webm|WEBM|amr|AMR|awb|AWB|iso|ISO|opus|OPUS)?(.part)'
            ;;
    esac

} &&
complete -F _mplayer mplayer mplayer2 mencoder gmplayer kplayer

# ex: filetype=sh
