openvidu-recording Firefox container

pull/331/head
pabloFuente 2019-09-27 10:31:31 +02:00
parent 2389d22e4a
commit b2e3c7ac2b
7 changed files with 154 additions and 0 deletions

View File

@ -0,0 +1,34 @@
FROM ubuntu:16.04
MAINTAINER openvidu@gmail.com
# Install Firefox
RUN apt-get update && apt-get -y upgrade && apt-get install -y wget sudo
RUN apt-get install -y firefox
# Install media packages
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:jonathonf/ffmpeg-4
RUN apt-get update
RUN apt-get install -y ffmpeg pulseaudio xvfb
# Install jq for managing JSON
RUN apt-get install -y jq
# Clean
RUN apt-get autoclean
COPY entrypoint.sh /entrypoint.sh
COPY configuration/autoconfig.js /usr/lib/firefox/defaults/pref/autoconfig.js
COPY configuration/customconfig.cfg /usr/lib/firefox/customconfig.cfg
COPY configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi /usr/lib/firefox-addons/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi
COPY configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi /usr/lib/firefox-addons/distribution/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi
COPY configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi /usr/share/mozilla/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi
RUN ["chmod", "+x", "/entrypoint.sh"]
RUN ["chmod", "755", "/usr/lib/firefox-addons/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi"]
RUN ["chmod", "755", "/usr/lib/firefox-addons/distribution/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi"]
RUN ["chmod", "755", "/usr/share/mozilla/extensions/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi"]
RUN mkdir /recordings
RUN chmod 777 /recordings
ENTRYPOINT /entrypoint.sh

View File

@ -0,0 +1,2 @@
pref("general.config.filename", "customconfig.cfg");
pref("general.config.obscure_value", 0);

View File

@ -0,0 +1,8 @@
lockPref("browser.shell.checkDefaultBrowser", false);
lockPref("media.autoplay.default", 0);
lockPref("media.autoplay.enabled.user-gestures-needed", false);
lockPref("extensions.autoDisableScopes", 0);
lockPref("extensions.enabledScopes", 15);
lockPref("security.ssl.enable_ocsp_stapling", false);
lockPref("network.stricttransportsecurity.preloadlist", false);
lockPref("network.http.phishy-userpass-length", 300);

View File

@ -0,0 +1 @@
docker build --rm -t openvidu/openvidu-recording:2.10.0-firefox .

View File

@ -0,0 +1,109 @@
#!/bin/bash
### Variables ###
URL=${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo}
ONLY_VIDEO=${ONLY_VIDEO:-false}
RESOLUTION=${RESOLUTION:-1920x1080}
FRAMERATE=${FRAMERATE:-25}
WIDTH="$(cut -d'x' -f1 <<< $RESOLUTION)"
HEIGHT="$(cut -d'x' -f2 <<< $RESOLUTION)"
VIDEO_ID=${VIDEO_ID:-video}
VIDEO_NAME=${VIDEO_NAME:-video}
VIDEO_FORMAT=${VIDEO_FORMAT:-mp4}
RECORDING_JSON="${RECORDING_JSON}"
export URL
export ONLY_VIDEO
export RESOLUTION
export FRAMERATE
export WIDTH
export HEIGHT
export VIDEO_ID
export VIDEO_NAME
export VIDEO_FORMAT
export RECORDING_JSON
### Store Recording json data ###
mkdir /recordings/$VIDEO_ID
chmod 777 /recordings/$VIDEO_ID
echo $RECORDING_JSON > /recordings/$VIDEO_ID/.recording.$VIDEO_ID
### Get a free display identificator ###
DISPLAY_NUM=99
DONE="no"
while [ "$DONE" == "no" ]
do
out=$(xdpyinfo -display :$DISPLAY_NUM 2>&1)
if [[ "$out" == name* ]] || [[ "$out" == Invalid* ]]
then
# Command succeeded; or failed with access error; display exists
(( DISPLAY_NUM+=1 ))
else
# Display doesn't exist
DONE="yes"
fi
done
export DISPLAY_NUM
echo "First available display -> :$DISPLAY_NUM"
echo "----------------------------------------"
pulseaudio -D
### Start Chrome in headless mode with xvfb, using the display num previously obtained ###
touch xvfb.log
chmod 777 xvfb.log
xvfb-run --server-num=${DISPLAY_NUM} --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" firefox --width $WIDTH --height $HEIGHT $URL &> xvfb.log &
touch stop
chmod 777 /recordings
sleep 5
### Start recording with ffmpeg ###
if [[ "$ONLY_VIDEO" == true ]]
then
# Do not record audio
<./stop ffmpeg -y -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT"
else
# Record audio ("-f alsa -i pulse [...] -c:a aac")
<./stop ffmpeg -y -f alsa -i pulse -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT"
fi
### Generate video report file ###
ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT > /recordings/$VIDEO_ID/$VIDEO_ID.info
### Update Recording json data ###
TMP=$(mktemp /recordings/$VIDEO_ID/.$VIDEO_ID.XXXXXXXXXXXXXXXXXXXXXXX.json)
INFO=$(cat /recordings/$VIDEO_ID/$VIDEO_ID.info | jq '.')
HAS_AUDIO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "audio")')
if [ -z "$HAS_AUDIO_AUX" ]; then HAS_AUDIO=false; else HAS_AUDIO=true; fi
HAS_VIDEO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "video")')
if [ -z "$HAS_VIDEO_AUX" ]; then HAS_VIDEO=false; else HAS_VIDEO=true; fi
SIZE=$(echo $INFO | jq '.format.size | tonumber')
DURATION=$(echo $INFO | jq '.format.duration | tonumber')
if [[ "$HAS_AUDIO" == false && "$HAS_VIDEO" == false ]]
then
STATUS="failed"
else
STATUS="stopped"
fi
jq -c -r ".hasAudio=$HAS_AUDIO | .hasVideo=$HAS_VIDEO | .duration=$DURATION | .size=$SIZE | .status=\"$STATUS\"" "/recordings/$VIDEO_ID/.recording.$VIDEO_ID" > $TMP && mv $TMP /recordings/$VIDEO_ID/.recording.$VIDEO_ID
### Generate video thumbnail ###
MIDDLE_TIME=$(ffmpeg -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}')
THUMBNAIL_HEIGHT=$((480*$HEIGHT/$WIDTH))
ffmpeg -ss $MIDDLE_TIME -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT -vframes 1 -s 480x$THUMBNAIL_HEIGHT /recordings/$VIDEO_ID/$VIDEO_ID.jpg
### Change permissions to all generated files ###
sudo chmod -R 777 /recordings/$VIDEO_ID