mirror of
https://github.com/mitb-archive/filebot
synced 2024-11-13 21:05:01 -05:00
205 lines
7.3 KiB
Bash
205 lines
7.3 KiB
Bash
#!/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
|