bitreich-memestats

statistical analysis of tags in Freenode/#bitreich-en
git clone git://src.adamsgaard.dk/bitreich-memestats
Log | Files | Refs | LICENSE Back to index

brtv-start.sh (3423B)


      1 #!/bin/sh
      2 # generate title animations and start streaming server
      3 
      4 pass="$(cat icecastpass)"
      5 
      6 if [ $# -ne 1 ]; then
      7 	printf 'usage: %s <memecache_path>\n' "$0" >&2
      8 	exit
      9 fi
     10 
     11 ### CONFIGURATION START
     12 
     13 # streaming server executable
     14 #bin=vlc
     15 
     16 # intermediate playlist file
     17 playlist="playlist"
     18 
     19 # memecache source dir
     20 memecache="$1"
     21 
     22 # converted memecache dir
     23 memecache_conv="memecache"
     24 
     25 # title animations dir
     26 title="title"
     27 
     28 # ffmpeg codec flags for generated animations
     29 ffmpeg_codec="-acodec libopus -b:a 96K -vcodec libvpx -f webm -vf scale=1280:-1 -r 30 -ac 2"
     30 
     31 # target video resolution
     32 video_resolution=1280x720
     33 
     34 # slide style
     35 bgcolor=magenta
     36 fcolor=white
     37 
     38 # show image memes for this duration, must be two digits [s]
     39 image_display_time=10
     40 
     41 # show title slides for this duration, must be two digits [s]
     42 title_display_time=05
     43 
     44 ### CONFIGURATION END
     45 
     46 
     47 fit_img_16_9() {
     48 	convert -resize "$video_resolution"\> -size "$video_resolution" "$1" \
     49 		xc:"$bgcolor" +swap -gravity center -composite "$2"
     50 }
     51 
     52 video_from_img() {
     53 	ffmpeg -y \
     54 		-f lavfi \
     55 		-i anullsrc=r=48000 \
     56 		-i "$1" \
     57 		-t "00:00:${image_display_time}" \
     58 		$ffmpeg_codec \
     59 		"$2";
     60 }
     61 
     62 title_slide() {
     63 	img="$(basename "${1%.*}".png)"
     64 	convert -size "$video_resolution" "xc:${bgcolor}" \
     65 		-pointsize 48 -fill "$fgcolor" \
     66 		-gravity center -draw "text 0,0 '#${img%.*}'" "$img"
     67 	ffmpeg -y \
     68 		-f lavfi \
     69 		-i anullsrc=r=48000 \
     70 		-i "$img" \
     71 		-t "00:00:${title_display_time}" \
     72 		$ffmpec_codec \
     73 		"$2" && rm "$img"
     74 }
     75 
     76 video_conv() {
     77 	ffmpeg -y -i "$1" $ffmpeg_codec -max_muxing_queue_size 1024 "$2"
     78 }
     79 
     80 mkdir -p "$title"
     81 mkdir -p "$memecache_conv"
     82 
     83 # generate video from each image
     84 for f in "$memecache"/*.jpg "$memecache"/*.JPG "$memecache"/*.png "$memecache"/*.PNG; do
     85 	out="${memecache_conv}/$(basename "${f%.*}.webm")"
     86 	if [ -e "$f" ] && [ ! -e "$out" ]; then
     87 		printf 'in: %s, out: %s\n' "$f" "$out"
     88 		fit_img_16_9 "$f" "${out%.*}.jpg"
     89 		video_from_img "${out%.webm}.jpg" "${out}"
     90 	fi
     91 done
     92 
     93 # make animation for fallback stream
     94 if [ ! -f bitreich-tv.webm ]; then
     95 	title_slide bitreich-tv bitreich-tv.webm
     96 fi
     97 
     98 
     99 # make title slides for video and converted images and encode to common codec
    100 for f in "$memecache"/*.mkv \
    101          "$memecache"/*.mp4 \
    102 		 "$memecache"/*.webm \
    103 		 "$memecache_conv"/*.webm; do
    104 
    105 	title_path="${title}/$(basename "${f%.*}.webm")"
    106 	[ ! -e "$title_path" ] && title_slide "$f" "$title_path"
    107 
    108 	out="${memecache_conv}/$(basename "${f%.*}.webm")"
    109 	[ ! -e "$out" ] && video_conv "$f" "$out"
    110 done
    111 
    112 # generate random playlist from converted memes and add title slides
    113 find "$memecache_conv" -maxdepth 1 -name "*.webm" -type f | \
    114 	sort -R | \
    115 	awk -v memecachedir="$memecache" -v titledir="$title" '
    116 	function add_title(s) {
    117 		sub(/memecache/, "title", s);
    118 		return s
    119 	}
    120 	{line=$0;
    121 	print "file \""add_title($line)"\"";
    122 	print "file \""$0"\""}' | sed "s/\"/'/g" > "$playlist"
    123 	#print "file \""$0"\""}' | sed "s/\"/'/g" |grep -v title> "$playlist"
    124 
    125 printf '\nstarting fallback stream\n'
    126 ffmpeg -loglevel quiet \
    127 	-stream_loop -1 -i bitreich-tv.webm
    128 	-f webm -codec copy
    129 	icecast://source:${pass}@localhost:8000/brtvfallback
    130 
    131 exit 0
    132 
    133 sleep 5
    134 
    135 printf '\nstarting stream\n'
    136 
    137 ffmpeg -f concat -safe 0 -stream_loop -1 -i "$playlist" \
    138 	-f webm -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm \
    139 	-analyzeduration 2M -probesize 2M \
    140 	-codec copy \
    141 	-deadline realtime -threads 8 \
    142 	icecast://source:${pass}@localhost:8000/brtv