#!/bin/bash BASE_DIR="/files" CURRENT_DIR="$BASE_DIR/current" mkdir -p "$CURRENT_DIR" # Store last SHA256 checksums and last update timestamps for each camera declare -A LAST_SHA declare -A LAST_UPDATE # How long to wait before deleting stale images (in seconds) STALE_TIMEOUT=$((15 * 60)) echo "[Watcher] Starting to monitor subfolders in $BASE_DIR ..." while true; do NOW=$(date +%s) for CAM_DIR in "$BASE_DIR"/msvcam*; do [ -d "$CAM_DIR" ] || continue CAM_NAME=$(basename "$CAM_DIR") OUT_FILE="$CURRENT_DIR/${CAM_NAME}.avif" # Find the newest image NEWEST_FILE=$(find "$CAM_DIR" -type f \ \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.bmp" -o -iname "*.tif" -o -iname "*.tiff" \) \ -printf "%T@ %p\n" 2>/dev/null | sort -n | tail -1 | awk '{print $2}') if [ -n "$NEWEST_FILE" ]; then # Calculate SHA256 of the newest image SHA=$(sha256sum "$NEWEST_FILE" | awk '{print $1}') # Check if this file has already been converted if [ "${LAST_SHA[$CAM_NAME]}" != "$SHA" ]; then echo "[Watcher] New or changed file detected for $CAM_NAME: $NEWEST_FILE" if avifenc "$NEWEST_FILE" "$OUT_FILE"; then sync LAST_SHA[$CAM_NAME]="$SHA" LAST_UPDATE[$CAM_NAME]=$NOW echo "[Watcher] Conversion successful: $OUT_FILE" else echo "[Watcher][ERROR] Conversion failed for $NEWEST_FILE" fi else echo "[Watcher] No change detected for $CAM_NAME, skipping conversion." fi fi # Check for staleness if [ -n "${LAST_UPDATE[$CAM_NAME]}" ]; then ELAPSED=$((NOW - LAST_UPDATE[$CAM_NAME])) if [ $ELAPSED -ge $STALE_TIMEOUT ]; then if [ -f "$OUT_FILE" ]; then echo "[Watcher] No new image for $CAM_NAME in $((STALE_TIMEOUT/60)) minutes. Removing $OUT_FILE" rm -f "$OUT_FILE" fi fi fi done # Sleep before next check SLEEP_INTERVAL="${SLEEP_INTERVAL:-5}" sleep "$SLEEP_INTERVAL" done