tbrtv-start.sh - bitreich-memestats - statistical analysis of tags in Freenode/#bitreich-en
 (HTM) git clone git://src.adamsgaard.dk/bitreich-memestats
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tbrtv-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