diff options
Diffstat (limited to 'devscripts')
| -rw-r--r-- | devscripts/zsh-completion.in | 28 | ||||
| -rwxr-xr-x | devscripts/zsh-completion.py | 46 | 
2 files changed, 74 insertions, 0 deletions
| diff --git a/devscripts/zsh-completion.in b/devscripts/zsh-completion.in new file mode 100644 index 000000000..b394a1ae7 --- /dev/null +++ b/devscripts/zsh-completion.in @@ -0,0 +1,28 @@ +#compdef youtube-dl + +__youtube_dl() { +    local curcontext="$curcontext" fileopts diropts cur prev +    typeset -A opt_args +    fileopts="{{fileopts}}" +    diropts="{{diropts}}" +    cur=$words[CURRENT] +    case $cur in +        :) +            _arguments '*: :(::ytfavorites ::ytrecommended ::ytsubscriptions ::ytwatchlater ::ythistory)' +        ;; +        *) +            prev=$words[CURRENT-1] +            if [[ ${prev} =~ ${fileopts} ]]; then +                _path_files +            elif [[ ${prev} =~ ${diropts} ]]; then +                _path_files -/ +            elif [[ ${prev} == "--recode-video" ]]; then +                _arguments '*: :(mp4 flv ogg webm mkv)' +            else +                _arguments '*: :({{flags}})' +            fi +        ;; +    esac +} + +__youtube_dl
\ No newline at end of file diff --git a/devscripts/zsh-completion.py b/devscripts/zsh-completion.py new file mode 100755 index 000000000..e8d71928a --- /dev/null +++ b/devscripts/zsh-completion.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +import os +from os.path import dirname as dirn +import sys + +sys.path.append(dirn(dirn((os.path.abspath(__file__))))) +import youtube_dl + +ZSH_COMPLETION_FILE = "youtube-dl.zsh" +ZSH_COMPLETION_TEMPLATE = "devscripts/zsh-completion.in" + + +def build_completion(opt_parser): +    opts = [opt for group in opt_parser.option_groups +            for opt in group.option_list] +    opts_file = [opt for opt in opts if opt.metavar == "FILE"] +    opts_dir = [opt for opt in opts if opt.metavar == "DIR"] + +    fileopts = [] +    for opt in opts_file: +        if opt._short_opts: +            fileopts.extend(opt._short_opts) +        if opt._long_opts: +            fileopts.extend(opt._long_opts) + +    diropts = [] +    for opt in opts_dir: +        if opt._short_opts: +            diropts.extend(opt._short_opts) +        if opt._long_opts: +            diropts.extend(opt._long_opts) + +    flags = [opt.get_opt_string() for opt in opts] + +    with open(ZSH_COMPLETION_TEMPLATE) as f: +        template = f.read() + +    template = template.replace("{{fileopts}}", "|".join(fileopts)) +    template = template.replace("{{diropts}}", "|".join(diropts)) +    template = template.replace("{{flags}}", " ".join(flags)) + +    with open(ZSH_COMPLETION_FILE, "w") as f: +        f.write(template) + +parser = youtube_dl.parseOpts()[0] +build_completion(parser) | 
