Update .gitea/actions/generate-previews/action.yml

This commit is contained in:
2025-11-23 12:38:37 +01:00
parent abf1e95cf0
commit a6c06b4f82

View File

@@ -1,183 +1,203 @@
name: "Generate Previews" name: "Generate Previews"
description: "Generate Danser videos, screenshots, thumbnails, and rename them based on skin.ini" description: "Generate Danser videos, screenshots, thumbnails, and rename them based on skin.ini"
inputs: inputs:
changed_skins_file: changed_skins_file:
description: "Path to JSON file containing changed skins" description: "Path to JSON file containing changed skins"
required: true required: true
runs: runs:
using: "composite" using: "composite"
steps: steps:
- name: Generate Danser videos and screenshots - name: Generate Danser videos and screenshots
shell: bash shell: bash
run: | run: |
echo "[Danser Job Started]" echo "[Danser Job Started]"
if [ -z "${{ inputs.changed_skins_file }}" ] || [ ! -s "${{ inputs.changed_skins_file }}" ]; then retry() {
echo "No skins changed. Skipping generation." local n=1
exit 0 local max=5
fi local delay=2
while true; do
mapfile -t skins < <(jq -r '.[]' "${{ inputs.changed_skins_file }}") "$@" && break || {
[ "${#skins[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; } if [[ $n -lt $max ]]; then
echo "Attempt $n failed. Retrying in $delay seconds..."
SKIN_COUNT=${#skins[@]} sleep $delay
INDEX=1 ((n++))
else
for skin_path in "${skins[@]}"; do echo "Attempt $n failed. No more retries left."
[ -z "$skin_path" ] && continue return 1
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path" fi
[ ! -d "$SKIN_DIR" ] && { echo "Skipping missing skin: $skin_path"; continue; } }
done
SKIN_NAME="$skin_path" }
OUT_VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_NAME"
OUT_PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_NAME" if [ -z "${{ inputs.changed_skins_file }}" ] || [ ! -s "${{ inputs.changed_skins_file }}" ]; then
OUT_THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_NAME" echo "No skins changed. Skipping generation."
exit 0
echo "" fi
echo "[$INDEX/$SKIN_COUNT] Generating for skin: $SKIN_NAME"
mapfile -t skins < <(jq -r '.[]' "${{ inputs.changed_skins_file }}")
LOGFILE="/tmp/danser_log_$INDEX.txt" [ "${#skins[@]}" -eq 0 ] && { echo "No skins to process. Exiting."; exit 0; }
echo " → Generating video..." SKIN_COUNT=${#skins[@]}
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \ INDEX=1
-replay "$GAMEPLAY_REPLAY_PATH" -record -skip -start=300 -end=307 -noupdatecheck \
-out="$SKIN_NAME" -skin="$SKIN_NAME" -settings="skinhub" >"$LOGFILE" 2>&1; then for skin_path in "${skins[@]}"; do
echo " ✖ Video failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue [ -z "$skin_path" ] && continue
fi SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
[ ! -d "$SKIN_DIR" ] && { echo "Skipping missing skin: $skin_path"; continue; }
if [ -f "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" ]; then
echo " → Trimming MP4 with ffmpeg..." SKIN_NAME="$skin_path"
ffmpeg -hide_banner -loglevel error \ OUT_VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_NAME"
-ss 5 -t 6.5 \ OUT_PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_NAME"
-i "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" \ OUT_THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_NAME"
-c:v h264_nvenc -preset fast \
-c:a aac -b:a 128k \ echo ""
"$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" echo "[$INDEX/$SKIN_COUNT] Generating for skin: $SKIN_NAME"
if [ -f "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" ]; then LOGFILE="/tmp/danser_log_$INDEX.txt"
mv "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4"
mkdir -p "$OUT_VIDEO_DIR" echo " → Generating video..."
mv "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" "$OUT_VIDEO_DIR/$SKIN_NAME.mp4" if ! retry xvfb-run -a "$DANSER_DIR/danser-cli" \
echo " ✓ Trimmed MP4 moved to $OUT_VIDEO_DIR/" -replay "$GAMEPLAY_REPLAY_PATH" -record -skip -start=300 -end=307 -noupdatecheck \
else -out="$SKIN_NAME" -skin="$SKIN_NAME" -settings="skinhub" >"$LOGFILE" 2>&1; then
echo " ✖ ffmpeg trimming failed for $SKIN_NAME" echo " ✖ Video failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi fi
else
echo " ✖ No MP4 found for $SKIN_NAME" if [ -f "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" ]; then
fi echo " → Trimming MP4 with ffmpeg..."
if ! retry ffmpeg -hide_banner -loglevel error \
echo " → Taking screenshot..." -ss 5 -t 6.5 \
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \ -i "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" \
-replay "$PANEL_REPLAY_PATH" -skip -settings="skinhub" -noupdatecheck -ss 28 \ -c:v h264_nvenc -preset fast \
-out="$SKIN_NAME" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then -c:a aac -b:a 128k \
echo " ✖ Screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4"; then
fi echo " ✖ ffmpeg trimming failed for $SKIN_NAME"
fi
if [ -f "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" ]; then
mkdir -p "$OUT_PNG_DIR" if [ -f "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" ]; then
mv "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" "$OUT_PNG_DIR/$SKIN_NAME.png" mv "$DANSER_VIDEO_DIR/${SKIN_NAME}_trimmed.mp4" "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4"
echo " ✓ PNG moved to $OUT_PNG_DIR/" mkdir -p "$OUT_VIDEO_DIR"
else mv "$DANSER_VIDEO_DIR/$SKIN_NAME.mp4" "$OUT_VIDEO_DIR/$SKIN_NAME.mp4"
echo " ✖ No PNG found for $SKIN_NAME" echo " ✓ Trimmed MP4 moved to $OUT_VIDEO_DIR/"
fi else
echo " ✖ No trimmed MP4 created for $SKIN_NAME"
echo " → Taking thumbnail screenshot..." fi
if ! xvfb-run -a "$DANSER_DIR/danser-cli" \ else
-replay "$THUMBNAIL_REPLAY_PATH" -skip -settings="skinhub" -noupdatecheck -ss 1.3 \ echo " ✖ No MP4 found for $SKIN_NAME"
-out="${SKIN_NAME}_thumb" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then fi
echo " ✖ Thumbnail screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi echo " → Taking screenshot..."
if ! retry xvfb-run -a "$DANSER_DIR/danser-cli" \
if [ -f "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" ]; then -replay "$PANEL_REPLAY_PATH" -skip -settings="skinhub" -noupdatecheck -ss 28 \
mkdir -p "$OUT_THUMBNAIL_DIR" -out="$SKIN_NAME" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
mv "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" "$OUT_THUMBNAIL_DIR/$SKIN_NAME.png" echo " ✖ Screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
echo " ✓ Thumbnail PNG moved to $OUT_THUMBNAIL_DIR/" fi
else
echo " ✖ No thumbnail PNG found for $SKIN_NAME" if [ -f "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" ]; then
fi mkdir -p "$OUT_PNG_DIR"
mv "$DANSER_SCREENSHOT_DIR/$SKIN_NAME.png" "$OUT_PNG_DIR/$SKIN_NAME.png"
INDEX=$((INDEX + 1)) echo " ✓ PNG moved to $OUT_PNG_DIR/"
done else
echo " ✖ No PNG found for $SKIN_NAME"
echo "" fi
echo "[Danser Job Finished — processed $SKIN_COUNT skins]"
echo " → Taking thumbnail screenshot..."
- name: Rename Generated Assets Based on skin.ini if ! retry xvfb-run -a "$DANSER_DIR/danser-cli" \
shell: bash -replay "$THUMBNAIL_REPLAY_PATH" -skip -settings="skinhub" -noupdatecheck -ss 1.3 \
run: | -out="${SKIN_NAME}_thumb" -skin="$SKIN_NAME" >>"$LOGFILE" 2>&1; then
echo "[Asset Renaming Job Started]" echo " ✖ Thumbnail screenshot failed for $SKIN_NAME"; cat "$LOGFILE"; INDEX=$((INDEX+1)); continue
fi
if [ -z "${{ inputs.changed_skins_file }}" ] || [ ! -s "${{ inputs.changed_skins_file }}" ]; then
echo "No skins changed. Skipping asset renaming." if [ -f "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" ]; then
exit 0 mkdir -p "$OUT_THUMBNAIL_DIR"
fi mv "$DANSER_SCREENSHOT_DIR/${SKIN_NAME}_thumb.png" "$OUT_THUMBNAIL_DIR/$SKIN_NAME.png"
echo " ✓ Thumbnail PNG moved to $OUT_THUMBNAIL_DIR/"
# Load skins from JSON else
mapfile -t skins < <(jq -r '.[]' "${{ inputs.changed_skins_file }}") echo " ✖ No thumbnail PNG found for $SKIN_NAME"
[ "${#skins[@]}" -eq 0 ] && { echo "No skins to rename. Exiting."; exit 0; } fi
SKIN_COUNT=${#skins[@]} INDEX=$((INDEX + 1))
INDEX=1 done
sanitize_filename() { echo ""
echo "$1" | \ echo "[Danser Job Finished — processed $SKIN_COUNT skins]"
tr -d '\000-\037' | \
sed -e 's#[\\/:\*\?"<>|]#-#g' | \ - name: Rename Generated Assets Based on skin.ini
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' shell: bash
} run: |
echo "[Asset Renaming Job Started]"
for skin_path in "${skins[@]}"; do
[ -z "$skin_path" ] && continue if [ -z "${{ inputs.changed_skins_file }}" ] || [ ! -s "${{ inputs.changed_skins_file }}" ]; then
SKIN_DIR_NAME="$skin_path" echo "No skins changed. Skipping asset renaming."
SKIN_DIR="$DANSER_SKINS_DIR/$skin_path" exit 0
fi
if [ ! -d "$SKIN_DIR" ]; then
echo "Skipping missing skin directory: $SKIN_DIR" # Load skins from JSON
continue mapfile -t skins < <(jq -r '.[]' "${{ inputs.changed_skins_file }}")
fi [ "${#skins[@]}" -eq 0 ] && { echo "No skins to rename. Exiting."; exit 0; }
echo "Processing skin $INDEX/$SKIN_COUNT: $SKIN_DIR_NAME" SKIN_COUNT=${#skins[@]}
INDEX=1
skin_header="$SKIN_DIR_NAME"
ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n1 || true) sanitize_filename() {
if [ -f "$ini_file" ]; then echo "$1" | \
name_line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true) tr -d '\000-\037' | \
if [ -n "$name_line" ]; then sed -e 's#[\\/:\*\?"<>|]#-#g' | \
val="${name_line#*:}" sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" }
if [ -n "$val" ]; then
sanitized="$(sanitize_filename "$val")" for skin_path in "${skins[@]}"; do
[ -n "$sanitized" ] && skin_header="$sanitized" [ -z "$skin_path" ] && continue
fi SKIN_DIR_NAME="$skin_path"
fi SKIN_DIR="$DANSER_SKINS_DIR/$skin_path"
fi
if [ ! -d "$SKIN_DIR" ]; then
VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_DIR_NAME" echo "Skipping missing skin directory: $SKIN_DIR"
PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_DIR_NAME" continue
THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_DIR_NAME" fi
if [ -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then echo "Processing skin $INDEX/$SKIN_COUNT: $SKIN_DIR_NAME"
mv -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" \
"$VIDEO_DIR/$skin_header.mp4" || true skin_header="$SKIN_DIR_NAME"
echo " ✓ Renamed MP4 to $VIDEO_DIR/$skin_header.mp4" ini_file=$(find "$SKIN_DIR" -maxdepth 1 -iname "skin.ini" | head -n1 || true)
fi if [ -f "$ini_file" ]; then
name_line=$(grep -i '^[[:space:]]*Name:' "$ini_file" | head -n1 || true)
if [ -f "$PNG_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then if [ -n "$name_line" ]; then
mv -f "$PNG_DIR/$SKIN_DIR_NAME.png" \ val="${name_line#*:}"
"$PNG_DIR/$skin_header.png" || true val="$(echo "$val" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
echo " ✓ Renamed PNG to $PNG_DIR/$skin_header.png" if [ -n "$val" ]; then
fi sanitized="$(sanitize_filename "$val")"
[ -n "$sanitized" ] && skin_header="$sanitized"
if [ -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then fi
mv -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" \ fi
"$THUMBNAIL_DIR/$skin_header.png" || true fi
echo " ✓ Renamed thumbnail to $THUMBNAIL_DIR/$skin_header.png"
fi VIDEO_DIR="$REPO_SCREENSHOT_DIR/$SKIN_DIR_NAME"
PNG_DIR="$REPO_RANKING_PANEL_DIR/$SKIN_DIR_NAME"
INDEX=$((INDEX + 1)) THUMBNAIL_DIR="$REPO_THUMBNAIL_DIR/$SKIN_DIR_NAME"
done
if [ -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
echo "" mv -f "$VIDEO_DIR/$SKIN_DIR_NAME.mp4" \
echo "[Asset Renaming Complete — processed $SKIN_COUNT skins]" "$VIDEO_DIR/$skin_header.mp4" || true
echo " ✓ Renamed MP4 to $VIDEO_DIR/$skin_header.mp4"
fi
if [ -f "$PNG_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
mv -f "$PNG_DIR/$SKIN_DIR_NAME.png" \
"$PNG_DIR/$skin_header.png" || true
echo " ✓ Renamed PNG to $PNG_DIR/$skin_header.png"
fi
if [ -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" ] && [ "$SKIN_DIR_NAME" != "$skin_header" ]; then
mv -f "$THUMBNAIL_DIR/$SKIN_DIR_NAME.png" \
"$THUMBNAIL_DIR/$skin_header.png" || true
echo " ✓ Renamed thumbnail to $THUMBNAIL_DIR/$skin_header.png"
fi
INDEX=$((INDEX + 1))
done
echo ""
echo "[Asset Renaming Complete — processed $SKIN_COUNT skins]"