mirror of
https://github.com/Dispatcharr/Dispatcharr.git
synced 2026-07-25 19:14:00 +00:00
This commit improves the Schedules Direct poster fetching mechanism by implementing a caching strategy for SD program posters using nginx, with a 14-day cache duration. It introduces a cache-busting feature that appends a hash of the SD icon URI to the poster URL, ensuring clients receive updated artwork without stale images. Additionally, the code structure has been refined to separate poster proxy logic into dedicated utility functions, enhancing maintainability. Tests have been added to verify the correct behavior of the new caching and proxy functionalities.
143 lines
5.3 KiB
Bash
143 lines
5.3 KiB
Bash
#!/bin/bash
|
|
|
|
# TEMPORARY: one-time move of the nginx logo proxy cache to the new layout.
|
|
# Removable once installs have had time to upgrade past the /data/cache/ paths.
|
|
if [ -d /data/logo_cache ] && [ ! -e /data/cache/logos ]; then
|
|
mkdir -p /data/cache
|
|
if mv /data/logo_cache /data/cache/logos; then
|
|
echo "Moved nginx logo cache from /data/logo_cache to /data/cache/logos"
|
|
else
|
|
echo "⚠️ Warning: could not move /data/logo_cache to /data/cache/logos"
|
|
fi
|
|
fi
|
|
|
|
# Define directories that need to exist and be owned by PUID:PGID.
|
|
# DATA_DIRS may reside on external mounts (NFS, SMB/CIFS, FUSE) where
|
|
# mkdir and chown can fail. Failures are collected and reported as a
|
|
# single consolidated warning so the container still starts.
|
|
DATA_DIRS=(
|
|
"/data/backups"
|
|
"/data/logos"
|
|
"/data/cache"
|
|
"/data/cache/logos"
|
|
"/data/cache/sd_posters"
|
|
"/data/recordings"
|
|
"/data/uploads/m3us"
|
|
"/data/uploads/epgs"
|
|
"/data/m3us"
|
|
"/data/epgs"
|
|
"/data/plugins"
|
|
"/data/models"
|
|
"/data/scripts"
|
|
)
|
|
|
|
# APP_DIRS live on the image layer and are always locally writable.
|
|
APP_DIRS=(
|
|
"/app/media"
|
|
"/app/static"
|
|
)
|
|
|
|
# Create app directories (image layer — always writable)
|
|
for dir in "${APP_DIRS[@]}"; do
|
|
mkdir -p "$dir"
|
|
done
|
|
|
|
# Create data directories, tolerating failures on external mounts
|
|
_failed_mkdir=()
|
|
_failed_chown=()
|
|
for dir in "${DATA_DIRS[@]}"; do
|
|
_mkdir_err=$(mkdir -p "$dir" 2>&1) || _failed_mkdir+=("$dir ($_mkdir_err)")
|
|
done
|
|
|
|
# Ensure /app itself is owned by PUID:PGID (needed for uwsgi socket creation)
|
|
if [ "$(id -u)" = "0" ] && [ -d "/app" ]; then
|
|
if [ "$(stat -c '%u:%g' /app)" != "$PUID:$PGID" ]; then
|
|
echo "Fixing ownership for /app (non-recursive)"
|
|
chown "$PUID:$PGID" /app
|
|
fi
|
|
fi
|
|
# Configure nginx port
|
|
if ! [[ "$DISPATCHARR_PORT" =~ ^[0-9]+$ ]]; then
|
|
echo "⚠️ Warning: DISPATCHARR_PORT is not a valid integer, using default port 9191"
|
|
DISPATCHARR_PORT=9191
|
|
fi
|
|
sed -i "s/NGINX_PORT/${DISPATCHARR_PORT}/g" /etc/nginx/sites-enabled/default
|
|
|
|
# Configure nginx based on IPv6 availability
|
|
if ip -6 addr show | grep -q "inet6"; then
|
|
echo "✅ IPv6 is available, enabling IPv6 in nginx"
|
|
else
|
|
echo "⚠️ IPv6 not available, disabling IPv6 in nginx"
|
|
sed -i '/listen \[::\]:/d' /etc/nginx/sites-enabled/default
|
|
fi
|
|
|
|
# NOTE: mac doesn't run as root, so only manage permissions
|
|
# if this script is running as root
|
|
if [ "$(id -u)" = "0" ]; then
|
|
# Fix data directories (non-recursive to avoid touching user files).
|
|
# Failures are collected rather than fatal — directories may be on
|
|
# external mounts (NFS, SMB/CIFS, FUSE) that reject chown.
|
|
for dir in "${DATA_DIRS[@]}"; do
|
|
if [ -d "$dir" ] && [ "$(stat -c '%u:%g' "$dir" 2>/dev/null)" != "$PUID:$PGID" ]; then
|
|
_chown_err=$(chown "$PUID:$PGID" "$dir" 2>&1) || {
|
|
_current_owner=$(stat -c '%u:%g' "$dir" 2>/dev/null || echo "unknown")
|
|
_failed_chown+=("$dir (current: $_current_owner, error: $_chown_err)")
|
|
}
|
|
fi
|
|
done
|
|
|
|
# Fix app directories (recursive since they're managed by the app)
|
|
for dir in "${APP_DIRS[@]}"; do
|
|
if [ -d "$dir" ] && [ "$(stat -c '%u:%g' "$dir")" != "$PUID:$PGID" ]; then
|
|
echo "Fixing ownership for $dir (recursive)"
|
|
chown -R "$PUID:$PGID" "$dir"
|
|
fi
|
|
done
|
|
|
|
# /data/db ownership is handled by 02-postgres.sh (sentinel-based reconciliation).
|
|
# No secondary check needed here — duplicating it could chown without updating
|
|
# the sentinel, creating inconsistent state.
|
|
|
|
# Fix /data directory ownership (non-recursive).
|
|
# Tolerates failure for the same external-mount reasons as DATA_DIRS.
|
|
if [ -d "/data" ] && [ "$(stat -c '%u:%g' /data 2>/dev/null)" != "$PUID:$PGID" ]; then
|
|
_chown_err=$(chown "$PUID:$PGID" /data 2>&1) || {
|
|
_current_owner=$(stat -c '%u:%g' /data 2>/dev/null || echo "unknown")
|
|
_failed_chown+=("/data (current: $_current_owner, error: $_chown_err)")
|
|
}
|
|
fi
|
|
|
|
chmod +x /data 2>/dev/null || true
|
|
fi
|
|
|
|
# Consolidated warning for all mkdir/chown failures.
|
|
# Emitted outside the root guard so non-root mkdir failures are also reported.
|
|
if [ ${#_failed_mkdir[@]} -gt 0 ] || [ ${#_failed_chown[@]} -gt 0 ]; then
|
|
echo ""
|
|
echo "================================================================"
|
|
echo "WARNING: Some data directories could not be created or updated."
|
|
echo " This typically occurs with NFS, SMB/CIFS, or other external"
|
|
echo " mounts that restrict ownership changes."
|
|
echo ""
|
|
if [ ${#_failed_mkdir[@]} -gt 0 ]; then
|
|
echo " Could not create:"
|
|
for entry in "${_failed_mkdir[@]}"; do
|
|
echo " - $entry"
|
|
done
|
|
echo ""
|
|
fi
|
|
if [ ${#_failed_chown[@]} -gt 0 ]; then
|
|
echo " Could not set ownership to $PUID:$PGID:"
|
|
for entry in "${_failed_chown[@]}"; do
|
|
echo " - $entry"
|
|
done
|
|
echo ""
|
|
fi
|
|
echo " To fix, either:"
|
|
echo " 1. Set PUID/PGID to match your mount's owner"
|
|
echo " 2. Fix ownership on the host/NAS:"
|
|
echo " sudo chown $PUID:$PGID <path>"
|
|
echo " 3. For SMB/CIFS: set uid=$PUID,gid=$PGID in mount options"
|
|
echo "================================================================"
|
|
echo ""
|
|
fi
|