summaryrefslogtreecommitdiff
path: root/.local/bin/slider
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/slider')
-rwxr-xr-x.local/bin/slider126
1 files changed, 0 insertions, 126 deletions
diff --git a/.local/bin/slider b/.local/bin/slider
deleted file mode 100755
index 3460c77..0000000
--- a/.local/bin/slider
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/bin/sh
-
-# Give a file with images and timecodes and creates a video slideshow of them.
-#
-# Timecodes must be in format 00:00:00.
-#
-# Imagemagick and ffmpeg required.
-
-# Application cache if not stated elsewhere.
-cache="${XDG_CACHE_HOME:-$HOME/.cache}/slider"
-
-while getopts "hvrpi:c:a:o:d:f:t:e:x:s:" o; do case "${o}" in
- c) bgc="$OPTARG" ;;
- t) fgc="$OPTARG" ;;
- f) font="$OPTARG" ;;
- i) file="$OPTARG" ;;
- a) audio="$OPTARG" ;;
- o) outfile="$OPTARG" ;;
- d) prepdir="$OPTARG" ;;
- r) redo="$OPTARG" ;;
- s) ppt="$OPTARG" ;;
- e) endtime="$OPTARG" ;;
- x) res="$OPTARG"
- echo "$res" | grep -qv "^[0-9]\+x[0-9]\+$" &&
- echo "Resolution must be dimensions separated by a 'x': 1280x720, etc." &&
- exit 1 ;;
- p) echo "Purge old build files in $cache? [y/N]"
- read -r confirm
- echo "$confirm" | grep -iq "^y$" && rm -rf "$cache" && echo "Done."
- exit ;;
- v) verbose=True ;;
- *) echo "$(basename "$0") usage:
- -i input timecode list (required)
- -a audio file
- -c color of background (use html names, black is default)
- -t text color for text slides (white is default)
- -s text font size for text slides (150 is default)
- -f text font for text slides (sans serif is default)
- -o output video file
- -e if no audio given, the time in seconds that the last slide will be shown (5 is default)
- -x resolution (1920x1080 is default)
- -d tmp directory
- -r rerun imagemagick commands even if done previously (in case files or background has changed)
- -p purge old build files instead of running
- -v be verbose" && exit 1
-
-esac done
-
-# Check that the input file looks like it should.
-{ head -n 1 "$file" 2>/dev/null | grep -q "^00:00:00 " ;} || {
- echo "Give an input file with -i." &&
- echo "The file should look as this example:
-
-00:00:00 first_image.jpg
-00:00:03 otherdirectory/next_image.jpg
-00:00:09 this_image_starts_at_9_seconds.jpg
-etc...
-
-Timecodes and filenames must be separated by Tabs." &&
- exit 1
- }
-
-if [ -n "${audio+x}" ]; then
- # Check that the audio file looks like an actual audio file.
- case "$(file --dereference --brief --mime-type -- "$audio")" in
- audio/*) ;;
- *) echo "That doesn't look like an audio file."; exit 1 ;;
- esac
- totseconds="$(date '+%s' -d $(ffmpeg -i "$audio" 2>&1 | awk '/Duration/ {print $2}' | sed s/,//))"
- endtime="$((totseconds-seconds))"
-fi
-
-prepdir="${prepdir:-$cache/$file}"
-outfile="${outfile:-$file.mp4}"
-prepfile="$prepdir/$file.prep"
-
-[ -n "${verbose+x}" ] && echo "Preparing images... May take a while depending on the number of files."
-mkdir -p "$prepdir"
-
-{
-while read -r x;
-do
- # Get the time from the first column.
- time="${x%% *}"
- seconds="$(date '+%s' -d "$time")"
- # Duration is not used on the first looped item.
- duration="$((seconds - prevseconds))"
-
- # Get the filename/text content from the rest.
- content="${x#* }"
- base="$(basename "$content")"
- base="${base%.*}.jpg"
-
- if [ -f "$content" ]; then
- # If images have already been made in a previous run, do not recreate
- # them unless -r was given.
- { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} &&
- convert -size "${res:-1920x1080}" canvas:"${bgc:-black}" -gravity center "$content" -resize 1920x1080 -composite "$prepdir/$base"
- else
- { [ ! -f "$prepdir/$base" ] || [ -n "${redo+x}" ] ;} &&
- convert -size "${res:-1920x1080}" -background "${bgc:-black}" -fill "${fgc:-white}" -font "${font:-Sans}" -pointsize "${ppt:-150}" -gravity center label:"$content" "$prepdir/$base"
- fi
-
- # If the first line, do not write yet.
- [ "$time" = "00:00:00" ] || echo "file '$prevbase'
-duration $duration"
-
- # Keep the information required for the next file.
- prevbase="$base"
- prevtime="$time"
- prevseconds="$(date '+%s' -d "$prevtime")"
-done < "$file"
-# Do last file which must be given twice as follows
-echo "file '$base'
-duration ${endtime:-5}
-file '$base'"
-} > "$prepfile"
-if [ -n "${audio+x}" ]; then
- ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -i "$audio" -c:a aac -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile"
-else
- ffmpeg -hide_banner -y -f concat -safe 0 -i "$prepfile" -vsync vfr -c:v libx264 -pix_fmt yuv420p "$outfile"
-fi
-
-# Might also try:
-# -vf "fps=${fps:-24},format=yuv420p" "$outfile"
-# but has given some problems.