- Fix TTS text pipeline: new caps handling (spell out unknown acronyms, lowercase emphasis words), action-word lookahead for parenthetical stripping, abbreviation expansions (US→United States, NM→New Mexico), pronunciation fixes - Inworld TTS: camelCase API fields, speakingRate per-voice overrides, retry logic with exponential backoff (3 attempts) - Footer redesign: SVG icons for social/podcast links across all pages - Stats page: show "Rate us on Spotify" instead of "not public" placeholder - New voices, expanded caller prompts and problem scenarios - Social posting via Postiz, YouTube upload in publish pipeline - Episode transcripts 15-25, terms page, sitemap updates - Fix invoice script: match Timing totals using merged Task+App intervals Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
2.7 KiB
Bash
Executable File
78 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Deploy podcast_stats.py to NAS as a long-running Docker container that updates hourly.
|
|
#
|
|
# Usage: ./deploy_stats_cron.sh
|
|
|
|
set -e
|
|
|
|
NAS_HOST="mmgnas-10g"
|
|
NAS_USER="luke"
|
|
NAS_PORT="8001"
|
|
DOCKER_BIN="/share/CACHEDEV1_DATA/.qpkg/container-station/bin/docker"
|
|
DEPLOY_DIR="/share/CACHEDEV1_DATA/podcast-stats"
|
|
CONTAINER_NAME="podcast-stats"
|
|
|
|
echo "Deploying podcast stats to NAS..."
|
|
|
|
# Create deploy dir and copy files
|
|
ssh -p "$NAS_PORT" "$NAS_USER@$NAS_HOST" "mkdir -p $DEPLOY_DIR"
|
|
scp -P "$NAS_PORT" podcast_stats.py "$NAS_USER@$NAS_HOST:$DEPLOY_DIR/podcast_stats.py"
|
|
|
|
# Create Dockerfile locally, then copy it over (NAS /tmp is tiny)
|
|
TMPFILE=$(mktemp)
|
|
cat > "$TMPFILE" << 'DOCKERFILE'
|
|
FROM python:3.11-slim
|
|
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* \
|
|
&& curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.5.1.tgz | tar xz --strip-components=1 -C /usr/local/bin docker/docker
|
|
RUN pip install --no-cache-dir requests yt-dlp
|
|
COPY podcast_stats.py /app/podcast_stats.py
|
|
COPY run_loop.sh /app/run_loop.sh
|
|
RUN chmod +x /app/run_loop.sh
|
|
WORKDIR /app
|
|
CMD ["/app/run_loop.sh"]
|
|
DOCKERFILE
|
|
scp -P "$NAS_PORT" "$TMPFILE" "$NAS_USER@$NAS_HOST:$DEPLOY_DIR/Dockerfile"
|
|
rm "$TMPFILE"
|
|
|
|
# Create the loop script
|
|
TMPFILE=$(mktemp)
|
|
cat > "$TMPFILE" << 'LOOPSCRIPT'
|
|
#!/bin/sh
|
|
echo "podcast-stats: starting hourly loop"
|
|
while true; do
|
|
echo "$(date -u '+%Y-%m-%dT%H:%M:%SZ') Running stats update..."
|
|
if python podcast_stats.py --json --upload 2>&1; then
|
|
curl -s "https://monitoring.macneilmediagroup.com/api/push/yk9tjJVUGVXhu4zjol2EvpepIlBTfFoD?status=up&msg=OK" > /dev/null
|
|
echo " ...done, heartbeat sent"
|
|
else
|
|
echo " ...failed, will retry next hour"
|
|
fi
|
|
echo "Sleeping 1 hour..."
|
|
sleep 3600
|
|
done
|
|
LOOPSCRIPT
|
|
scp -P "$NAS_PORT" "$TMPFILE" "$NAS_USER@$NAS_HOST:$DEPLOY_DIR/run_loop.sh"
|
|
rm "$TMPFILE"
|
|
|
|
echo "Building Docker image on NAS..."
|
|
ssh -p "$NAS_PORT" "$NAS_USER@$NAS_HOST" \
|
|
"TMPDIR=$DEPLOY_DIR $DOCKER_BIN build -t $CONTAINER_NAME $DEPLOY_DIR"
|
|
|
|
# Stop old container if running
|
|
ssh -p "$NAS_PORT" "$NAS_USER@$NAS_HOST" \
|
|
"$DOCKER_BIN rm -f $CONTAINER_NAME 2>/dev/null || true"
|
|
|
|
# Run as a daemon with auto-restart (survives reboots)
|
|
echo "Starting container..."
|
|
ssh -p "$NAS_PORT" "$NAS_USER@$NAS_HOST" \
|
|
"$DOCKER_BIN run -d --name $CONTAINER_NAME --restart unless-stopped --network host -v /var/run/docker.sock:/var/run/docker.sock $CONTAINER_NAME"
|
|
|
|
echo "Verifying..."
|
|
sleep 3
|
|
ssh -p "$NAS_PORT" "$NAS_USER@$NAS_HOST" \
|
|
"$DOCKER_BIN logs $CONTAINER_NAME 2>&1 | tail -5"
|
|
|
|
echo ""
|
|
echo "Done! Container runs hourly in a loop with --restart unless-stopped."
|
|
echo " Logs: ssh -p $NAS_PORT $NAS_USER@$NAS_HOST '$DOCKER_BIN logs -f $CONTAINER_NAME'"
|