This repository has been archived on 2024-03-04. You can view files and clone it, but cannot push or open issues or pull requests.
linux/.config/bash/module/transcode.sh

127 lines
3.1 KiB
Bash
Raw Normal View History

# Convert between different formats.
2023-12-07 04:02:47 +03:00
# By default tries to convert all files.
# Usage: transcode <FORMAT> [FILES]
2023-12-07 01:44:42 +03:00
function transcode() {
2023-12-05 21:50:45 +03:00
local IFS=$'\n'
local targets=("${@:2}")
local format="${1}"
local total=${#targets[@]}
local count=0
local failed=0
local skipped=0
# Report no format.
if [[ "${format}" = "" ]]; then
echo -e "${color_bred}No format specified.${color_default}"
2023-12-07 04:02:47 +03:00
help transcode
2023-12-05 21:50:45 +03:00
return 2
fi
# All files by default.
if [[ "${targets}" = "" ]]; then
targets=($(ls --classify | grep -v /$))
total=${#targets[@]}
fi
# Process.
for target in "${targets[@]}"; do
# Increment counter.
((count++))
# Define context names and status.
local from="${target##*.}"
local to="${format}"
local output="${target##*/}"
output="${output%.*}.${to}"
local status="[${count}/${total}] ${target} -> ${output}"
# Show status.
echo -e "${color_bwhite}${status}${color_default}"
2023-12-05 21:50:45 +03:00
# Skip if file exists.
[[ -f "${output}" ]] && { ((skipped++)); continue; }
# Support multiple inputs.
[[ "${to}" = "mp3" ]] && from=""
[[ "${to}" = "flac" ]] && from=""
[[ "${to}" = "mka" ]] && from=""
[[ "${to}" = "mkv" ]] && 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}"
;;
*)
echo -e "${color_yellow}Conversion ${target##*.}-${to} not supported.${color_default}"
false
;;
esac
# Show error.
if [[ ${?} != 0 ]]; then
echo -e "${color_bred}${status}: Failed.${color_default}"
((failed++))
fi
done
2023-12-05 21:50:45 +03:00
if [[ ${skipped} != 0 ]]; then
echo -e "${color_byellow}Skipped: ${skipped}.${color_default}"
return 1
fi
if [[ ${failed} != 0 ]]; then
echo -e "${color_bred}Failed: ${failed}.${color_default}"
false
fi
}
2023-12-07 01:44:42 +03:00
function _transcode_gz-xz() {
2023-12-05 21:50:45 +03:00
[[ -f "${2}" ]] && return 1
pv "${1}" | gzip -d | xz -9e > "${2}"
}
2023-12-07 01:44:42 +03:00
function _transcode_xz-gz() {
2023-12-05 21:50:45 +03:00
[[ -f "${2}" ]] && return 1
pv "${1}" | xz -d | gzip -1 > "${2}"
}
2023-12-07 01:44:42 +03:00
function _transcode_mp3() {
2023-12-05 21:50:45 +03:00
ffmpeg -n -i "${1}" -c:a libmp3lame -b:a 320k -f mp3 "${2}"
}
2023-12-07 01:44:42 +03:00
function _transcode_flac() {
2023-12-05 21:50:45 +03:00
ffmpeg -n -i "${1}" -c:a flac -f flac "${2}"
}
2023-12-07 01:44:42 +03:00
function _transcode_mka() {
2023-12-05 21:50:45 +03:00
local braudio=$(_ffprobe_ba "${1}")
[[ ${braudio} -gt 128 ]] && braudio=128
2023-12-05 21:50:45 +03:00
ffmpeg -n -i "${1}" -ac 2 -c:a libopus -b:a ${braudio}k -vn "${2}"
}
2023-12-07 01:44:42 +03:00
function _transcode_mkv() {
2023-12-05 21:50:45 +03:00
local keyint=$(_ffprobe_keyint "${1}")
local braudio=$(_ffprobe_ba "${1}")
[[ ${braudio} -gt 128 ]] && braudio=128
2023-12-05 21:50:45 +03:00
# 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 -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)'" "${2}"
}