-
Notifications
You must be signed in to change notification settings - Fork 0
/
completion.bash
117 lines (99 loc) · 3.5 KB
/
completion.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env bash
MUSIC_PATH=~/Music
_music_completions()
{
local cur_word="${COMP_WORDS[COMP_CWORD]}"
local prev_word="${COMP_WORDS[COMP_CWORD - 1]}"
local subcommand=""
for i in "${COMP_WORDS[@]}"
do
if [ "$i" = "install" ] || [ "$i" = "play" ] || [ "$i" = "tags" ] || [ "$i" = "lastfm" ]; then
subcommand="$i"
break
fi
done
if [ "$subcommand" = "play" ]; then
_music_play_completions
return 0
fi
case "$subcommand" in
play)
_music_play_completions
;;
install)
_music_install_completions
;;
tags)
_music_tags_completions
;;
lastfm)
COMPREPLY=( $(compgen -W "--help --debug --interval" -- ${cur_word}) )
;;
*)
COMPREPLY=( $(compgen -W "help completion play tags install lastfm --help --version" -- ${cur_word}) )
;;
esac
return 0
}
_music_install_completions() {
local cur_word="${COMP_WORDS[COMP_CWORD]}"
local prev_word="${COMP_WORDS[COMP_CWORD - 1]}"
case "$prev_word" in
install)
COMPREPLY=( $(compgen -W "https://www.youtube.com/watch?v=" -- "$cur_word") )
;;
--format|-f)
COMPREPLY=( $(compgen -W "3gp aac flv m4a mp3 mp4 ogg wav webm" -- "$cur_word") )
;;
--music-path|-m)
COMPREPLY=()
;;
*)
# depending how up to date you want this to be, you can set this variable outside of
# this function (global scope). It's still pretty fast for me so I personally won't
local SONGS_SUB_DIRS=$(basename -a $MUSIC_PATH/*/ | sed 's/ /-/g' | awk '{print tolower($0)}' | tr '\n' ' ')
COMPREPLY=( $(compgen -W "${SONGS_SUB_DIRS[*]}--format --ytdl-args --name --editor --music-path --help" -- "$cur_word") )
;;
esac
return 0
}
_music_tags_completions() {
local cur_word="${COMP_WORDS[COMP_CWORD]}"
local prev_word="${COMP_WORDS[COMP_CWORD - 1]}"
if [ "$prev_word" = "--music-path" ]; then
COMPREPLY=()
return 0
fi
local options="--editor --help --music-path --delete"
options+=" $(find "$MUSIC_PATH" -type f -name '*.m3u' -exec basename {} .m3u \;)"
COMPREPLY=( $(compgen -W "$options" -- "$cur_word") )
return 0
}
_music_play_completions() {
local generic_options="--help --append --live --editor --skip --random --tags --add-to-tag --set-to-tag --dry-paths --play-new-first --skip-old-first --persist --vlc-path --sort-type --music-path --dry-run --limit --new --no-persist"
local cur_word="${COMP_WORDS[COMP_CWORD]}"
local prev_word="${COMP_WORDS[COMP_CWORD - 1]}"
case "$prev_word" in
--sort-type|-s)
COMPREPLY=( $(compgen -W "a c m" -- "$cur_word") )
;;
--music-path)
COMPREPLY=()
;;
--add-to-tag|--set-to-tag|-a)
if [ -x "$(which jq)" ]; then
local tags=$(jq 'keys[]' <$MUSIC_PATH/tags.json)
COMPREPLY=( $(compgen -W "$tags" -- "$cur_word") )
else
COMPREPLY=( $(compgen -W "$generic_options" -- "$cur_word") )
fi
;;
*)
COMPREPLY=( $(compgen -W "$generic_options" -- "$cur_word") )
;;
esac
return 0
}
complete -F _music_completions -o default music
complete -F _music_completions -o default m
complete -F _music_play_completions -o default mx