main dots / config / .local / bin / vidtools
xxwhirlpool  ·  2026-09-29
 1#!/usr/bin/env bash
 2
 3shopt -s nullglob
 4
 5avi2mkv() {
 6	for f in *.avi; do ffmpeg -fflags +genpts -i "$f" -c:v copy -c:a copy -c:s copy "${f%.*} AVI2MKV.mkv" || break; done
 7}
 8
 9any2hevc() {
10	for f in *.{mkv,mp4,ts}; do ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i "$f" -c:v hevc_nvenc -qmin 24 -qmax 24 -vtag hvc1 -profile main -preset slow -rc vbr_hq -c:a copy -c:s copy -map 0 "${f%.*} HEVC.mkv" || break; done
11}
12
13vid2frames() {
14	for f in *.{mkv,mp4,webm}; do ffmpeg -i "$f" -vf mpdecimate,setpts=N/FRAME_RATE/TB "%04d.png" || break; done
15}
16
17vidsubs() {
18	for sub in *.{srt,ass}; do
19		subext="${sub##*.}"
20	done
21
22	for f in *.{mkv,mp4}; do mkvmerge -o "${f%.*} SUB.mkv" "$f" --language 0:eng "${f%.*}.$subext" || break; done
23}
24
25vidhash() {
26	# borrowed from my buddy neckspike:
27	# https://pastebin.com/mg3CVDiU
28	for f in *.{mkv,mp4}; do
29		hash=$(crc32 "$f" | tr '[:lower:]' '[:upper:]')
30		ext="${f##*.}"
31		newname="${f%.*} [$hash]".$ext
32
33		gum confirm "are you sure you want to rename?" --default=yes --timeout=2s && mv "$f" "$newname" && echo -e "new name: $newname" || echo -e "no files renamed: $newname"
34	done
35}
36
37choice() {
38	choose=$(gum choose "avi2mkv" "any2hevc" "vid2frames" "vidsubs" "vidhash")
39	case "$choose" in
40		*avi2mkv) avi2mkv ;;
41		*any2hevc) any2hevc ;;
42		*vid2frames) vid2frames ;;
43		*vidsubs) vidsubs ;;
44		*vidhash) vidhash ;;
45		*) exit;;
46	esac
47}
48
49choice