iRemove old wip 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 02c0fc491be147c4438d80ca59557b02fdffce21 /scm/bitreich-tv/commit/02c0fc491be147c4438d80ca59557b02fdffce21.gph bitreich.org 70 1parent ac639f0d7f8feadca0ef246d65bcc039fd73e90a /scm/bitreich-tv/commit/ac639f0d7f8feadca0ef246d65bcc039fd73e90a.gph bitreich.org 70 hAuthor: Anders Damsgaard URL:mailto:anders@adamsgaard.dk bitreich.org 70 iDate: Sun, 16 Aug 2020 22:20:50 +0200 Err bitreich.org 70 i Err bitreich.org 70 iRemove old wip script Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i D brtv-start.sh | 166 ------------------------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 0 insertions(+), 166 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@@ -1,166 +0,0 @@ Err bitreich.org 70 i-#!/bin/sh Err bitreich.org 70 i-# generate title animations and start streaming to server Err bitreich.org 70 i-# requirements: ffmpeg(1), convert(1) 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-pass="$(gpg2 -q -d icecastpass.gpg)" Err bitreich.org 70 i- Err bitreich.org 70 i-die() { Err bitreich.org 70 i- printf '%s: error: %s\n' "${0##*/}" "$1" >&2 Err bitreich.org 70 i- exit 1 Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-regeximatch() { Err bitreich.org 70 i- printf '%s' "$1" | grep -iEq "$2" Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-if [ $# -ne 1 ]; then Err bitreich.org 70 i- die "usage: ${0##*/} " Err bitreich.org 70 i-fi 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- printf 'image to video %s -> %s\n' "$1" "$2" 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- printf 'title_slide %s -> %s\n' "$1" "$img" 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- $ffmpeg_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- printf 'encode %s -> %s\n' "$1" "$2" Err bitreich.org 70 i- if ! regeximatch "$(file -ib "$f")" "^video\/"; then Err bitreich.org 70 i- die "input video $1 is invalid ($(file -b "$1"))" Err bitreich.org 70 i- fi Err bitreich.org 70 i- ffmpeg -y -i "$1" $ffmpeg_codec "$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 \ Err bitreich.org 70 i- "$memecache"/*.jpeg \ Err bitreich.org 70 i- "$memecache"/*.JPG \ Err bitreich.org 70 i- "$memecache"/*.png \ Err bitreich.org 70 i- "$memecache"/*.PNG; do Err bitreich.org 70 i- out="${memecache_conv}/$(basename "${f%.*}.${video_ext}")" Err bitreich.org 70 i- if [ ! -f "$out" ]; then Err bitreich.org 70 i- if ! regeximatch "$(file -ib "$f")" "^image\/"; then Err bitreich.org 70 i- die "input image $f is invalid ($(file -b "$f"))" Err bitreich.org 70 i- fi 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-# make title slides for video and converted images and encode all video clips 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%.*}.${video_ext}")" Err bitreich.org 70 i- [ ! -f "$title_path" ] && title_slide "$f" "$title_path" Err bitreich.org 70 i- Err bitreich.org 70 i- out="${memecache_conv}/$(basename "${f%.*}.${video_ext}")" Err bitreich.org 70 i- [ ! -f "$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- 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- -codec copy \ 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-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 4 \ Err bitreich.org 70 i- icecast://source:${pass}@adamsgaard.dk:3232/brtv Err bitreich.org 70 .