#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) # # ------------------------------------------------------------------------------ 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. or stream.)]:pattern' '--segment-url-template[URL pattern to use for segments(default: segment-%d. or stream.)]: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 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 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