From 45d3ba607859931c53100d660a673e59d3621cee Mon Sep 17 00:00:00 2001 From: cruizba Date: Fri, 26 Jun 2020 18:05:00 +0200 Subject: [PATCH] openvidu-server: Created entrypoint for new composed recording mode: COMPOSED_QUICK_START. --- .../{Dockerfile => 2.15.0.Dockerfile} | 4 +- .../openvidu-recording/2.9.0.Dockerfile | 28 ++++ .../docker/openvidu-recording/create_image.sh | 2 +- .../docker/openvidu-recording/entrypoint.sh | 115 +------------- .../openvidu-recording/scripts/composed.sh | 109 ++++++++++++++ .../scripts/composed_quick_start.sh | 141 ++++++++++++++++++ 6 files changed, 288 insertions(+), 111 deletions(-) rename openvidu-server/docker/openvidu-recording/{Dockerfile => 2.15.0.Dockerfile} (83%) create mode 100644 openvidu-server/docker/openvidu-recording/2.9.0.Dockerfile create mode 100644 openvidu-server/docker/openvidu-recording/scripts/composed.sh create mode 100644 openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh diff --git a/openvidu-server/docker/openvidu-recording/Dockerfile b/openvidu-server/docker/openvidu-recording/2.15.0.Dockerfile similarity index 83% rename from openvidu-server/docker/openvidu-recording/Dockerfile rename to openvidu-server/docker/openvidu-recording/2.15.0.Dockerfile index 3debb635..1099444f 100644 --- a/openvidu-server/docker/openvidu-recording/Dockerfile +++ b/openvidu-server/docker/openvidu-recording/2.15.0.Dockerfile @@ -21,8 +21,8 @@ RUN apt-get update && DEBIAN_FRONTEND="noninteractive" apt-get install -y google # Clean RUN apt-get clean && apt-get autoclean && apt-get autoremove -COPY entrypoint.sh /entrypoint.sh -RUN ["chmod", "+x", "/entrypoint.sh"] +COPY entrypoint.sh scripts/composed.sh scripts/composed_quick_start.sh ./ +RUN ["chmod", "+x", "/entrypoint.sh", "/composed.sh", "/composed_quick_start.sh"] RUN mkdir /recordings RUN chmod 777 /recordings diff --git a/openvidu-server/docker/openvidu-recording/2.9.0.Dockerfile b/openvidu-server/docker/openvidu-recording/2.9.0.Dockerfile new file mode 100644 index 00000000..f96eb999 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/2.9.0.Dockerfile @@ -0,0 +1,28 @@ +FROM ubuntu:16.04 +MAINTAINER openvidu@gmail.com + +# Install Chrome +RUN apt-get update && apt-get -y upgrade && apt-get install -y wget sudo +RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ + echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list && \ + apt-get update && apt-get install -y google-chrome-stable + +# 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 scripts/composed.sh scripts/composed_quick_start.sh ./ +RUN ["chmod", "+x", "/entrypoint.sh", "/composed.sh", "/composed_quick_start.sh"] + +RUN mkdir /recordings +RUN chmod 777 /recordings + +ENTRYPOINT /entrypoint.sh \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/create_image.sh b/openvidu-server/docker/openvidu-recording/create_image.sh index 946f1f1e..b2b6848b 100755 --- a/openvidu-server/docker/openvidu-recording/create_image.sh +++ b/openvidu-server/docker/openvidu-recording/create_image.sh @@ -1 +1 @@ -docker build --rm -t openvidu/openvidu-recording . +docker build --rm -f $1.Dockerfile -t openvidu/openvidu-recording . diff --git a/openvidu-server/docker/openvidu-recording/entrypoint.sh b/openvidu-server/docker/openvidu-recording/entrypoint.sh index e51299bd..82058479 100755 --- a/openvidu-server/docker/openvidu-recording/entrypoint.sh +++ b/openvidu-server/docker/openvidu-recording/entrypoint.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -x ### Use container as a single headless chrome ### @@ -6,115 +6,14 @@ if [ "$HEADLESS_CHROME_ONLY" == true ]; then google-chrome --no-sandbox --headless --remote-debugging-port=$HEADLESS_CHROME_PORT &> /chrome.log & sleep 100000000 else + ### Use container as OpenVidu recording module ### -### Use container as OpenVidu recording module ### + RECORDING_TYPE=${RECORDING_TYPE:-COMPOSED} -### 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" + if [[ "${RECORDING_TYPE}" == "COMPOSED" ]]; then + ./composed.sh + elif [[ "${RECORDING_TYPE}" == "COMPOSED_QUICK_START" ]]; then + ./composed_quick_start.sh 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" google-chrome --kiosk --start-maximized --test-type --no-sandbox --disable-infobars --disable-gpu --disable-popup-blocking --window-size=$WIDTH,$HEIGHT --window-position=0,0 --no-first-run --ignore-certificate-errors --autoplay-policy=no-user-gesture-required $URL &> xvfb.log & -touch stop -chmod 777 /recordings -sleep 2 - -### 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 fi \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/scripts/composed.sh b/openvidu-server/docker/openvidu-recording/scripts/composed.sh new file mode 100644 index 00000000..3260d3ed --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/scripts/composed.sh @@ -0,0 +1,109 @@ +#!/bin/bash -x + +### 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" google-chrome --kiosk --start-maximized --test-type --no-sandbox --disable-infobars --disable-gpu --disable-popup-blocking --window-size=$WIDTH,$HEIGHT --window-position=0,0 --no-first-run --ignore-certificate-errors --autoplay-policy=no-user-gesture-required $URL &> xvfb.log & +touch stop +chmod 777 /recordings +sleep 2 + +### 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 diff --git a/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh b/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh new file mode 100644 index 00000000..564e5e89 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh @@ -0,0 +1,141 @@ +#!/bin/bash -x + +### Global variables ### +RESOLUTION=${RESOLUTION:-1920x1080} +WIDTH="$(cut -d'x' -f1 <<< $RESOLUTION)" +HEIGHT="$(cut -d'x' -f2 <<< $RESOLUTION)" +export RESOLUTION +export WIDTH +export HEIGHT + +# QUICK_START_ACTION indicates wich action to perform when COMPOSED_QUICK_START mode is executed +# Possible values are: +# - Without parameters: Just execute all necessary configuration for xfvb and start chrome, waiting forever with a session openned +# - --start-recording: Executes ffmpeg to record a session but don't stop chrome +# - --stop-recording: Stops ffmpeg recording +COMPOSED_QUICK_START_ACTION=$1 +export COMPOSED_QUICK_START_ACTION + +if [[ -z "${COMPOSED_QUICK_START_ACTION}" ]]; then + + ### Variables ### + URL=${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo} + export URL + + ### 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 + # Save DISPLAY_NUM in a temp file to be accessible for other scripts + echo "export DISPLAY_NUM=${DISPLAY_NUM}" >> /tmp/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" google-chrome --kiosk --start-maximized --test-type --no-sandbox --disable-infobars --disable-gpu --disable-popup-blocking --window-size=$WIDTH,$HEIGHT --window-position=0,0 --no-first-run --ignore-certificate-errors --autoplay-policy=no-user-gesture-required $URL &> xvfb.log & + chmod 777 /recordings + sleep infinity + +elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--start-recording" ]]; then + + source /tmp/DISPLAY_NUM + + # Remove possible stop file from previous recordings + [ -e stop ] && rm stop + # Create stop file + touch stop + + # Variables + ONLY_VIDEO=${ONLY_VIDEO:-false} + FRAMERATE=${FRAMERATE:-25} + VIDEO_ID=${VIDEO_ID:-video} + VIDEO_NAME=${VIDEO_NAME:-video} + VIDEO_FORMAT=${VIDEO_FORMAT:-mp4} + RECORDING_JSON="${RECORDING_JSON}" + + export ONLY_VIDEO + export FRAMERATE + 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 + + ### 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 + +elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--stop-recording" ]]; then + + echo 'q' > stop + +fi + + +