diff --git a/openvidu-server/docker/openvidu-recording/firefox/Dockerfile b/openvidu-server/docker/openvidu-recording/firefox/Dockerfile new file mode 100644 index 00000000..d4ccaebe --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/firefox/Dockerfile @@ -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 diff --git a/openvidu-server/docker/openvidu-recording/firefox/configuration/autoconfig.js b/openvidu-server/docker/openvidu-recording/firefox/configuration/autoconfig.js new file mode 100644 index 00000000..9cc1c9ea --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/firefox/configuration/autoconfig.js @@ -0,0 +1,2 @@ +pref("general.config.filename", "customconfig.cfg"); +pref("general.config.obscure_value", 0); \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/firefox/configuration/customconfig.cfg b/openvidu-server/docker/openvidu-recording/firefox/configuration/customconfig.cfg new file mode 100644 index 00000000..3aac4941 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/firefox/configuration/customconfig.cfg @@ -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); \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/firefox/configuration/forcefull@shdon.com.xpi b/openvidu-server/docker/openvidu-recording/firefox/configuration/forcefull@shdon.com.xpi new file mode 100644 index 00000000..23c901c1 Binary files /dev/null and b/openvidu-server/docker/openvidu-recording/firefox/configuration/forcefull@shdon.com.xpi differ diff --git a/openvidu-server/docker/openvidu-recording/firefox/configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi b/openvidu-server/docker/openvidu-recording/firefox/configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi new file mode 100644 index 00000000..4b4be576 Binary files /dev/null and b/openvidu-server/docker/openvidu-recording/firefox/configuration/{d320c473-63c2-47ab-87f8-693b1badb5e3}.xpi differ diff --git a/openvidu-server/docker/openvidu-recording/firefox/create_image.sh b/openvidu-server/docker/openvidu-recording/firefox/create_image.sh new file mode 100755 index 00000000..beb53402 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/firefox/create_image.sh @@ -0,0 +1 @@ +docker build --rm -t openvidu/openvidu-recording:2.10.0-firefox . diff --git a/openvidu-server/docker/openvidu-recording/firefox/entrypoint.sh b/openvidu-server/docker/openvidu-recording/firefox/entrypoint.sh new file mode 100755 index 00000000..5732cfe7 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/firefox/entrypoint.sh @@ -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 \ No newline at end of file