Last active
December 5, 2022 20:07
-
-
Save z/7add840a276b047dfc87155f35acd43c to your computer and use it in GitHub Desktop.
Xonotic, screenshot all maps
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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