Skip to content

Instantly share code, notes, and snippets.

@z
Last active December 5, 2022 20:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save z/7add840a276b047dfc87155f35acd43c to your computer and use it in GitHub Desktop.
Save z/7add840a276b047dfc87155f35acd43c to your computer and use it in GitHub Desktop.
Xonotic, screenshot all maps
#!/usr/bin/env bash
# Use Xvfb to open a xonotic client and take 9 screenshots
# z@xnz.me
export DISPLAY=:1.0
# Customize
DIMENSIONS=1920x1080
XONOTIC_DIR=~/.xonotic/
XONOTIC_GAME=data_dl
XONOTIC_DATA=${XONOTIC_DIR}/${XONOTIC_GAME}
CONCURRENT_JOBS=6
# Internal
SCRIPT_NAME=$(basename $0 .sh)
QUEUE_FILE="/tmp/${SCRIPT_NAME}.jobqueue"
QUEUE_LOCK="/tmp/${SCRIPT_NAME}.lock"
LOG_FILE="${SCRIPT_NAME}.log"
_clean_up() {
rm -f ${QUEUE_FILE}
rm -f ${QUEUE_LOCK}
}
_clean_up_xvfb() {
pkill Xvfb
}
_clean_up_aborted() {
_clean_up_xvfb
for d in $(find ~/.xonotic -maxdepth 1 -name "data_dl_*"); do find ${d} -maxdepth 1 -iname "*.pk3"; done | xargs mv -t ${XONOTIC_DATA} 2> /dev/null
}
_run_xvfb() {
if [[ ! -f /tmp/.X1-lock ]]; then
/usr/bin/Xvfb ${DISPLAY} -screen 0 ${DIMENSIONS}x16 +extension RENDER & xvfb_pid=$!
else
xvfb_pid=$(pgrep -f Xvfb)
fi
echo "[ INFO ] Xvfb PID: ${xvfb_pid}"
trap _clean_up_aborted SIGKILL SIGINT
}
_get_all_bsps() {
local pk3_file="${1}"
unzip -l ${pk3_file} |grep ".bsp" |awk -F "maps/" '{ print $2 }' |sed 's/\.bsp$//g' |sort |uniq 2> /dev/null
}
_get_all_pk3s() {
local directory="${1:-${XONOTIC_DATA}}"
find ${directory} -maxdepth 1 -iname "*.pk3"
}
_preflight() {
local DATA_PK3S=$(_get_all_pk3s)
mkdir -p ${XONOTIC_DATA}/{intake,processed}
if [[ ${#DATA_PK3S} -gt 0 ]]; then
echo ${DATA_PK3S} | xargs mv -t ${XONOTIC_DATA}/intake
fi
}
_populate_queue() {
local PK3S=$(_get_all_pk3s ${XONOTIC_DATA}/intake)
if [[ ${#PK3S} -lt 1 ]]; then
echo "No pk3s found"; exit 1
else
echo ${PK3S} | tr -s ' ' '\n' > ${QUEUE_FILE}
fi
}
_run_jobs() {
local queue_file=${1:-${QUEUE_FILE}}
local start=$(date +%s)
(
flock -n 9 || exit 99
trap _clean_up EXIT
if [[ -f ${queue_file} ]]; then
parallel -j${CONCURRENT_JOBS} --progress --eta --joblog "${LOG_FILE}" -a ${queue_file} ./screenshot-all-maps.sh screenshot_pk3 '{1}' '{%}'
else
echo "[ ERROR ] No jobs found"
fi
) 9>${QUEUE_LOCK}
if [[ $? -eq 99 ]]; then
echo "[ ERROR ] lockfile exists, remove if you're sure jobs aren't running: ${QUEUE_LOCK}"
exit 1
fi
local end=$(date +%s)
local runtime=$((end-start))
printf 'Runtime: %02dh:%02dm:%02ds\n' $((runtime/3600)) $((runtime%3600/60)) $((runtime%60))
_clean_up_xvfb
}
screenshot_pk3() {
local pk3_file=${1}
local gamedir="data_dl_${2:-temp}"
if [[ ${#pk3_file} -lt 1 ]]; then echo "No pk3 specified"; exit 1; fi
local PACKAGE=$(basename "${pk3_file}")
local XONOTIC_TEMP=${XONOTIC_DIR}/${gamedir}
mkdir -p ${XONOTIC_TEMP}
echo "[ INFO ] Processing Package: ${PACKAGE}"
mv "${XONOTIC_DATA}/intake/${PACKAGE}" "${XONOTIC_TEMP}/"
local BSPS=$(_get_all_bsps "${XONOTIC_TEMP}/${PACKAGE}")
if [[ ${#BSPS} -gt 0 ]]; then
for M in ${BSPS}; do
./misc/tools/xonotic-map-screenshot "${M}" 9 120 5 +"scr_screenshot_name \"${PACKAGE}-${M}-\"" \
-game ${XONOTIC_GAME} -game ${gamedir} -game generated \
+'set g_mapinfo_allow_unsupported_modes_and_let_stuff_break 1' \
+g_dm 1
done
fi
mv "${XONOTIC_TEMP}/${PACKAGE}" "${XONOTIC_DATA}/processed"
}
case $1 in
## commands
'screenshot_pk3') _run_xvfb; screenshot_pk3 $2 $3;;
*) _run_xvfb; _preflight; _populate_queue; _run_jobs;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment