|
|
brtv-imgs-to-video.sh - bitreich-tv - Meme TV encoding and streaming |
|
|
 |
git clone git://bitreich.org/bitreich-tv git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-tv (git://bitreich.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
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 |
|