# Convert between different formats. # By default tries to convert all files. # Usage: transcode [FILES] function transcode() { local IFS=$'\n' local format=${1} local targets=(${@:2}) [[ ${targets} == "" ]] && targets=($(_ls_file)) # Report no format. if [[ ${format} == "" ]] || [[ ${format} =~ "." ]]; then _error "No format specified." help transcode return 2 fi process() { # Define context names and status. local from="${target##*.}" local to="${format}" local output="${target##*/}" output="${output%.*}.${to}" # Skip if file exists. [[ -f ${output} ]] && { _iterate_skip "Already exists." return 0 } # Support multiple inputs. [[ ${to} == "flac" ]] && from="" [[ ${to} == "jxl" ]] && from="" [[ ${to} == "mka" ]] && from="" [[ ${to} == "mkv" ]] && from="" [[ ${to} == "mp3" ]] && from="" # Send convert. case "${from}-${to}" in "gz-xz" | "tgz-txz") _transcode_gz-xz "${target}" "${output}" ;; "xz-gz" | "txz-tgz") _transcode_xz-gz "${target}" "${output}" ;; "-mp3") _transcode_mp3 "${target}" "${output}" ;; "-flac") _transcode_flac "${target}" "${output}" ;; "-mka") _transcode_mka "${target}" "${output}" ;; "-mkv") _transcode_mkv "${target}" "${output}" ;; "-jxl") _transcode_jxl "${target}" "${output}" ;; *) _error "Conversion ${target##*.}-${to} not supported." return 1 ;; esac } _iterate_targets process ${targets[@]} } function _transcode_gz-xz() { [[ -f ${2} ]] && return 1 pv "${1}" | gzip -d | xz -9e >"${2}" } function _transcode_xz-gz() { [[ -f ${2} ]] && return 1 pv "${1}" | xz -d | gzip -1 >"${2}" } function _transcode_mp3() { ffmpeg -n -i "${1}" -c:a libmp3lame -b:a 320k -f mp3 "${2}" } function _transcode_flac() { ffmpeg -n -i "${1}" -c:a flac -f flac "${2}" } function _transcode_mka() { local braudio=$(_ffprobe_ba "${1}") [[ ${braudio} -gt 128 ]] && braudio=128 ffmpeg -n -i "${1}" -ac 2 -c:a libopus -b:a ${braudio}k -vn "${2}" } function _transcode_mkv() { local keyint=$(_ffprobe_keyint "${1}") local braudio=$(_ffprobe_ba "${1}") local fps=$(_ffprobe_fps "${1}") [[ ${braudio} -gt 128 ]] && braudio=128 [[ ${fps} -gt 30 ]] && fps=30 # ffmpeg -n -i "${1}" -c:a libopus -b:a ${braudio}k -c:v libsvtav1 -crf 30 -svtav1-params "fast-decode=1:tune=0" -preset 8 -pix_fmt yuv420p10le -g ${keyint} -vf "scale=-2:min'(1080,ih)'" "${2}" ffmpeg -n -i "${1}" -map 0 -map -v -map V -map -t -dn -c:s srt -ac 2 -c:a libopus -b:a ${braudio}k -c:v libsvtav1 -crf 30 -svtav1-params "tune=0" -pix_fmt yuv420p10le -g ${keyint} -vf "scale=-2:min'(1080,ih)' , fps=${fps}" "${2}" } function _transcode_jxl() { cjxl -e 10 --lossless_jpeg=1 -- "${1}" "${2}" }