You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.2 KiB
84 lines
2.2 KiB
#!/usr/bin/env bash |
|
|
|
# Largely taken from here: https://gitlab.com/uoou/dotfiles/-/blob/master/stow/bin/home/drew/bin/movwp_halftone |
|
# However, changed to have options and to remove credits (hopefully) |
|
|
|
output="/tmp/frame.png" |
|
file="" |
|
EFFECT="FALSE" |
|
|
|
while [ -n "$1" ]; do |
|
case "$1" in |
|
"-o"|"--output") |
|
output="$2" |
|
shift |
|
shift |
|
;; |
|
"--effect") |
|
EFFECT="TRUE" |
|
shift |
|
;; |
|
*) |
|
if [ -z "$file" ]; then |
|
file="$1" |
|
shift |
|
else |
|
echo "Too many arguments" |
|
exit 1 |
|
fi |
|
;; |
|
esac |
|
done |
|
|
|
if [ -z "$file" ]; then |
|
echo "You need to specify a file" |
|
exit 1 |
|
fi |
|
|
|
if [ ! -f "$file" ]; then |
|
echo "$file is not a file" |
|
exit 1 |
|
fi |
|
|
|
output="${output%.png}.png" |
|
|
|
# Uses ffmpeg to get the duration |
|
duration=$(ffmpeg -i "$file" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,) |
|
seconds=$(echo "$duration" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }') |
|
seconds=${seconds%.*} |
|
if [ "$seconds" -le 0 ];then |
|
echo "Doesn't appear to be a video" |
|
exit 1 |
|
fi |
|
|
|
if [[ "$seconds" -gt $(( 50 * 60 )) ]]; then |
|
# If the video is more than 50 minutes log, assume it is a film and ignore 5 minutes at the end (credits) |
|
seconds="$(($seconds - 300 ))" |
|
elif [[ "$seconds" -gt $(( 10 * 60 )) ]]; then |
|
# If the video is more than 10 minutes log, assume it is a tv episode and ignore 1 minute at the end (credits) |
|
seconds="$(($seconds - 60 ))" |
|
fi |
|
|
|
randpoint=$((1 + RANDOM % "$seconds")) |
|
if [ "$EFFECT" == "TRUE" ]; then |
|
echo "I lastly get here" |
|
ffmpeg -ss "$randpoint" -i "$file" -vf hue=h=310:s=2.8:b=3,eq=contrast=4 -vframes 1 "$output" -y >> /dev/null 2>&1 && |
|
convert "$output" \ |
|
-set option:distort:viewport '%wx%h+0+0' \ |
|
-colorspace CMYK -separate null: \ |
|
\( -size 3x3 xc: \( +clone -negate \) \ |
|
+append \( +clone -negate \) -append \) \ |
|
-virtual-pixel tile -filter gaussian \ |
|
\( +clone -distort SRT 60 \) +swap \ |
|
\( +clone -distort SRT 30 \) +swap \ |
|
\( +clone -distort SRT 45 \) +swap \ |
|
\( +clone -fill black -colorize 100 -distort SRT 0 \) +swap +delete \ |
|
-compose Overlay -layers composite \ |
|
-set colorspace CMYK -combine -colorspace RGB \ |
|
"$output" && |
|
convert "$output" \ |
|
-virtual-pixel edge -channel M -fx "p[-5,-1]" \ |
|
"$output" |
|
else |
|
ffmpeg -ss "$randpoint" -i "$file" -vframes 1 "$output" -y >> /dev/null 2>&1 |
|
fi
|
|
|