URI: 
       brtv-imgs-to-video.sh - bitreich-tv - Meme TV encoding and streaming
  HTML git clone git://bitreich.org/bitreich-tv git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-tv
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR LICENSE
       ---
       brtv-imgs-to-video.sh (1698B)
       ---
            1 #!/bin/sh
            2 # read hashtags.txt as stdin, download all images, and convert them to videos
            3 # requirements: hurl(1), ffmpeg(1), convert(1)
            4 
            5 ### CONFIGURATION START
            6 
            7 # dir to contain images as videos
            8 out_dir="/br/gopher/tv/img2vid"
            9 
           10 # ffmpeg flags for generated videos
           11 video_ext="webm"
           12 ffmpeg_codec="-loglevel error -acodec libopus -b:a 96K -f webm -vf scale=1280:-1 -r 30 -ac 2"
           13 
           14 # target video resolution
           15 video_resolution=1280x720
           16 
           17 # slide style
           18 # xc:$color ( https://imagemagick.org/script/color.php )
           19 # /some/file.png
           20 bgcontent=/br/gopher/tv/bitreich-tv-bg.png
           21 
           22 # show image memes for this duration [s]
           23 image_display_time=10
           24 
           25 ### CONFIGURATION END
           26 
           27 
           28 die() {
           29         printf '%s: error: %s\n' "${0##*/}" "$1" >&2
           30         exit 1
           31 }
           32 
           33 regeximatch() {
           34         printf '%s' "$1" | grep -iEq "$2"
           35 }
           36 
           37 fit_img_16_9() {
           38         convert -resize "$video_resolution" -size "$video_resolution" "$1" \
           39                 "$bgcontent" +swap -gravity center -composite "$2"
           40 }
           41 
           42 video_from_img() {
           43         ffmpeg -y \
           44                 -f lavfi \
           45                 -i anullsrc=r=48000 \
           46                 -i "$1" \
           47                 -t "${image_display_time}" \
           48                 $ffmpeg_codec \
           49                 "$2" < /dev/null
           50 }
           51 
           52 mkdir -p "$out_dir"
           53 
           54 # generate video from each image
           55 while read -r tag url; do
           56         if ! regeximatch "$url" '\.(jpg|jpeg|png|gif)$'; then
           57                 continue
           58         fi
           59 
           60         imgfile="${out_dir}/${url##*/}"
           61         out="${imgfile%.*}.${video_ext}"
           62 
           63         if [ ! -f "$out" ]; then
           64 
           65                 if [ ! -f "$imgfile" ]; then
           66                         if ! hurl "$url" > "$imgfile"; then
           67                                 die "hurl could not download $url"
           68                         fi
           69                 fi
           70 
           71                 if ! regeximatch "$(file -ib "$imgfile")" "^image\/"; then
           72                         die "input image $imgfile is invalid ($(file -b "$imgfile"))"
           73                 fi
           74                 fit_img_16_9 "$imgfile" "${out%.*}_16-9.jpg"
           75                 video_from_img "${out%.${video_ext}}_16-9.jpg" "${out}"
           76                 printf '%s\n' "$out"
           77         fi
           78 done