117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			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 "$@"
 |