#!/usr/bin/env bash # # filebot Bash Completion # ======================= # # Bash completion support for the `filebot` command, # generated by [picocli](http://picocli.info/) version 4.0.0-beta-1b. # # Installation # ------------ # # 1. Source all completion scripts in your .bash_profile # # cd $YOUR_APP_HOME/bin # for f in $(find . -name "*_completion"); do line=". $(pwd)/$f"; grep "$line" ~/.bash_profile || echo "$line" >> ~/.bash_profile; done # # 2. Open a new bash console, and type `filebot [TAB][TAB]` # # 1a. Alternatively, if you have [bash-completion](https://github.com/scop/bash-completion) installed: # Place this file in a `bash-completion.d` folder: # # * /etc/bash-completion.d # * /usr/local/etc/bash-completion.d # * ~/bash-completion.d # # Documentation # ------------- # The script is called by bash whenever [TAB] or [TAB][TAB] is pressed after # 'filebot (..)'. By reading entered command line parameters, # it determines possible bash completions and writes them to the COMPREPLY variable. # Bash then completes the user input if only one entry is listed in the variable or # shows the options if more than one is listed in COMPREPLY. # # References # ---------- # [1] http://stackoverflow.com/a/12495480/1440785 # [2] http://tiswww.case.edu/php/chet/bash/FAQ # [3] https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html # [4] http://zsh.sourceforge.net/Doc/Release/Options.html#index-COMPLETE_005fALIASES # [5] https://stackoverflow.com/questions/17042057/bash-check-element-in-array-for-elements-in-another-array/17042655#17042655 # [6] https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion # if [ -n "$BASH_VERSION" ]; then # Enable programmable completion facilities when using bash (see [3]) shopt -s progcomp elif [ -n "$ZSH_VERSION" ]; then # Make alias a distinct command for completion purposes when using zsh (see [4]) setopt COMPLETE_ALIASES alias compopt=complete fi # ArrContains takes two arguments, both of which are the name of arrays. # It creates a temporary hash from lArr1 and then checks if all elements of lArr2 # are in the hashtable. # # Returns zero (no error) if all elements of the 2nd array are in the 1st array, # otherwise returns 1 (error). # # Modified from [5] function ArrContains() { local lArr1 lArr2 declare -A tmp eval lArr1=("\"\${$1[@]}\"") eval lArr2=("\"\${$2[@]}\"") for i in "${lArr1[@]}";{ [ -n "$i" ] && ((++tmp[$i]));} for i in "${lArr2[@]}";{ [ -n "$i" ] && [ -z "${tmp[$i]}" ] && return 1;} return 0 } # Bash completion entry point function. # _complete_filebot finds which commands and subcommands have been specified # on the command line and delegates to the appropriate function # to generate possible options and subcommands for the last specified subcommand. function _complete_filebot() { # No subcommands were specified; generate completions for the top-level command. _picocli_filebot; return $?; } # Generates completions for the options and subcommands of the `filebot` command. function _picocli_filebot() { # Get completion data CURR_WORD=${COMP_WORDS[COMP_CWORD]} PREV_WORD=${COMP_WORDS[COMP_CWORD-1]} COMMANDS="" FLAG_OPTS="-rename -non-strict -get-subtitles -check -list -mediainfo -revert -extract -r -unixfs -no-xattr -no-history -clear-cache -clear-prefs -version -help" ARG_OPTS="--mode --db --order --action --conflict --filter --mapper --format --q --lang --output --encoding -script --def --file-filter -exec --log --log-file --license" mode_OPTION_ARGS="interactive" # --mode values db_OPTION_ARGS="TheTVDB AniDB TheMovieDB::TV TVmaze TheMovieDB OMDb AcoustID ID3 exif xattr file" # --db values order_OPTION_ARGS="Airdate DVD Absolute AbsoluteAirdate" # --order values action_OPTION_ARGS="move copy keeplink symlink hardlink clone duplicate test" # --action values conflict_OPTION_ARGS="skip override fail auto index" # --conflict values lang_OPTION_ARGS="sq ar hy bg ca hr cs da nl en fi fr qc de el he hi hu is id it ja x-jat ko lv lt mk ms zh tw hk no fa pl pt pb ro ru sr sk sl es mx sv th tr uk vi" # --lang values encoding_OPTION_ARGS="UTF-8 Windows-1252" # --encoding values StringString_OPTION_ARGS="name=value" # --def values log_OPTION_ARGS="OFF SEVERE WARNING INFO CONFIG FINE FINER FINEST ALL" # --log values compopt +o default case ${PREV_WORD} in --mode) COMPREPLY=( $( compgen -W "${mode_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --db) COMPREPLY=( $( compgen -W "${db_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --order) COMPREPLY=( $( compgen -W "${order_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --action) COMPREPLY=( $( compgen -W "${action_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --conflict) COMPREPLY=( $( compgen -W "${conflict_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --filter) compopt -o filenames COMPREPLY=( $( compgen -X '!*.groovy' -f -- ${CURR_WORD} ) ) # *.groovy files return $? ;; --mapper) compopt -o filenames COMPREPLY=( $( compgen -X '!*.groovy' -f -- ${CURR_WORD} ) ) # *.groovy files return $? ;; --format) compopt -o filenames COMPREPLY=( $( compgen -X '!*.groovy' -f -- ${CURR_WORD} ) ) # *.groovy files return $? ;; --q) return ;; --lang) COMPREPLY=( $( compgen -W "${lang_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --output) compopt -o dirnames COMPREPLY=( $( compgen -d -- ${CURR_WORD} ) ) # directories return $? ;; --encoding) COMPREPLY=( $( compgen -W "${encoding_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; -script) compopt -o filenames COMPREPLY=( $( compgen -X '!*.groovy' -f -- ${CURR_WORD} ) ) # *.groovy files return $? ;; --def) COMPREPLY=( $( compgen -W "${StringString_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --file-filter) compopt -o filenames COMPREPLY=( $( compgen -X '!*.groovy' -f -- ${CURR_WORD} ) ) # *.groovy files return $? ;; -exec) COMPREPLY=( $( compgen -c -- ${CURR_WORD} ) ) # commands return ;; --log) COMPREPLY=( $( compgen -W "${log_OPTION_ARGS}" -- ${CURR_WORD} ) ) return $? ;; --log-file) compopt -o filenames COMPREPLY=( $( compgen -f -- ${CURR_WORD} ) ) # files return $? ;; --license) compopt -o filenames COMPREPLY=( $( compgen -X '!*.psm' -f -- ${CURR_WORD} ) ) # *.psm files return $? ;; esac if [[ "${CURR_WORD}" == -* ]]; then COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS}" -- ${CURR_WORD}) ) else compopt -o filenames COMPREPLY=( $( compgen -f -- ${CURR_WORD} ) ) # files fi } # Define a completion specification (a compspec) for the # `filebot`, `filebot.sh`, and `filebot.bash` commands. # Uses the bash `complete` builtin (see [6]) to specify that shell function # `_complete_filebot` is responsible for generating possible completions for the # current word on the command line. # The `-o default` option means that if the function generated no matches, the # default Bash completions and the Readline default filename completions are performed. complete -F _complete_filebot -o default filebot filebot.sh filebot.bash