aboutgitcodebugslistschat
path: root/test/lib/video
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib/video')
-rwxr-xr-xtest/lib/video107
1 files changed, 65 insertions, 42 deletions
diff --git a/test/lib/video b/test/lib/video
index 6db9c1d..ec79c85 100755
--- a/test/lib/video
+++ b/test/lib/video
@@ -8,9 +8,9 @@
# PASTA - Pack A Subtle Tap Abstraction
# for network namespace/tap device mode
#
-# test/lib/video - Video grabbing, JavaScript fragments with links
+# test/lib/video - Session recording, JavaScript fragments with links
#
-# Copyright (c) 2021 Red Hat GmbH
+# Copyright (c) 2021-2022 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>
FFMPEG_PID_FILE="$(mktemp)"
@@ -33,19 +33,24 @@ for (var i = 0; i < video___VIDEO_NAME__links.length; i++) {
var obj = document.getElementById(video___VIDEO_NAME__links[i][0]);
obj.addEventListener("click", function(event) {
- var __VIDEO_NAME___video = document.getElementById("__VIDEO_NAME___video");
- var top = __VIDEO_NAME___video.offsetTop - 5;
+ var __VIDEO_NAME___div = document.getElementById("__VIDEO_NAME__");
+ var top = __VIDEO_NAME___div.offsetTop - 5;
+ var seek;
- event.preventDefault();
- __VIDEO_NAME___video.play();
- __VIDEO_NAME___video.pause();
for (var i = 0; i < video___VIDEO_NAME__links.length; i++) {
if (this.id == video___VIDEO_NAME__links[i][0]) {
- __VIDEO_NAME___video.currentTime = video___VIDEO_NAME__links[i][1];
+ seek = video___VIDEO_NAME__links[i][1];
}
}
+
+ event.preventDefault();
+ __VIDEO_NAME___player.dispose();
+ __VIDEO_NAME___player = AsciinemaPlayer.create(
+ "/builds/latest/web/__VIDEO_NAME__.cast",
+ __VIDEO_NAME___div,
+ { startAt: seek, autoplay: true });
+
window.scrollTo({ top: top, behavior: "smooth" })
- __VIDEO_NAME___video.play();
}, false);
}
'
@@ -65,53 +70,71 @@ video_append_links_js()
VIDEO_LINKS_BUF="${VIDEO_LINKS_BUF}${@}"
}
-# video_grab() - Fetch window geometry, start grabbing video
-video_grab() {
+# video_start() - Mark start of a test in capture, record start timestamp
+video_start() {
VIDEO_NAME="${1}"
- rm -f "${BASEPATH}/${VIDEO_NAME}.mp4" "${BASEPATH}/${VIDEO_NAME}.webm" "${BASEPATH}/${VIDEO_NAME}.js"
-
echo "${VIDEO_LINKS_TEMPLATE}" > "${BASEPATH}/${VIDEO_NAME}.js"
-
- if [ ${XVFB} -eq 1 ]; then
- # Grab the geometry of the first window that's at least 100px wide
- eval $(xwininfo -d :99.0 -root -tree | sed -n 's/^[ ]*0x[0-f]*[^0-9]*\([0-9]\{3,\}\)x\([0-9]*\)+\([0-9]*\)+\([0-9]*\).*/__width=\1; __height=\2; __x=\3; __y=\4;/p')
- else
- __x=$(xwininfo -id $(xdotool getactivewindow) | sed -n 's/[ ]*Absolute upper-left X:[ ]*\([0-9]*\)$/\1/p')
- __y=$(xwininfo -id $(xdotool getactivewindow) | sed -n 's/[ ]*Absolute upper-left Y:[ ]*\([0-9]*\)$/\1/p')
- __width=$(xwininfo -id $(xdotool getactivewindow) | sed -n 's/[ ]*Width:[ ]*\([0-9]*\)$/\1/p')
- __height=$(xwininfo -id $(xdotool getactivewindow) | sed -n 's/[ ]*Height:[ ]*\([0-9]*\)$/\1/p')
- fi
-
- [ $((__width % 2)) ] && __width=$((__width - 1))
- [ $((__height % 2)) ] && __height=$((__height - 1))
-
- sleep 3
VIDEO_START_SECONDS=$(sed -n 's/\([0-9]*\).[0-9]* [0-9]*.[0-9]*/\1/p' /proc/uptime)
- [ ${XVFB} -eq 1 ] && __disp=":99.0" || __disp=
- ffmpeg -f x11grab -framerate 15 -video_size "${__width}x${__height}" -i "${__disp}+${__x},${__y}" -vcodec libx264 -qp 0 -draw_mouse 0 "${BASEPATH}/${VIDEO_NAME}.mp4" & echo $! > "${FFMPEG_PID_FILE}"
-}
-# video_time_now() - Print current video timestamp, in seconds
-video_time_now() {
- __now=$(sed -n 's/\([0-9]*\).[0-9]* [0-9]*.[0-9]*/\1/p' /proc/uptime)
- echo $((__now - VIDEO_START_SECONDS))
+ sync
+ [ ${DEMO} -eq 1 ] && tail -1 "${BASEPATH}/demo.uncut" > "${BASEPATH}/${VIDEO_NAME}.start"
+ [ ${CI} -eq 1 ] && tail -1 "${BASEPATH}/ci.uncut" > "${BASEPATH}/${VIDEO_NAME}.start"
+ sync
+
+ tmux refresh-client
}
-# video_stop() - Stop grabbing, finalise JavaScript templates, convert to webm
+# video_stop() - Mark stop of a test in capture, finalise JavaScript fragments
video_stop() {
+ tmux refresh-client
+
+ sync
+ [ ${DEMO} -eq 1 ] && tail -1 "${BASEPATH}/demo.uncut" > "${BASEPATH}/${VIDEO_NAME}.stop"
+ [ ${CI} -eq 1 ] && tail -1 "${BASEPATH}/ci.uncut" > "${BASEPATH}/${VIDEO_NAME}.stop"
+ sync
+
sed -i 's/^.*$/&\\/g' "${BASEPATH}/${VIDEO_NAME}.js"
echo "${VIDEO_LINKS_TEMPLATE_JS}" | sed "s/__VIDEO_NAME__/${VIDEO_NAME}/g" >> "${BASEPATH}/${VIDEO_NAME}.js"
echo "${VIDEO_LINKS_BUF}" >> "${BASEPATH}/${VIDEO_NAME}.js"
echo "${VIDEO_LINKS_TEMPLATE_POST}" | sed "s/__VIDEO_NAME__/${VIDEO_NAME}/g" >> "${BASEPATH}/${VIDEO_NAME}.js"
+}
- kill -INT $(cat "${FFMPEG_PID_FILE}")
- while ps -p $(cat "${FFMPEG_PID_FILE}") >/dev/null; do sleep 1; done
- rm "${FFMPEG_PID_FILE}"
-
- [ ${1} -ne 0 ] && return
+# video_postprocess() - Cut terminal recordings based on .start and .stop files
+video_postprocess() {
+ IFS='
+'
+ __cast_name=
+ for __l in $(cat ${1}); do
+ [ -z "${__header}" ] && __header="${__l}" && continue
+
+ if [ -z "${__cast_name}" ]; then
+ for __cast_cut in *.start; do
+ [ "${__l}" != "$(cat "${__cast_cut}")" ] && continue
+ __cast_name="${__cast_cut%.start}"
+ __cast_offset=
+ __stop_line="$(cat ${__cast_name}.stop)"
+ echo "${__header}" > "${__cast_name}.cast"
+ break
+ done
+ continue
+ fi
+
+ [ "${__l}" = "${__stop_line}" ] && __cast_name= && continue
+
+ __l_offset="$(echo ${__l%%.*}|tr -c -d '[:digit:]')"
+ __l_rest="${__l#*.}"
+ [ -z "${__cast_offset}" ] && __cast_offset=${__l_offset}
+ __l_offset=$((__l_offset - __cast_offset))
+ printf '[%s.%s\n' "${__l_offset}" "${__l_rest}" >> "${__cast_name}".cast
+ done
+ unset IFS
+}
- ffmpeg -an -fflags +genpts -i "${BASEPATH}/${VIDEO_NAME}.mp4" -c:v libvpx-vp9 -row-mt 1 -minrate 10k -maxrate 200k -b:v 200k "${BASEPATH}/${VIDEO_NAME}.webm"
+# video_time_now() - Print current video timestamp, in seconds
+video_time_now() {
+ __now=$(sed -n 's/\([0-9]*\).[0-9]* [0-9]*.[0-9]*/\1/p' /proc/uptime)
+ echo $((__now - VIDEO_START_SECONDS))
}
# video_link() - Append single link to given video chapter