#compdef aac2mp4 mp42aac mp42avc mp42hevc mp42hls mp42ts mp4compact mp4dash mp4dashclone mp4dcfpackager mp4decrypt mp4dump mp4edit mp4encrypt mp4extract mp4fragment mp4hls mp4iframeindex mp4info mp4mux mp4rtphintinfo mp4split mp4tag
# ------------------------------------------------------------------------------
# Copyright (c) 2026 Github zsh-users - https://github.com/zsh-users
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
# ------------------------------------------------------------------------------
# Description
# -----------
#
#  Completion script for bento4 tools 1.6.0-641 (https://github.com/axiomatic-systems/Bento4)
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
#  * Shohei Yoshida (https://github.com/syohex) <syohex@gmail.com>
#
# ------------------------------------------------------------------------------

local -a encrypt_methods=(
  OMA-PDCF-CBC OMA-PDCF-CTR MARLIN-IPMP-ACBC MARLIN-IPMP-ACGK ISMA-IAEC PIFF-CBC
  PIFF-CTR MPEG-CENC MPEG-CBC1 MPEG-CENS MPEG-CBCS
)
local -a options=()

case $service in
  (mp42aac|mp42avc|mp42hevc)
    options+=('--key[128-bit decryption key (in hex: 32 chars)]:key')
    ;;
  (mp42hls)
    options+=(
      '--verbose[enable verbose mode]'
      '--show-info[show information]'
      '--hls-version[HLS version(default: 3)]:version'
      '--pmt-pid[PID to use for the PMT(default: 0x100)]:pid'
      '--audio-pid[PID to use for audio packets(default: 0x101)]:pid'
      '--video-pid[PID to use for video packets(default: 0x102)]:pid'
      '--audio-track-id[Read audio from the given track ID(0 means no audio)]:track_id'
      '--video-track-id[Read video from the given track ID(0 means no video)]:track_id'
      '--audio-format[Format to use for audio-only segments(default: ts)]:format:(ts packed)'
      '--segment-duration[Target segment duration in seconds(default: 6)]:seconds'
      '--segment-duration-threshold[Segment duration threshold in milliseconds(default: 15)]:seconds'
      '--pcr-offset[offset in units of 90kHz(default: 1000)]:offset'
      '--index-filename[File name to use for the playlist/index(default: stream.m3u8)]:name:_files'
      '--allow-cache[set #EXT-X-ALLOW_CACHE to YES or NO]: :(YES NO)'
      '--segment-filename-template[File name pattern to use for the segment(default: segment-%d.<ext> or stream.<ext>)]:pattern'
      '--segment-url-template[URL pattern to use for segments(default: segment-%d.<ext> or stream.<ext>)]:pattern'
      '--iframe-index-filename[File name to use for the I-Frame playlist(default: iframes.m3u8)]:file:_files'
      '--output-single-file[Output all the media in a single file instead of separate segment files]'
      '--encryption-mode[Encryption mode(default: AES-128)]:mode:(AES-128 SAMPLE-AES)'
      '--encryption-key[Encryption key in hexadecimal(default: no encryption)]:key'
      '--encryption-iv-mode[Encryption IV mode(default: separate)]:mode:(sequence random fps)'
      '--encryption-key-uri[Encryption key URI, relative or absolute URI(default: key.bin)]:uri'
      '--encryption-key-format[Encryption key format(default: identity)]:format'
      '--encryption-key-format-versions[Encryption key format versions]:versions'
      '--encryption-key-line[Preformatted encryption key line]:ext_x_key_line'
    )
    ;;
  (mp42ts)
    options+=(
      '--pmt-pid[PID to use for the PMT(default: 0x100)]:pid'
      '--audio-pid[PID to use for audio packets(default: 0x101)]:pid'
      '--video-pid[PID to use for video packets(default: 0x102)]:pid'
      '--segment[Segment duration in seconds]:seconds'
      '--segment-duration-threshold[Segment duration threshold in milliseconds(default: 50)]:seconds'
      '--pcr-offset[offset in units of 90kHz(default: 1000)]:offset'
      '--verbose[enable verbose mode]'
      '--playlist[Playlist file name]:file:_files'
      '--playlist-hls-version[HLS version(default: 3)]:version'
    )
    ;;
  (mp4compact)
    options+=('--verbose[Enable verbose mode]')
    ;;
  (mp4dash)
    options+=(
      '(- *)'{-h,--help}'[Show this help message and exit]'
      '(-v --verbose)'{-v,--verbose}'[Be verbose]'
      '(-d --debug)'{-d,--debug}'[Print out debugging information]'
      '(-o --output-dir)'{-o,--output-dir=}'[Output directory]:dir:_files -/'
      '(-f --force)'{-f,--force}'[Allow output to an existing directory]'
      '--mpd-name=[MPD file name]:file:_files'
      '--profiles=[Comma-separated list of one or more profile(s)]:profiles'
      '--no-media[Do not output media files (MPD/Manifests only)]'
      '--rename-media[Use a file name pattern instead of the base name of input files]'
      '--media-prefix=[Use this prefix for prefixed media file names(default: media)]:prefix'
      '--init-segment=[Initialization segment name]:file:_files'
      '--no-split[Do not split the file into individual segment files]'
      '--use-segment-list[Use segment lists instead of segment templates]'
      '--use-segment-template-number-padding[Use padded numbers in segment URL/filename templates]'
      '--use-segment-timeline[Use segment timelines]'
      '--min-buffer-time=[Minimum buffer time in seconds]:seconds'
      '--max-playout-rate=[Max Playout Rate setting strategy for trick-play support]:strategy:(lowest:X)'
      '--language-map=[Remap language code <lang_from> to <lang_to>]:from_to_list'
      '--always-output-lang[Always output an @lang attribute for audio tracks]'
      '--subtitles[Enable Subtitles]'
      *'--attributes=[Specify the attributes of a set of tracks]:attribute'
      '--smooth[Produce an output compatible with Smooth Streaming]'
      '--smooth-client-manifest-name=[Smooth Streaming Client Manifest file name]:file:_files'
      '--smooth-server-manifest-name=[Smooth Streaming Server Manifest file name]:file:_files'
      '--smooth-h264-fourcc=[Smooth Streaming FourCC value for H.264 video(default H264)]:fourcc'
      '--hls[Output HLS playlists in addition to MPEG DASH]'
      '--hls-key-url=[HLS key URL (default: key.bin)]:url'
      '--hls-master-playlist-name=[HLS master playlist name (default: master.m3u8)]:file:_files'
      '--hls-media-playlist-name=[HLS media playlist name (default: media.m3u8)]:file:_files'
      '--hls-iframes-playlist-name=[HLS I-Frames playlist name (default: iframes.m3u8)]'
      '--hippo[Produce an output compatible with the Hippo Media Server]'
      '--hippo-server-manifest-name=[Hippo Media Server Manifest file name]:file:_files'
      '--use-compat-namespace[Use the original DASH MPD namespace]'
      '--use-legacy-audio-channel-config-uri[Use the legacy DASH namespace URI]'
      '--encryption-key=[Encryption key specifications]:key_spec'
      '--encryption-cenc-scheme=[MPEG Common Encryption scheme(default: cenc)]:scheme:(cenc cbc1 cens cbcs)'
      '--encryption-args=[Pass additional command line arguments to mp4encrypt]:args'
      '--eme-signaling=[Add EME-compliant signaling in the MPD and PSSH boxes]:type:(pssh-v0 pssh-v1)'
      '--merge-keys[Merge all keys in a single set used for all ContentProtection elements]'
      '--marlin[Add Marlin signaling to the MPD]'
      '--marlin-add-pssh[Add an (optional) Marlin "pssh" box in the init segment(s)]'
      '--playready[Add PlayReady signaling to the MPD]'
      '--playready-version=[PlayReady version to use]:version:(4.0 4.1 4.2 4.3)'
      '--playready-header=[Add a PlayReady PRO element in the MPD and a PlayReady PSSH box in the init segments]:header'
      '--playready-no-pssh[Do not store the PlayReady header in a "pssh" box in the init segment(s)]'
      '--widevine[Add Widevine signaling to the MPD]'
      '--widevine-header=[Add a Widevine entry in the MPD, and a Widevine PSSH box in the init segments]:header'
      '--primetime[Add Primetime signaling to the MPD]'
      '--primetime-metadata=[Add Primetime metadata in a PSSH box in the init segments]:metadata'
      '--fairplay-key-uri=[Specify the key URI to use for FairPlay Streaming key delivery]:uri'
      '--clearkey[Add Clear Key signaling to the MPD]'
      '--clearkey-license-uri=[Specify the license/key URI to use for Clear Key]'
      '--exec-dir=[Directory where the Bento4 executables are located]:dir:_files -/'
    )
    ;;
  (mp4dashclone)
    options+=(
      '(- *)'{-h,--help}'[Show this help message and exit]'
      '--quiet[Be quiet]'
      '--encrypt=[Encrypt the media with KID and KEY specified in HEX(32 characters each)]:key'
      '--exec-dir=[Directory where the Bento4 executables are located]:dir:_files -/'
    )
    ;;
  (mp4dcfpackager)
    options+=(
      '--method[method name]:method:(NULL CBC CTR)'
      '--content-type[Content MIME type]:mime_type'
      '--content-id[Content ID]:id'
      '--rights-issuer[rights issuer URL]:url'
      '--key[Specify the key to use for encryption]:key'
      *'--textual-header[Specify a textual header]:header'
    )
    ;;
  (mp4decrypt)
    options+=(
      '--show-progress[Show progress details]'
      '--key[Specify the key to use for decryption]:key'
      '--fragments-info[File to decrypt the fragments read from]:file:_files'
    )
    ;;
  (mp4dump)
    options+=(
      '--verbosity[Set the verbosity level]:level:(0 1 2 3)'
      '--track[Write the track data into a file]:file:_files'
      '--format[Format to use for the output(default: text)]:format:(text json)'
    )
    ;;
  (mp4edit)
    options+=(
      '--insert[insert atom data]:atom_path_and_source_and_position'
      '--remove[remove atom data]:atom_path'
      '--replace[replace atom data]:atom_path_and_source'
    )
    ;;
  (mp4encrypt)
    options+=(
      '--method=[Encryption method]:method:($encrypt_methods)'
      '--show-progress[Show progress details]'
      '--fragments-info[Encrypt the fragments read from <input> with track info read from the given file]:file:_files'
      '--multi[Encrypt multiple individual fragment files]'
      '--key[Specify the key to use for a track (or group key)]:key_spec'
      '--strict[Fail if there is a warning]'
      *'--property[Specify a named string property for a track]:property'
      '--global-option[Set the global option]:option'
      '--pssh[Add a "pssh" atom for this system ID with the payload]:pssh'
      '--pssh-v1[Same as --pssh but generates a version=1 "pssh" atom]:pssh'
      '--kms-uri[Specify the KMS URI for the ISMA-IAEC method]:uri'
    )
    ;;
  (mp4extract)
    options+=(
      '--payload-only[Omit the atom header]'
    )
    ;;
  (mp4fragment)
    options+=(
      '--verbosity[Set the verbosity level]:level:(0 1 2 3)'
      '--debug[Enable debugging information output]'
      '--quiet[Do not print out notice messages]'
      '--fragment-duration[Fragment duration in milliseconds(default: automatic)]:msecs'
      '--timescale[Time scale]:time_scale'
      '--track[Specify track ID or type only include media from one track]:id_or_type:(audio video subtitles)'
      '--index[(Re)create the segment index]'
      '--trim[Trim excess media in longer tracks]'
      '--no-tfdt[Do not add "tfdt boxes in the fragments"]'
      '--tfdt-start[Set start value of the first tfdt timestamp]:start'
      '--sequence-number-start[Set start value of the first segment sequence number(default: 1)]:number'
      '--force-i-frame-sync[Treat all I-frames as sync samples]:type:(auto all)'
      '--copy-udta[Copy the moov/udta atom from input to output]'
      '--no-zero-elst[Do not set the last edit list entry to 0 duration]'
      '--trun-version-zero[Set the "trun" box version to zero(default version: 1)]'
    )
    ;;
  (mp4hls)
    options+=(
      '(- *)'{-h,--help}'[Show this help message and exit]'
      '(-v --verbose)'{-v,--verbose}'[Be verbose]'
      '(-d --debug)'{-d,--debug}'[Print out debugging information]'
      '(-o --output-dir)'{-o,--output-dir=}'[Output directory]:dir:_files -/'
      '(-f --force)'{-f,--force}'[Allow output to an existing directory]'
      '--hls-version=[HLS version]:version'
      '--master-playlist-name=[Master Playlist name]:file:_files'
      '--media-playlist-name=[Media Playlist name]:file:_files'
      '--iframe-playlist-name=[I-frame Playlist name]:name'
      '--output-single-file[Store segment data in a single output file per input file]'
      '--audio-format=[Format for audio segments]:format:(packed ts)'
      '--segment-duration=[Segment duration(default: 6)]:duration'
      '--encryption-mode=[Encryption mode(default: AES-128)]:mode:(AES-128 SAMPLE-AES)'
      '--encryption-key=[Encryption key in hexadecimal]:key'
      '--encryption-iv-mode=[Encryption IV mode]:mode:(sequence random fps)'
      '--encryption-key-uri=[Encryption key URI(default: key.bin)]:uri'
      '--encryption-key-format=[Encryption key format (default: identity)]:mode:(identity)'
      '--encryption-key-format-versions=[Encryption key format versions]:versions'
      '--signal-session-key[Signal an #EXT-X-SESSION-KEY tag in the master playlist]'
      '--fairplay=[Enable FairPlay Key Delivery and set parameters]:parameters'
      '--widevine=[Enable Widevine Key Delivery and set parameters]:parameters'
      '--output-encryption-key[Output the encryption key to a file]'
      '--exec-dir=[Directory where the Bento4 executables are located]:dir:_files -/'
      '--base-url=[The base URL for the Media Playlists and TS files listed in the playlists]:uri'
    )
    ;;
  (mp4iframeindex)
    options+=(
      '--track[ID of the video track]:id'
    )
    ;;
  (mp4info)
    options+=(
      '--verbose[Show extended information when available]'
      '--format[Display the information in this format(default: text)]:format:(text json)'
      '--show-layout[Show sample layout]'
      '--show-samples[Show sample details]'
      '--show-sample-data[Show sample data]'
      '--fast[Skip some details that are slow to compute]'
    )
    ;;
  (mp4mux)
    options+=(
      *'--track=[Track type, input, parameters]:track'
      '--verbose[Show more details]'
    )
    ;;
  (mp4rtphintinfo)
    options+=(
      '--trackid[Hint track ID]:id'
    )
    ;;
  (mp4split)
    options+=(
      '--verbose[Print verbose information when running]'
      '--init-segment[Name of init segment(default: init.mp4)]:file:_files'
      '--init-only[Only output the init segment(no media segments)]'
      '--media-segment[Segment file name pattern(default: segment-%llu.%04llu.m4s)]:pattern'
      '--start-number[Start numbering segments at n(default=1)]:number'
      '--pattern-parameters[One or more selector letter(default: IN)]:params'
      '--track-id[Only output segments with this track ID]:id'
      '--audio[Only output audio segments]'
      '--video[Only output video segments]'
    )
    ;;
  (mp4tag)
    options+=(
      '--help[Print this usage information]'
      '--show-tags[Show tags found in the input file]'
      '--list-symbols[List all the builtin symbols]'
      '--list-keys[List all the builtin symbolic key names]'
      '--set[Set a tag]:tag'
      '--add[Set/Add a tag]:tag'
      '--remove[Remove a tag]:key'
      '--extract[extract the value of a tag and save it to a file]:key_file'
    )
    ;;
esac

_arguments \
  "${options[@]}" \
  "*::file:_files"

# Local Variables:
# mode: Shell-Script
# sh-indentation: 2
# indent-tabs-mode: nil
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 ts=2 et
