iAdd preliminary brtv main script - bitreich-tv - Meme TV encoding and streaming Err bitreich.org 70
hgit clone git://bitreich.org/bitreich-tv git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-tv URL:git://bitreich.org/bitreich-tv git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/bitreich-tv bitreich.org 70
1Log /scm/bitreich-tv/log.gph bitreich.org 70
1Files /scm/bitreich-tv/files.gph bitreich.org 70
1Refs /scm/bitreich-tv/refs.gph bitreich.org 70
1Tags /scm/bitreich-tv/tag bitreich.org 70
1LICENSE /scm/bitreich-tv/file/LICENSE.gph bitreich.org 70
i--- Err bitreich.org 70
1commit 3a8559a5c96734befbfdb580c7e8a2ab491ea6d4 /scm/bitreich-tv/commit/3a8559a5c96734befbfdb580c7e8a2ab491ea6d4.gph bitreich.org 70
hAuthor: Anders Damsgaard <anders@adamsgaard.dk> URL:mailto:anders@adamsgaard.dk bitreich.org 70
iDate: Tue, 11 Aug 2020 17:29:44 +0200 Err bitreich.org 70
i Err bitreich.org 70
iAdd preliminary brtv main script Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i A brtv-start.sh | 151 +++++++++++++++++++++++++++++++ Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 151 insertions(+), 0 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/brtv-start.sh b/brtv-start.sh /scm/bitreich-tv/file/brtv-start.sh.gph bitreich.org 70
i@@ -0,0 +1,151 @@ Err bitreich.org 70
i+#!/bin/sh Err bitreich.org 70
i+# generate title animations and start streaming server Err bitreich.org 70
i+ Err bitreich.org 70
i+pass="$(gpg2 -q -d icecastpass.gpg)" Err bitreich.org 70
i+ Err bitreich.org 70
i+if [ $# -ne 1 ]; then Err bitreich.org 70
i+ printf 'usage: %s <memecache_path>\n' "$0" >&2 Err bitreich.org 70
i+ exit Err bitreich.org 70
i+fi Err bitreich.org 70
i+ Err bitreich.org 70
i+### CONFIGURATION START Err bitreich.org 70
i+ Err bitreich.org 70
i+# intermediate playlist file Err bitreich.org 70
i+playlist="playlist_$(date +%Y-%m-%d)" Err bitreich.org 70
i+ Err bitreich.org 70
i+# memecache source dir Err bitreich.org 70
i+memecache="$1" Err bitreich.org 70
i+ Err bitreich.org 70
i+# converted memecache dir Err bitreich.org 70
i+memecache_conv="memecache_conv" Err bitreich.org 70
i+ Err bitreich.org 70
i+# title animations dir Err bitreich.org 70
i+title="title" Err bitreich.org 70
i+ Err bitreich.org 70
i+# ffmpeg flags for generated videos Err bitreich.org 70
i+video_ext="webm" Err bitreich.org 70
i+ffmpeg_codec="-loglevel error -acodec libopus -b:a 96K -vcodec libvpx -b:v 64k -f webm -vf scale=1280:-1 -r 30 -ac 2" Err bitreich.org 70
i+out_video="brtv_$(date +%Y-%m-%d).${video_ext}" Err bitreich.org 70
i+#out_video_duration="24:00:00" Err bitreich.org 70
i+out_video_duration="00:05:00" Err bitreich.org 70
i+ Err bitreich.org 70
i+# target video resolution Err bitreich.org 70
i+video_resolution=1280x720 Err bitreich.org 70
i+ Err bitreich.org 70
i+# slide style Err bitreich.org 70
i+bgcolor=magenta Err bitreich.org 70
i+fcolor=white Err bitreich.org 70
i+ Err bitreich.org 70
i+# show image memes for this duration [s] Err bitreich.org 70
i+image_display_time=10 Err bitreich.org 70
i+ Err bitreich.org 70
i+# show title slides for this duration [s] Err bitreich.org 70
i+title_display_time=5 Err bitreich.org 70
i+ Err bitreich.org 70
i+### CONFIGURATION END Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+fit_img_16_9() { Err bitreich.org 70
i+ convert -resize "$video_resolution"\> -size "$video_resolution" "$1" \ Err bitreich.org 70
i+ xc:"$bgcolor" +swap -gravity center -composite "$2" Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+video_from_img() { Err bitreich.org 70
i+ ffmpeg -y \ Err bitreich.org 70
i+ -f lavfi \ Err bitreich.org 70
i+ -i anullsrc=r=48000 \ Err bitreich.org 70
i+ -i "$1" \ Err bitreich.org 70
i+ -t "${image_display_time}" \ Err bitreich.org 70
i+ $ffmpeg_codec \ Err bitreich.org 70
i+ "$2"; Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+title_slide() { Err bitreich.org 70
i+ img="$(basename "${1%.*}".png)" Err bitreich.org 70
i+ convert -size "$video_resolution" "xc:${bgcolor}" \ Err bitreich.org 70
i+ -pointsize 48 -fill "$fgcolor" \ Err bitreich.org 70
i+ -gravity center -draw "text 0,0 '#${img%.*}'" "$img" Err bitreich.org 70
i+ ffmpeg -y \ Err bitreich.org 70
i+ -f lavfi \ Err bitreich.org 70
i+ -i anullsrc=r=48000 \ Err bitreich.org 70
i+ -i "$img" \ Err bitreich.org 70
i+ -t "${title_display_time}" \ Err bitreich.org 70
i+ $ffmpec_codec \ Err bitreich.org 70
i+ "$2" && rm "$img" Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+video_conv() { Err bitreich.org 70
i+ ffmpeg -y -i "$1" $ffmpeg_codec -max_muxing_queue_size 1024 "$2" Err bitreich.org 70
i+} Err bitreich.org 70
i+ Err bitreich.org 70
i+mkdir -p "$title" Err bitreich.org 70
i+mkdir -p "$memecache_conv" Err bitreich.org 70
i+ Err bitreich.org 70
i+# generate video from each image Err bitreich.org 70
i+for f in "$memecache"/*.{jpg,jpeg,JPG,png,PNG}; do Err bitreich.org 70
i+ out="${memecache_conv}/$(basename "${f%.*}.${video_ext}")" Err bitreich.org 70
i+ if [ -e "$f" ] && [ ! -e "$out" ]; then Err bitreich.org 70
i+ printf 'in: %s, out: %s\n' "$f" "$out" Err bitreich.org 70
i+ fit_img_16_9 "$f" "${out%.*}.jpg" Err bitreich.org 70
i+ video_from_img "${out%.${video_ext}}.jpg" "${out}" Err bitreich.org 70
i+ fi Err bitreich.org 70
i+done Err bitreich.org 70
i+ Err bitreich.org 70
i+# make animation for fallback stream Err bitreich.org 70
i+if [ ! -f "bitreich-tv.${video_ext}" ]; then Err bitreich.org 70
i+ title_slide bitreich-tv bitreich-tv.${video_ext} Err bitreich.org 70
i+fi Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+# make title slides for video and converted images and encode to common codec Err bitreich.org 70
i+for f in "$memecache"/*.mkv \ Err bitreich.org 70
i+ "$memecache"/*.mp4 \ Err bitreich.org 70
i+ "$memecache"/*.webm \ Err bitreich.org 70
i+ "$memecache_conv"/*."${video_ext}"; do Err bitreich.org 70
i+ Err bitreich.org 70
i+ title_path="${title}/$(basename "${f%.*}.webm")" Err bitreich.org 70
i+ [ ! -e "$title_path" ] && title_slide "$f" "$title_path" Err bitreich.org 70
i+ Err bitreich.org 70
i+ out="${memecache_conv}/$(basename "${f%.*}.webm")" Err bitreich.org 70
i+ [ ! -e "$out" ] && video_conv "$f" "$out" Err bitreich.org 70
i+done Err bitreich.org 70
i+ Err bitreich.org 70
i+# generate random playlist from converted memes and add title slides Err bitreich.org 70
i+find "$memecache_conv" -maxdepth 1 -name "*.webm" -type f | \ Err bitreich.org 70
i+ sort -R | \ Err bitreich.org 70
i+ awk -v memecachedir="$memecache" -v titledir="$title" ' Err bitreich.org 70
i+ function add_title(s) { Err bitreich.org 70
i+ sub(/memecache/, "title", s); Err bitreich.org 70
i+ return s Err bitreich.org 70
i+ } Err bitreich.org 70
i+ {line=$0; Err bitreich.org 70
i+ print "file \""add_title($line)"\""; Err bitreich.org 70
i+ print "file \""$0"\""}' | sed "s/\"/'/g" > "$playlist" Err bitreich.org 70
i+ #print "file \""$0"\""}' | sed "s/\"/'/g" |grep -v title> "$playlist" Err bitreich.org 70
i+ Err bitreich.org 70
i+#printf '\nstarting fallback stream\n' Err bitreich.org 70
i+#ffmpeg -loglevel quiet \ Err bitreich.org 70
i+# -stream_loop -1 -i bitreich-tv.webm Err bitreich.org 70
i+# -f webm -codec copy Err bitreich.org 70
i+# icecast://source:${pass}@localhost:8000/brtvfallback Err bitreich.org 70
i+ Err bitreich.org 70
i+ Err bitreich.org 70
i+# encode daily video file Err bitreich.org 70
i+ffmpeg -n -f concat -safe 0 -i "$playlist" \ Err bitreich.org 70
i+ -f "${video_ext}" -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm \ Err bitreich.org 70
i+ -analyzeduration 2M -probesize 2M \ Err bitreich.org 70
i+ -codec copy \ Err bitreich.org 70
i+ -deadline realtime -threads 8 \ Err bitreich.org 70
i+ -to "$out_video_duration" Err bitreich.org 70
i+ "$video_out" Err bitreich.org 70
i+ Err bitreich.org 70
i+exit 0 Err bitreich.org 70
i+ Err bitreich.org 70
i+printf '\nstarting stream\n' Err bitreich.org 70
i+ Err bitreich.org 70
i+ffmpeg -f concat -safe 0 -stream_loop -1 -i "$video_out" \ Err bitreich.org 70
i+ -f webm -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm \ Err bitreich.org 70
i+ -analyzeduration 2M -probesize 2M \ Err bitreich.org 70
i+ -codec copy \ Err bitreich.org 70
i+ -deadline realtime -threads 8 \ Err bitreich.org 70
i+ icecast://source:${pass}@adamsgaard.dk:3232/brtv Err bitreich.org 70
.
Response:
text/plain