Files
motion_sync/sync_motion.sh
T
2026-09-22 18:13:26 +01:00

101 lines
3.5 KiB
Bash

#!/bin/bash
# Ensure log directory exists
mkdir -p /home/$USER/logs
LOG="/home/$USER/logs/motion_sync.log"
LOCKFILE="/tmp/sync_motion.lock"
# Configuration
LOCAL_DIR="/var/lib/motioneye"
RCLONE_TARGET="box:MotionEye"
MAX_SIZE_KB=9437184 # 9 GB in KB for 'du' (9 * 1024 * 1024)
# Keep log file under ~5 MB by trimming it when it gets too large
MAX_LOG_SIZE=$((5 * 1024 * 1024))
if [ -f "$LOG" ] && [ $(stat -f%z "$LOG" 2>/dev/null || stat -c%s "$LOG" 2>/dev/null) -gt $MAX_LOG_SIZE ]; then
tail -n 500 "$LOG" > "${LOG}.tmp" && mv "${LOG}.tmp" "$LOG"
fi
log_msg() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG"
}
exec 200>"$LOCKFILE"
if ! flock -n 200; then
echo "Script is already running. Exiting back to CLI."
exit 1
fi
log_msg "--- Starting Sync & Housekeeping ---"
# ==============================================================================
# 1. REMUX MKV TO MP4
# ==============================================================================
log_msg "Scanning for MKV files to convert for browser playback..."
find "$LOCAL_DIR" -type f -name "*.mkv" | while read -r mkv_file; do
mp4_file="${mkv_file%.mkv}.mp4"
if ffmpeg -y -i "$mkv_file" -c copy -movflags +faststart "$mp4_file" >/dev/null 2>&1; then
log_msg "Successfully remuxed: $(basename "$mkv_file") -> $(basename "$mp4_file")"
rm -f "$mkv_file"
[ -f "${mkv_file}.thumb" ] && mv "${mkv_file}.thumb" "${mp4_file}.thumb"
[ -f "${mkv_file%.mkv}.jpg" ] && mv "${mkv_file%.mkv}.jpg" "${mp4_file%.mkv}.jpg"
else
log_msg "ERROR: Failed to convert $mkv_file"
fi
done
# ==============================================================================
# 2. LOCAL CLEANUP (Batch Trim down to 9GB)
# ==============================================================================
log_msg "--- Starting Local Disk Cleanup Check ---"
CURRENT_SIZE=$(du -s "$LOCAL_DIR" | awk '{print $1}')
log_msg "Current local disk space utilization: ${CURRENT_SIZE} KB"
if [ "$CURRENT_SIZE" -gt "$MAX_SIZE_KB" ]; then
BYTES_TO_FREE=$(( (CURRENT_SIZE - MAX_SIZE_KB) * 1024 ))
log_msg "Storage exceeds 9GB. Need to purge ~${BYTES_TO_FREE} bytes..."
# Gather files sorted by age and delete in a single stream pass
FREED=0
DELETED_COUNT=0
while IFS= read -r line; do
FILE_SIZE=$(echo "$line" | awk '{print $1}')
FILE_PATH=$(echo "$line" | cut -d' ' -f2-)
rm -f "$FILE_PATH"
FREED=$((FREED + FILE_SIZE))
((DELETED_COUNT++))
if [ "$FREED" -ge "$BYTES_TO_FREE" ]; then
break
fi
done < <(find "$LOCAL_DIR" -type f \( -name "*.mp4" -o -name "*.thumb" -o -name "*.jpg" \) -printf "%s %p\n" | sort -n)
log_msg "Cleaned up $DELETED_COUNT oldest local file(s)."
fi
# Clean empty date subdirectories
find "$LOCAL_DIR" -mindepth 2 -type d -empty -delete 2>/dev/null
log_msg "--- Finished Local Cleanup Check ---"
# ==============================================================================
# 3. SYNC TO BOX (Reflects local 9GB state & deletes missing remote files)
# ==============================================================================
log_msg "Syncing local storage to Box (purging remote deleted files)..."
rclone sync "$LOCAL_DIR" "$RCLONE_TARGET" \
--include "*.mp4" \
--include "*.jpg" \
--include "*.thumb" \
--transfers 8 \
--checkers 16 \
--fast-list \
-P 2>&1 | tee -a "$LOG"
if [ ${PIPESTATUS[0]} -eq 0 ]; then
log_msg "Rclone sync completed successfully."
else
log_msg "ERROR: Rclone sync encountered errors."
fi
log_msg "--- Finished Sync & Housekeeping ---"