diff options
| -rwxr-xr-x | devscripts/generate-testfile.sh | 36 | ||||
| -rwxr-xr-x | devscripts/release.sh | 50 | ||||
| -rwxr-xr-x | transcode.sh | 60 | ||||
| -rw-r--r-- | transcode.sh.bash-completion.sh | 4 |
4 files changed, 75 insertions, 75 deletions
diff --git a/devscripts/generate-testfile.sh b/devscripts/generate-testfile.sh index e8bcbe8..fab91cd 100755 --- a/devscripts/generate-testfile.sh +++ b/devscripts/generate-testfile.sh @@ -125,7 +125,7 @@ readonly EXIT_OK EXIT_RUNTIME_FAILURE EXIT_USAGE_ERROR EXIT_CONFIG_ERROR EXIT_MI # OUTPUT HELPERS ############################################################################### -emit() { +function emit() { local prefix="$1" local color="$2" shift 2 @@ -151,29 +151,29 @@ emit() { printf "\n" } -error() { +function error() { emit "==> ERROR:" "$RED" "$@" >&2 } -msg() { +function msg() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$GREEN" "$@" fi } -warn() { +function warn() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$YELLOW" "$@" fi } -verbose() { +function verbose() { if [[ $VERBOSE -eq 1 && $QUIET -eq 0 ]]; then emit "==>" "$BLUE" "$@" fi } -debug() { +function debug() { if [[ $DEBUG -eq 1 ]]; then emit "==> DEBUG:" "$MAGENTA" "$@" fi @@ -183,7 +183,7 @@ debug() { # HELP AND VERSION OUTPUT ############################################################################### -print_help() { +function print_help() { printf "${BOLD}${MAGENTA}%s${ALL_OFF} - ${BOLD}${CYAN}%s${ALL_OFF} - ${BOLD}%s${ALL_OFF} ${BOLD}${BLUE}Usage:${ALL_OFF} ${BOLD}${MAGENTA}%s${ALL_OFF} ${BOLD}${YELLOW}[OPTION]...${ALL_OFF} ${BOLD}${GREEN}[OUTPUT]${ALL_OFF} @@ -221,7 +221,7 @@ ${BOLD}${BLUE}Examples:${ALL_OFF} "$SCRIPTNAME" "$SCRIPTNAME" "$SCRIPTNAME" "$SCRIPTNAME" } -print_version() { +function print_version() { printf "${RED}${BOLD}Scriptname:${ALL_OFF} %s ${GREEN}${BOLD}Version:${ALL_OFF} %s ${YELLOW}${BOLD}Description:${ALL_OFF} %s @@ -272,7 +272,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" \ # disabled. If FORCE_COLOR is set, colors are always enabled. ############################################################################### -setup_colors() { +function setup_colors() { if [[ "$ENABLE_COLOR" -eq 1 ]]; then if tput setaf 0 >/dev/null 2>&1; then debug "Setting colors via tput" @@ -313,7 +313,7 @@ setup_colors() { # GENERATION HELPERS ############################################################################### -require_command() { +function require_command() { local command_name="$1" command -v "$command_name" >/dev/null 2>&1 || { @@ -322,28 +322,28 @@ require_command() { } } -validate_resolution() { +function validate_resolution() { if [[ ! "$RESOLUTION" =~ ^[1-9][0-9]*x[1-9][0-9]*$ ]]; then error "Resolution must use WIDTHxHEIGHT format:" "$RESOLUTION" exit $EXIT_USAGE_ERROR fi } -validate_length() { +function validate_length() { if [[ "$LENGTH" =~ ^- ]]; then error "Length must be a positive ffmpeg duration:" "$LENGTH" exit $EXIT_USAGE_ERROR fi } -validate_frame_rate() { +function validate_frame_rate() { if [[ ! "$FRAME_RATE" =~ ^[1-9][0-9]*([.][0-9]+)?$ ]]; then error "Frame rate must be a positive number:" "$FRAME_RATE" exit $EXIT_USAGE_ERROR fi } -extension_for_codec() { +function extension_for_codec() { case "$CODEC" in libvpx | libvpx-vp9) printf "webm" @@ -357,7 +357,7 @@ extension_for_codec() { esac } -sanitized_name_part() { +function sanitized_name_part() { local value="$1" value="${value//\//-}" value="${value//:/-}" @@ -365,7 +365,7 @@ sanitized_name_part() { printf "%s" "$value" } -default_output_path() { +function default_output_path() { local extension codec_part length_part extension="$(extension_for_codec)" codec_part="$(sanitized_name_part "$CODEC")" @@ -374,13 +374,13 @@ default_output_path() { printf "%s/%s-%s-%ss.%s" "$OUTPUT_DIR" "$codec_part" "$RESOLUTION" "$length_part" "$extension" } -print_command() { +function print_command() { local quoted_command printf -v quoted_command '%q ' "${FFMPEG_COMMAND[@]}" printf "%s\n" "${quoted_command% }" } -generate_test_file() { +function generate_test_file() { local output_file="$1" if [[ -e "$output_file" && $OVERWRITE -eq 0 ]]; then diff --git a/devscripts/release.sh b/devscripts/release.sh index 0fda106..8ef1bd0 100755 --- a/devscripts/release.sh +++ b/devscripts/release.sh @@ -119,7 +119,7 @@ readonly EXIT_OK EXIT_RUNTIME_FAILURE EXIT_USAGE_ERROR EXIT_CONFIG_ERROR EXIT_MI # OUTPUT HELPERS ############################################################################### -emit() { +function emit() { local prefix="$1" local color="$2" shift 2 @@ -145,29 +145,29 @@ emit() { printf "\n" } -error() { +function error() { emit "==> ERROR:" "$RED" "$@" >&2 } -msg() { +function msg() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$GREEN" "$@" fi } -warn() { +function warn() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$YELLOW" "$@" fi } -verbose() { +function verbose() { if [[ $VERBOSE -eq 1 && $QUIET -eq 0 ]]; then emit "==>" "$BLUE" "$@" fi } -debug() { +function debug() { if [[ $DEBUG -eq 1 ]]; then emit "==> DEBUG:" "$MAGENTA" "$@" fi @@ -177,7 +177,7 @@ debug() { # HELP AND VERSION OUTPUT ############################################################################### -print_help() { +function print_help() { printf "${BOLD}${MAGENTA}%s${ALL_OFF} - ${BOLD}${CYAN}%s${ALL_OFF} - ${BOLD}%s${ALL_OFF} ${BOLD}${BLUE}Usage:${ALL_OFF} ${BOLD}${MAGENTA}%s${ALL_OFF} ${BOLD}${YELLOW}[OPTION]...${ALL_OFF} ${BOLD}${GREEN}COMMAND VERSION${ALL_OFF} @@ -213,7 +213,7 @@ ${BOLD}${BLUE}Notes:${ALL_OFF} "$SCRIPTNAME" "$SCRIPTNAME" "$SCRIPTNAME" "$DIST_DIR" } -print_version() { +function print_version() { printf "${RED}${BOLD}Scriptname:${ALL_OFF} %s ${GREEN}${BOLD}Version:${ALL_OFF} %s ${YELLOW}${BOLD}Description:${ALL_OFF} %s @@ -264,7 +264,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" \ # disabled. If FORCE_COLOR is set, colors are always enabled. ############################################################################### -setup_colors() { +function setup_colors() { if [[ "$ENABLE_COLOR" -eq 1 ]]; then if tput setaf 0 >/dev/null 2>&1; then debug "Setting colors via tput" @@ -305,7 +305,7 @@ setup_colors() { # RELEASE HELPERS ############################################################################### -require_command() { +function require_command() { local command_name="$1" command -v "$command_name" >/dev/null 2>&1 || { @@ -314,7 +314,7 @@ require_command() { } } -require_release_dependencies() { +function require_release_dependencies() { require_command date require_command git require_command grep @@ -322,7 +322,7 @@ require_release_dependencies() { require_command tar } -validate_version() { +function validate_version() { local version="$1" if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then @@ -331,7 +331,7 @@ validate_version() { fi } -require_project_files() { +function require_project_files() { local file for file in "$MAIN_SCRIPT" "$MAN_PAGE" "$README_FILE"; do @@ -342,7 +342,7 @@ require_project_files() { done } -require_clean_worktree() { +function require_clean_worktree() { if ! git diff --quiet --; then error "working tree has unstaged changes" exit $EXIT_RUNTIME_FAILURE @@ -354,7 +354,7 @@ require_clean_worktree() { fi } -require_tag_absent() { +function require_tag_absent() { local version="$1" if git rev-parse -q --verify "refs/tags/v$version" >/dev/null; then @@ -365,7 +365,7 @@ require_tag_absent() { # Replace a literal release metadata pattern in a file. # Keep all sed -i portability handling in this one function. -replace_literal() { +function replace_literal() { local file="$1" local pattern="$2" local replacement="$3" @@ -401,7 +401,7 @@ replace_literal() { fi } -update_version_and_date() { +function update_version_and_date() { local version="$1" local revision_date="$2" @@ -441,7 +441,7 @@ update_version_and_date() { fi } -verify_release_metadata() { +function verify_release_metadata() { local version="$1" local revision_date="$2" @@ -478,16 +478,16 @@ verify_release_metadata() { } } -read_revision_date() { +function read_revision_date() { sed -n -E 's/^readonly DATE_OF_REVISION=([0-9]{4}-[0-9]{2}-[0-9]{2})$/\1/p' "$MAIN_SCRIPT" } -show_release_diff() { +function show_release_diff() { msg "Release metadata diff:" git diff -- "$MAIN_SCRIPT" "$MAN_PAGE" "$README_FILE" } -commit_release() { +function commit_release() { local version="$1" if [[ $DRY_RUN -eq 1 ]]; then @@ -500,7 +500,7 @@ commit_release() { git commit -m "chore(release): prepare $version" } -tag_release() { +function tag_release() { local version="$1" if [[ $DRY_RUN -eq 1 ]]; then @@ -512,7 +512,7 @@ tag_release() { git tag -a "v$version" -m "Release v$version" } -create_archive() { +function create_archive() { local version="$1" local archive_name="$PROJECT_NAME-$version.tar.gz" local archive_path="$DIST_DIR/$archive_name" @@ -539,7 +539,7 @@ create_archive() { fi } -prepare_release() { +function prepare_release() { local version="$1" local revision_date revision_date="$(date +%F)" @@ -557,7 +557,7 @@ prepare_release() { show_release_diff } -release() { +function release() { local version="$1" local revision_date diff --git a/transcode.sh b/transcode.sh index b7d19ae..3137d64 100755 --- a/transcode.sh +++ b/transcode.sh @@ -220,7 +220,7 @@ readonly EXIT_OK EXIT_RUNTIME_FAILURE EXIT_USAGE_ERROR EXIT_CONFIG_ERROR EXIT_MI # OUTPUT HELPERS ############################################################################### -emit() { +function emit() { local prefix="$1" local color="$2" shift 2 @@ -246,29 +246,29 @@ emit() { printf "\n" } -error() { +function error() { emit "==> ERROR:" "$RED" "$@" >&2 } -msg() { +function msg() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$GREEN" "$@" fi } -warn() { +function warn() { if [[ $QUIET -eq 0 ]]; then emit "==>" "$YELLOW" "$@" fi } -verbose() { +function verbose() { if [[ $VERBOSE -eq 1 && $QUIET -eq 0 ]]; then emit "==>" "$BLUE" "$@" fi } -debug() { +function debug() { if [[ $DEBUG -eq 1 ]]; then emit "==> DEBUG:" "$MAGENTA" "$@" fi @@ -278,7 +278,7 @@ debug() { # HELP AND VERSION OUTPUT ############################################################################### -print_help() { +function print_help() { printf "${BOLD}${MAGENTA}%s${ALL_OFF} - ${BOLD}${CYAN}%s${ALL_OFF} - ${BOLD}%s${ALL_OFF} ${BOLD}${BLUE}Usage:${ALL_OFF} ${BOLD}${MAGENTA}%s${ALL_OFF} ${BOLD}${YELLOW}[OPTION]... [--]${ALL_OFF} ${BOLD}${GREEN}FILE...${ALL_OFF} @@ -363,7 +363,7 @@ ${BOLD}${BLUE}Examples:${ALL_OFF} "$SCRIPTNAME" } -print_version() { +function print_version() { printf "${RED}${BOLD}Scriptname:${ALL_OFF} %s ${GREEN}${BOLD}Version:${ALL_OFF} %s ${YELLOW}${BOLD}Description:${ALL_OFF} %s @@ -408,25 +408,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" \ # Return the size of a file in bytes. # Uses GNU stat -c on Linux with a fallback to BSD/macOS stat -f. -filesize() { +function filesize() { stat -c "%s" -- "$1" 2>/dev/null || stat -f "%z" -- "$1" } # Resolve a symlink (or plain path) to its canonical absolute path. # Uses readlink -f (GNU) with a fallback to realpath for macOS/BSD. -resolve_path() { +function resolve_path() { readlink -f -- "$1" 2>/dev/null || realpath -- "$1" } # Format a byte count into a human-readable IEC size. # Uses numfmt so values are displayed with binary units such as K, M, G, etc. -format_filesize() { +function format_filesize() { numfmt --to=iec -- "$1" } # Return PATH without a leading slash so it can safely be placed below another # directory while still preserving its absolute path structure. -strip_leading_slash() { +function strip_leading_slash() { local path="$1" path="${path#/}" printf '%s\n' "$path" @@ -444,7 +444,7 @@ strip_leading_slash() { # disabled. If FORCE_COLOR is set, colors are always enabled. ############################################################################### -setup_colors() { +function setup_colors() { if [[ "$ENABLE_COLOR" -eq 1 ]]; then if tput setaf 0 >/dev/null 2>&1; then debug "Setting colors via tput" @@ -493,13 +493,13 @@ setup_colors() { # Usage: _tomlq_get <key> (e.g. ".encoding.preset") # Outputs the raw string on stdout; returns non-zero if the key is absent or # tomlq fails for any reason. -_tomlq_get() { +function _tomlq_get() { tomlq -r "$1" "$CONFIG_FILE" 2>/dev/null } # Load configuration from config.toml, respecting CLI precedence. # Called once, after option parsing, so all _CLI_* sentinels are already set. -load_config() { +function load_config() { # Warn about the legacy skip.conf here (not at startup) so --quiet is # respected; by this point the CLI has been fully parsed. if [[ -f "$SKIP_CODECS_FILE" ]]; then @@ -704,7 +704,7 @@ load_config() { # - Normalizes to lowercase # - Ignores empty tokens # - Used both for CLI --skip-codec and for codecs defined -add_skip_codec_token() { +function add_skip_codec_token() { local token="${1,,}" # lowercase if [[ ! -v SKIP_CODECS["$token"] ]]; then debug "Add to skip codec:" "$token" @@ -716,7 +716,7 @@ add_skip_codec_token() { # Parse a user-provided codec list (comma/space/colon separated) # and add each token to SKIP_CODECS -parse_skip_codec_parameter() { +function parse_skip_codec_parameter() { local arg="$1" local IFS=',: ' token for token in $arg; do @@ -730,7 +730,7 @@ parse_skip_codec_parameter() { # STREAM SELECTOR HANDLING ############################################################################### -validate_stream_selector() { +function validate_stream_selector() { local stream_selector="$1" # Accept only simple video stream indexes for metadata probing. This is not a @@ -760,7 +760,7 @@ validate_stream_selector() { # Presets may reference variables from the caller (encode_one) such as: # output_pixel_format, input_pixel_format, input_codec, input_frame_rate, # input_fps, output_gop_size -load_preset() { +function load_preset() { local preset_name="$1" # Strict allowlist: only alphanumerics, hyphens, and underscores are @@ -824,7 +824,7 @@ load_preset() { # entry already carries it). # - A symlink pointing outside PRESET_DIR is followed and treated as a # regular preset file (description is read from its content). -list_presets() { +function list_presets() { if [[ ! -d "$PRESET_DIR" ]]; then warn "Preset directory does not exist:" "$PRESET_DIR" return $EXIT_OK @@ -883,7 +883,7 @@ list_presets() { # Remove temporary output files created during encoding. # Registered via trap EXIT so it runs on normal exit and on failures # shellcheck disable=SC2329 -cleanup() { +function cleanup() { # "${TMP_FILES[@]+"${TMP_FILES[@]}"}" expands to nothing when the array is # empty (safe under nounset), unlike [@]:-} which yields one empty iteration. for t in "${TEMPORARY_FILES[@]+"${TEMPORARY_FILES[@]}"}"; do @@ -899,7 +899,7 @@ cleanup() { ############################################################################### # Calculate integer percentage saved from original/new byte counts. -calculate_saved_percentage() { +function calculate_saved_percentage() { local original_bytes="$1" local new_bytes="$2" @@ -913,7 +913,7 @@ calculate_saved_percentage() { # Append one row to the size report TSV, creating the header when needed. # Empty byte/percentage fields are allowed for failures where no output size # exists. -append_size_report_row() { +function append_size_report_row() { if [[ $SIZE_REPORT -ne 1 || $DRY_RUN -ne 0 ]]; then return $EXIT_OK fi @@ -937,7 +937,7 @@ append_size_report_row() { # Print per-file size feedback after an encode attempt that produced an output # file. -print_size_report_feedback() { +function print_size_report_feedback() { if [[ $SIZE_REPORT -eq 0 ]]; then return $EXIT_OK fi @@ -959,7 +959,7 @@ print_size_report_feedback() { } # Print the end-of-run size report summary for batch runs. -print_size_report_summary() { +function print_size_report_summary() { local amount_total_files="$1" if [[ $SIZE_REPORT -ne 1 || $QUIET -ne 0 || $amount_total_files -le 1 ]]; then @@ -989,7 +989,7 @@ print_size_report_summary() { # Return an unused backup path. Existing backups are never overwritten; numeric # suffixes are appended until a free name is found. -unique_backup_path() { +function unique_backup_path() { local target="$1" if [[ ! -e "$target" ]]; then @@ -1012,7 +1012,7 @@ unique_backup_path() { # Copy the original file to BACKUP_DIR, preserving the absolute source path # below that directory, then move the encoded temporary output into the original # location. The original remains in place until the final replacement step. -backup_then_replace_original() { +function backup_then_replace_original() { local input_file="$1" local temporary_output_file="$2" @@ -1062,7 +1062,7 @@ backup_then_replace_original() { # Replace the original with the encoded output. If BACKUP_DIR is set, preserve # the original instead of deleting it. -replace_original() { +function replace_original() { local input_file="$1" local temporary_output_file="$2" @@ -1086,7 +1086,7 @@ replace_original() { # Print metadata collected earlier in encode_one(). # Intentionally reads encode_one() locals via Bash dynamic scoping. -encode_one_print_metadata() { +function encode_one_print_metadata() { verbose "Video stream:" "$VIDEO_STREAM" verbose "Input codec:" "$input_codec" verbose "Input pixel format:" "$input_pixel_format" @@ -1114,7 +1114,7 @@ encode_one_print_metadata() { # # Return: # EXIT_OK on success or if skipped; EXIT_RUNTIME_FAILURE on failure. -encode_one() { +function encode_one() { local input_file="$1" local current_file_index="$2" local amount_total_files="$3" diff --git a/transcode.sh.bash-completion.sh b/transcode.sh.bash-completion.sh index 8796373..2ae59d0 100644 --- a/transcode.sh.bash-completion.sh +++ b/transcode.sh.bash-completion.sh @@ -13,7 +13,7 @@ # long space --encode-file list.txt # long equals --encode-file=list.txt -_transcode_sh() { +function _transcode_sh() { local cur prev _init_completion -n = || return @@ -22,7 +22,7 @@ _transcode_sh() { # --------------------------------------------------------------------------- # Helper: collect preset names from the preset directory # --------------------------------------------------------------------------- - _transcode_presets() { + function _transcode_presets() { local presets=() if [[ -d "$preset_dir" ]]; then local f |
