From c9e1ed68428b36b59a560bd411598c4c93de519a Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Thu, 30 Jul 2026 01:33:39 -0700 Subject: add burnsubs.sh script - pass in a directory to burn all subtitles to the appropriate video -> produces new video --- burnsubs.sh | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 burnsubs.sh (limited to 'burnsubs.sh') diff --git a/burnsubs.sh b/burnsubs.sh new file mode 100755 index 0000000..0a17050 --- /dev/null +++ b/burnsubs.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +DELETE_ORIGINALS=false +MEDIA_EXTS=("mp4" "mkv" "mov" "avi" "webm" "m4v") +SEARCH_DIR="." +STYLE="FontName=Arial,FontSize=18,PrimaryColour=&HFFFFFF&,BackColour=&H000000&,BorderStyle=3,Outline=1,Shadow=0,MarginV=10,Alignment=2" + +usage() { +cat </dev/null || { + echo "ffmpeg not found." + exit 1 +} + +escape_path() { + printf "%s" "$1" | sed "s/'/'\\\\''/g" +} + +for ext in "${MEDIA_EXTS[@]}"; do + while IFS= read -r -d '' media; do + + dir=$(dirname "$media") + filename=$(basename "$media") + base="${filename%.*}" + extension="${filename##*.}" + + subtitle="" + + shopt -s nullglob nocaseglob + + + for candidate in \ + "$dir/$base.srt" \ + "$dir/$base.vtt" \ + "$dir/$base".*.srt \ + "$dir/$base".*.vtt; do + [[ -e "$candidate" ]] || continue + subtitle="$candidate" + break + done + + shopt -u nullglob nocaseglob + + [[ -n "$subtitle" ]] || continue + + output="$dir/${base}_subbed.${extension}" + + echo + echo "==================================" + echo "Media: $media" + echo "Subtitle: $subtitle" + echo "Output: $output" + echo "==================================" + + escaped_sub=$(escape_path "$subtitle") + + ffmpeg \ + -hide_banner \ + -y \ + -i "$media" \ + -vf "subtitles='${escaped_sub}':force_style='${STYLE}'" \ + -c:v libx264 \ + -preset medium \ + -crf 18 \ + -c:a copy \ + "$output" + + if [[ $? -eq 0 ]]; then + echo "✓ Finished" + + if $DELETE_ORIGINALS; then + rm -f "$media" "$subtitle" + echo "Deleted originals." + fi + else + echo "✗ Failed: $media" + fi + + done < <(find "$SEARCH_DIR" -type f -iname "*.${ext}" -print0) +done + +echo +echo "Done." -- cgit v1.2.3