zsh-completions/src/_id3v2

117 lines
4.0 KiB
Plaintext

#compdef id3v2
# ------------------------------------------------------------------------------
# Description
# -----------
#
# Completion script for id3v2, based on v0.1.12
#
# Last updated: 05.04.2013
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Valodim ( https://github.com/Valodim )
#
# ------------------------------------------------------------------------------
_id3v2_genre () {
setopt localoptions extendedglob
local -A _id3v2_genres
# got them cached?
if _cache_invalid id3v2-genres || ! _retrieve_cache id3v2-genres ; then
# generate from id3 -L otherwise
local tmp
for line in ${${${(f)"$(_call_program id3v2genres id3v2 -L)"}## #}}; do
tmp=( ${(s,: ,)line} )
_id3v2_genres[${tmp[1]}]=$tmp[2]
# alternate display string, which I decided against in the end
# to preserve reasonable alphabetic sorting
# "${(l:3:: :)${tmp[1]}}: ${tmp[2]}"
done
# store if we got any
(( $#_id3v2_genres > 0 )) && _store_cache id3v2-genres _id3v2_genres
fi
# bail if we don't
(( $#_id3v2_genres > 0 )) || { _message "could not fetch genres"; return }
_wanted id3v2genres expl 'Genres' \
compadd -d _id3v2_genres -k _id3v2_genres && return 0
}
# this function assumes _id3v2_frames is defined!
_id3v2_frame () {
(( $#_id3v2_frames > 0 )) || { _message "could not fetch genres"; return }
local -a framenames
framenames=( ${_id3v2_frames#--} )
_describe -t framenames 'id3v2 frames' framenames
}
_id3v2 () {
setopt localoptions extendedglob
# previous word was a frame name? this is an argument, then.
if [[ $words[$CURRENT-1] == --[A-Z](#c4) ]]; then
_message 'frame value'
return 0
fi
# load frame names
local -a _id3v2_frames
if _cache_invalid id3v2-frames || ! _retrieve_cache id3v2-frames ; then
_id3v2_frames=( ${${${(f)"$(_call_program id3v2frames id3v2 -f)"}## #}/ /:} )
(( $#_id3v2_frames > 0 )) && _store_cache id3v2-frames _id3v2_frames
fi
local ret=1
# if we already have a -- prefix, show all those frames
if [[ -prefix -- ]] && (( $#_id3v2_frames > 0 )); then
_describe -t frames 'id3v2 frames' _id3v2_frames && ret=0
fi
local showfiles=''
(( CURRENT <= 2 )) && showfiles='!'
# regular arguments either way
_arguments \
- tagging \
'(-s --delete-v1 -d --delete-v2)'{-s,--delete-v1}'[deletes id3v1 tags]' \
'(-s --delete-v1 -d --delete-v2)'{-d,--delete-v2}'[deletes id3v2 tags]' \
'(-C --convert)'{-C,--convert}'[converts id3v1 tag to id3v2]' \
'(-1 --id3v1-only -2 --id3v2-only)'{-1,--id3v1-only}'[write only id3v1 tag]' \
'(-1 --id3v1-only -2 --id3v2-only)'{-2,--id3v2-only}'[write only id3v2 tag]' \
'(-r --remove-frame)'{-r,--remove-frame}'[removes specified id3v2 frame]:frame id:_id3v2_frame' \
'(-a --artist)'{-a,--artist}'[set artist]:artist' \
'(-A --album)'{-A,--album}'[set album title]:album' \
'(-t --song)'{-t,--song}'[set song title]:song title' \
'(-c --comment)'{-c,--comment}'[set comment field]' \
'(-g --genre)'{-g,--genre}'[set the genre number]:genre:_id3v2_genre' \
'(-y --year)'{-y,--year}'[set the year]:year' \
'(-T --track)'{-T,--track}'[set the track number/(optional) total tracks]:track number (current/total)' \
'(-R --list-rfc822)'{-R,--list-rfc822}'[lists using an rfc822-style format for output]' \
'(-)'{-D,--delete-all}'[deletes both id3v1 and id3v2 tags]' \
'(-)'{-l,--list}'[lists the tag(s) on the file(s)]' \
$showfiles'*:mp3 file:_files -g "*.mp3"' \
- meta \
'(- *)'{-f,--list-frames}'[display all possible frames for id3v2]' \
'(- *)'{-L,--list-genres}'[lists all id3v1 genres]' \
'(- *)'{-h,--help}'[display help and exit]' \
'(- *)'{-v,--version}'[display version information and exit]' && ret=0
return ret
}
_id3v2 "$@"