2018-01-23 11:59:02 +01:00
|
|
|
#!/bin/bash
|
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
|
2018-02-14 11:38:35 +01:00
|
|
|
### Variables ###
|
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
CURRENT_UID="$(id -u $USER)"
|
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
|
|
|
adduser --uid $USER_ID --disabled-password --gecos "" myuser
|
|
|
|
fi
|
2018-01-29 15:26:31 +01:00
|
|
|
|
2018-01-23 11:59:02 +01:00
|
|
|
URL="${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo}"
|
|
|
|
RESOLUTION="${RESOLUTION:-1920x1080}"
|
2018-02-06 10:09:14 +01:00
|
|
|
FRAMERATE="${FRAMERATE:-24}"
|
2018-01-23 11:59:02 +01:00
|
|
|
VIDEO_SIZE="$RESOLUTION"
|
|
|
|
ARRAY=(${VIDEO_SIZE//x/ })
|
2018-04-18 14:21:43 +02:00
|
|
|
VIDEO_ID="${VIDEO_ID:-video}"
|
2018-01-23 11:59:02 +01:00
|
|
|
VIDEO_NAME="${VIDEO_NAME:-video}"
|
2018-03-15 16:36:42 +01:00
|
|
|
VIDEO_FORMAT="${VIDEO_FORMAT:-mp4}"
|
2018-03-14 11:49:40 +01:00
|
|
|
RECORDING_JSON="'${RECORDING_JSON}'"
|
2018-01-23 11:59:02 +01:00
|
|
|
|
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
### Store Recording json data ###
|
|
|
|
|
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
2018-04-18 14:21:43 +02:00
|
|
|
su myuser -c "echo ${RECORDING_JSON} > /recordings/.recording.${VIDEO_ID}"
|
2018-03-14 11:49:40 +01:00
|
|
|
else
|
2018-04-18 14:21:43 +02:00
|
|
|
echo ${RECORDING_JSON} > /recordings/.recording.${VIDEO_ID}
|
2018-03-14 11:49:40 +01:00
|
|
|
fi
|
2018-02-14 11:38:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
### Get a free display identificator ###
|
|
|
|
|
2018-01-29 15:26:31 +01:00
|
|
|
DISPLAY_NUM=99
|
|
|
|
DONE="no"
|
2018-01-23 11:59:02 +01:00
|
|
|
|
2018-01-29 15:26:31 +01:00
|
|
|
while [ "$DONE" == "no" ]
|
|
|
|
do
|
2018-02-06 10:09:14 +01:00
|
|
|
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
|
2018-01-29 15:26:31 +01:00
|
|
|
done
|
2018-01-23 11:59:02 +01:00
|
|
|
|
2018-01-29 15:26:31 +01:00
|
|
|
echo "First available display -> :$DISPLAY_NUM"
|
|
|
|
echo "----------------------------------------"
|
2018-01-23 11:59:02 +01:00
|
|
|
|
2018-02-14 11:38:35 +01:00
|
|
|
|
|
|
|
### Start pulseaudio ###
|
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
|
|
|
su myuser -c "pulseaudio -D"
|
|
|
|
else
|
|
|
|
pulseaudio -D
|
|
|
|
fi
|
|
|
|
|
2018-02-14 11:38:35 +01:00
|
|
|
|
|
|
|
### Start Chrome in headless mode with xvfb, using the display num previously obtained ###
|
|
|
|
|
2018-01-29 15:26:31 +01:00
|
|
|
touch xvfb.log
|
|
|
|
chmod 777 xvfb.log
|
2018-01-23 11:59:02 +01:00
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
2018-03-14 11:49:40 +01:00
|
|
|
su myuser -c "xvfb-run --server-num=${DISPLAY_NUM} --server-args='-ac -screen 0 ${RESOLUTION}x24 -noreset' google-chrome -no-sandbox -test-type -disable-infobars -window-size=${ARRAY[0]},${ARRAY[1]} -no-first-run -ignore-certificate-errors --kiosk $URL &> xvfb.log &"
|
2018-02-06 10:09:14 +01:00
|
|
|
else
|
2018-03-14 11:49:40 +01:00
|
|
|
xvfb-run --server-num=${DISPLAY_NUM} --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome -no-sandbox -test-type -disable-infobars -window-size=${ARRAY[0]},${ARRAY[1]} -no-first-run -ignore-certificate-errors --kiosk $URL &> xvfb.log &
|
2018-02-06 10:09:14 +01:00
|
|
|
fi
|
2018-01-29 15:26:31 +01:00
|
|
|
|
|
|
|
touch stop
|
|
|
|
chmod 777 /recordings
|
2018-02-06 10:09:14 +01:00
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
sleep 2
|
2018-02-06 10:09:14 +01:00
|
|
|
|
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
### Start recording with ffmpeg ###
|
2018-02-06 10:09:14 +01:00
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
|
|
|
su myuser -c "<./stop ffmpeg -y -f alsa -i pulse -f x11grab -framerate 25 -video_size $RESOLUTION -i :${DISPLAY_NUM} -c:a libfdk_aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=25 '/recordings/${VIDEO_NAME}.${VIDEO_FORMAT}'"
|
|
|
|
else
|
|
|
|
<./stop ffmpeg -y -f alsa -i pulse -f x11grab -framerate 25 -video_size $RESOLUTION -i :${DISPLAY_NUM} -c:a libfdk_aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=25 "/recordings/${VIDEO_NAME}.${VIDEO_FORMAT}"
|
|
|
|
fi
|
2018-02-06 10:09:14 +01:00
|
|
|
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
### Generate video report file ###
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
2018-04-18 14:21:43 +02:00
|
|
|
su myuser -c "ffprobe -v quiet -print_format json -show_format -show_streams /recordings/${VIDEO_NAME}.${VIDEO_FORMAT} > /recordings/${VIDEO_ID}.info"
|
2018-03-14 11:49:40 +01:00
|
|
|
else
|
2018-04-18 14:21:43 +02:00
|
|
|
ffprobe -v quiet -print_format json -show_format -show_streams /recordings/${VIDEO_NAME}.${VIDEO_FORMAT} > /recordings/${VIDEO_ID}.info
|
2018-03-14 11:49:40 +01:00
|
|
|
fi
|
2018-02-14 11:38:35 +01:00
|
|
|
|
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
### Update Recording json data ###
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-03-14 11:49:40 +01:00
|
|
|
if [[ $CURRENT_UID != $USER_ID ]]; then
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-04-18 14:21:43 +02:00
|
|
|
TMP=$(su myuser -c "mktemp /recordings/.${VIDEO_ID}.XXXXXXXXXXXXXXXXXXXXXXX.if.json")
|
|
|
|
INFO=$(su myuser -c "cat /recordings/${VIDEO_ID}.info | jq '.'")
|
2018-03-14 11:49:40 +01:00
|
|
|
HAS_AUDIO_AUX=$(su myuser -c "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=$(su myuser -c "echo '$INFO' | jq '.streams[] | select(.codec_type == \"video\")'")
|
|
|
|
if [ -z "$HAS_VIDEO_AUX" ]; then HAS_VIDEO=false; else HAS_VIDEO=true; fi
|
|
|
|
SIZE=$(su myuser -c "echo '$INFO' | jq '.format.size | tonumber'")
|
|
|
|
DURATION=$(su myuser -c "echo '$INFO' | jq '.format.duration | tonumber'")
|
|
|
|
STATUS="stopped"
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-04-18 14:21:43 +02:00
|
|
|
su myuser -c "jq -c -r \".hasAudio=${HAS_AUDIO} | .hasVideo=${HAS_VIDEO} | .duration=${DURATION} | .size=${SIZE} | .status=\\\"${STATUS}\\\"\" \"/recordings/.recording.${VIDEO_ID}\" > ${TMP} && mv ${TMP} \"/recordings/.recording.${VIDEO_ID}\""
|
2018-02-14 11:38:35 +01:00
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
else
|
2018-03-14 11:49:40 +01:00
|
|
|
|
2018-04-18 14:21:43 +02:00
|
|
|
TMP=$(mktemp /recordings/.${VIDEO_ID}.XXXXXXXXXXXXXXXXXXXXXXX.else.json)
|
|
|
|
INFO=$(cat /recordings/${VIDEO_ID}.info | jq '.')
|
2018-03-14 11:49:40 +01:00
|
|
|
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')
|
|
|
|
STATUS="stopped"
|
|
|
|
|
2018-04-18 14:21:43 +02:00
|
|
|
jq -c -r ".hasAudio=${HAS_AUDIO} | .hasVideo=${HAS_VIDEO} | .duration=${DURATION} | .size=${SIZE} | .status=\"${STATUS}\"" "/recordings/.recording.${VIDEO_ID}" > ${TMP} && mv ${TMP} "/recordings/.recording.${VIDEO_ID}"
|
2018-03-14 11:49:40 +01:00
|
|
|
|
2018-02-06 10:09:14 +01:00
|
|
|
fi
|
2018-01-23 11:59:02 +01:00
|
|
|
|