#!/usr/bin/env zsh # # Copyright (C) 2024-2026 Maria Lisina # SPDX-License-Identifier: Apache-2.0 # # Telegram Media Re-encoder if (( __env != 1 )) then exec /usr/bin/env -i PATH="${PATH}" __env=1 "${0}" ${@} 2> /dev/null fi set -e version="3.4" if [[ -n "${1}" ]] then while getopts hl:r:f:ap:c:d opts do case "${opts}" in (h) help=1 ;; (l) loglevel=${OPTARG} ;; (r) fps=${OPTARG} ;; (f) filters="${OPTARG}" ;; (a) noaudio=1 ;; (p) preset=${OPTARG} ;; (c) crf=${OPTARG} ;; (d) delete=1 ;; (*) echo "Unrecognized options" \ "\nSee '${0} -h'" exit 1 ;; esac done shift $((OPTIND - 1)) else help=1 fi if (( help == 1 )) then echo "Telegram Media Re-encoder v${version}" \ "\n\nUsage: ${0} [options] [file]" \ "\n\nOptions:" \ "\n -h\t\tShow help information" \ "\n -l \tLog level, default: info" \ "\n -r \tSet custom frame rate" \ "\n -f \tSet custom filters" \ "\n -a\t\tRemove audio stream" \ "\n -p \tPreset, default: medium" \ "\n -c \tConstant Rate Factor, default: 23" \ "\n -d\t\tDelete original file" exit 0 fi for zmod in zsh/files do if ! zmodload ${zmod} then failed+=(${zmod}) fi done if [[ -n "${failed}" ]] then echo "Failed to load Z Shell modules: ${failed}" \ "\nUpdate your Z Shell or get a version with all required modules" exit 1 fi for req in ffmpeg do if ! command -v ${req} > /dev/null then missing+=(${req}) fi done if [[ -n "${missing}" ]] then echo "Missing dependencies: ${missing}" \ "\nFor more information follow: https://command-not-found.com/" exit 1 fi if [[ -z "${loglevel}" ]] then loglevel=info fi if [[ -z "${fps}" ]] then fps=source_fps fi if [[ -z "${filters}" ]] then filters="pad=ceil(iw/2)*2:ceil(ih/2)*2" fi if (( noaudio == 1 )) then acodec=(an) else acodec=(acodec aac) fi if [[ -z "${preset}" ]] then preset=medium fi if [[ -z "${crf}" ]] then crf=23 fi if [[ -z "${1}" ]] then echo "No input file specified" \ "\nSee '${0} -h'" exit 1 fi exit=0 input=(${@}) for file in ${input} do if ! [[ -f "${file}" ]] then exit=1 echo "No file found: ${file}" continue fi output="${file%.*}_t.mp4" echo "Re-encoding: ${file}" if ffmpeg -i "${file}" \ -loglevel ${loglevel} \ -map_metadata -1 \ -profile:v high \ -vcodec libx264 \ -vf "fps=${fps},${filters}" \ -pix_fmt yuv420p \ -${acodec[@]} \ -preset ${preset} \ -level 4.0 \ -crf ${crf} \ -movflags +faststart \ "${output}" -y 2>&1 then if (( delete == 1 )) then rm -f "${file}" mv "${output}" "${file%.*}.mp4" echo "Succesfully re-encoded: ${file%.*}.mp4" else echo "Succesfully re-encoded: ${output}" fi else exit=1 echo "Failed to re-encode: ${file}" fi done exit ${exit}