From a8452f90dfd1764408f4e2fe8772a6976e6befd9 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Sat, 6 Jun 2026 11:20:15 +0200 Subject: [PATCH] Add AirPlay button, update build script to 1.7.0 - AirPlay button in player (WebKit AirPlay API + Remote Playback fallback) - x-webkit-airplay=allow on audio element - build-and-push.sh synced from shared master (1.2.0 -> 1.7.0) - .gitignore for .files/, apple-touch-icon.png Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 1 + build-and-push.sh | 272 +++++++++++++++++- containers/sleep-meditation/site/app.js | 24 ++ .../site/apple-touch-icon.png | Bin 0 -> 26378 bytes containers/sleep-meditation/site/index.html | 10 +- containers/sleep-meditation/site/styles.css | 12 + docs/changelog-develop.md | 7 + 7 files changed, 312 insertions(+), 14 deletions(-) create mode 100644 .gitignore create mode 100644 containers/sleep-meditation/site/apple-touch-icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..425e52f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.files/ diff --git a/build-and-push.sh b/build-and-push.sh index 6b4be0e..130102f 100755 --- a/build-and-push.sh +++ b/build-and-push.sh @@ -6,12 +6,24 @@ set -euo pipefail # # Purpose: # - Build & push Docker images for each service under ./containers/* +# - Branch model: `main` is permanent and tracked by the prod stack +# (image `:latest`). `dev` is a short-lived branch tracked by the dev +# stack (image `:dev`); it is recreated from `main` at the start of each +# cycle and deleted after each release. Tags `vX.Y.Z` cover rollback — +# no `release/` snapshot branches. # - Two modes: -# t (test) = only push :dev -# r (release) = push :, :dev, :latest -# version is read from the top of changelog.md -# -# No git operations: committing and tagging is done manually. +# t (test) = build & push :dev. Switches to (or creates) the `dev` +# branch from `main` if not already on it, commits any +# pending changes, and pushes `dev` to origin so the dev +# stack picks up the matching compose/config alongside +# the :dev image. +# r (release) = MUST be run from `main`. Build & push :, +# :dev, :latest. Fast-forwards `main` against +# `origin/main`, merges `dev` into `main` if it exists +# (local or remote), creates a `Release vX.Y.Z` commit, +# tags it, pushes `main` and the tag, and deletes the +# `dev` branch locally and on origin. Version is read +# from the top of changelog.md. # # Usage: # ./build-and-push.sh [mode] @@ -25,14 +37,112 @@ set -euo pipefail # ## vX.Y.Z — YYYY-MM-DD # (the version is parsed from the first such line) # - One Dockerfile per service under ./containers//Dockerfile +# +# ---------------------------------------------------------------------------- +# Self-update notice (for humans AND for Claude): +# +# The canonical/master copy of this script lives at: +# /docker/develop/shared-integrations/tooling/docker-build-and-push/build-and-push.sh +# +# When this script is copied into a project repo, it may drift from master. +# On startup the script compares its own SCRIPT_VERSION to the master copy and +# warns if a newer version exists. It does NOT auto-overwrite (too risky during +# a release run). +# +# CLAUDE INSTRUCTION: +# If you (Claude) are about to invoke this script in a project repo, first +# check whether the master copy at the path above is newer (different +# SCRIPT_VERSION or differing file contents). If so, copy the master over +# the local copy BEFORE running, then proceed. Mention the update to the user. # ============================================================================ +SCRIPT_VERSION="1.7.0" +SCRIPT_MASTER_PATH="/docker/develop/shared-integrations/tooling/docker-build-and-push/build-and-push.sh" + DOCKER_REGISTRY="gitea.oskamp.info" DOCKER_NAMESPACE="ivooskamp" CHANGELOG_FILE="docs/changelog.md" CONTAINERS_DIR="containers" +# --- Self-update check ------------------------------------------------------- +# Compare this script to the canonical master copy. If it differs, offer to +# copy master over the local copy and re-exec with the same arguments so the +# build runs against the up-to-date script. +# +# Skip with: SKIP_SELF_UPDATE=1 ./build-and-push.sh ... +self_update_check() { + if [[ "${SKIP_SELF_UPDATE:-0}" == "1" ]]; then + return 0 + fi + + local self_path="${BASH_SOURCE[0]}" + # Resolve to absolute path so a comparison against itself is detected. + local self_abs + self_abs="$(cd "$(dirname "$self_path")" 2>/dev/null && pwd)/$(basename "$self_path")" || self_abs="$self_path" + + if [[ "$self_abs" == "$SCRIPT_MASTER_PATH" ]]; then + return 0 # We ARE the master copy. + fi + if [[ ! -f "$SCRIPT_MASTER_PATH" ]]; then + return 0 # Master not reachable from this host; silently skip. + fi + + local master_version reason="" + master_version="$(grep -m1 -E '^SCRIPT_VERSION=' "$SCRIPT_MASTER_PATH" | sed -E 's/.*"([^"]+)".*/\1/')" + + if [[ -n "$master_version" && "$master_version" != "$SCRIPT_VERSION" ]]; then + reason="version" + elif ! cmp -s "$self_abs" "$SCRIPT_MASTER_PATH"; then + reason="contents" + else + return 0 # Identical to master. + fi + + echo "[WARN] Local build-and-push.sh differs from master." + if [[ "$reason" == "version" ]]; then + echo " local : $SCRIPT_VERSION" + echo " master : $master_version ($SCRIPT_MASTER_PATH)" + else + echo " Same SCRIPT_VERSION ($SCRIPT_VERSION) but file contents differ." + echo " master : $SCRIPT_MASTER_PATH" + fi + + # Prompt only when stdin is a TTY; in non-interactive runs, abort safely so + # an unattended release never silently runs against a stale script. + if [[ ! -t 0 ]]; then + echo "[ERROR] Non-interactive shell — refusing to auto-update." + echo " Re-run interactively, or set SKIP_SELF_UPDATE=1 to bypass," + echo " or update manually: cp \"$SCRIPT_MASTER_PATH\" \"$self_abs\"" + exit 1 + fi + + local reply + read -r -p "Update local script from master and re-run? [Y/n] " reply + reply="${reply:-Y}" + if [[ ! "$reply" =~ ^[Yy]$ ]]; then + echo "[INFO] Continuing with local version $SCRIPT_VERSION (not updated)." + echo "" + return 0 + fi + + if ! cp "$SCRIPT_MASTER_PATH" "$self_abs"; then + echo "[ERROR] Failed to copy master to $self_abs (read-only filesystem?)." + echo " Continuing with local version $SCRIPT_VERSION." + echo "" + return 0 + fi + chmod +x "$self_abs" 2>/dev/null || true + + echo "[INFO] Updated $self_abs from master. Re-executing..." + echo "" + # Re-exec with original arguments. SKIP_SELF_UPDATE=1 prevents an + # update loop if cp somehow didn't take. + export SKIP_SELF_UPDATE=1 + exec "$self_abs" "$@" +} +self_update_check "$@" + # --- Input: prompt if missing ------------------------------------------------ MODE="${1:-}" if [[ -z "${MODE}" ]]; then @@ -141,19 +251,86 @@ else echo "[INFO] Repo: $(pwd) (not a git checkout)" fi -# --- Determine version (release only) ---------------------------------------- +# --- Release preflight (BEFORE any docker work) ------------------------------ +# All git-side validation for a release happens here so a wrong-branch / dirty +# tree / stale main / conflicting dev / pre-existing tag aborts the run before +# anything is built or pushed to the registry. dev is merged into main now so +# the version we read from changelog.md reflects the merged state, not main's +# pre-merge state. VERSION="" +DEV_MERGED=0 if [[ "$MODE" == "r" ]]; then + if [[ ! -d ".git" ]]; then + echo "[ERROR] Release mode requires a git checkout." + exit 1 + fi + + CURRENT_BRANCH="$(git symbolic-ref --short -q HEAD || echo)" + if [[ "$CURRENT_BRANCH" != "main" ]]; then + echo "[ERROR] Release build must run from 'main' branch. Current: ${CURRENT_BRANCH:-}." + echo " Switch with: git checkout main" + exit 1 + fi + + if ! git diff --quiet HEAD -- || ! git diff --cached --quiet; then + echo "[ERROR] Working tree has uncommitted changes. Commit or stash them on the appropriate branch before releasing." + git status --short + exit 1 + fi + + echo "[INFO] Fetching origin..." + git fetch origin main + if git ls-remote --exit-code --heads origin dev >/dev/null 2>&1; then + git fetch origin dev + fi + + if ! git merge --ff-only origin/main 2>/dev/null; then + echo "[ERROR] Local main has diverged from origin/main. Resolve manually before releasing." + exit 1 + fi + + # Merge dev into main BEFORE reading the version, so changelog.md reflects + # the bumped state that dev brings in. + if git show-ref --verify --quiet refs/heads/dev; then + echo "[INFO] Merging local dev into main..." + if ! git merge --no-ff dev -m "Release (merge dev)"; then + echo "[ERROR] Merge of dev into main failed (conflict). Resolve manually and re-run." + exit 1 + fi + DEV_MERGED=1 + elif git ls-remote --exit-code --heads origin dev >/dev/null 2>&1; then + echo "[INFO] Fetching and merging origin/dev into main..." + git fetch origin dev:dev + if ! git merge --no-ff dev -m "Release (merge dev)"; then + echo "[ERROR] Merge of dev into main failed (conflict). Resolve manually and re-run." + exit 1 + fi + DEV_MERGED=1 + else + echo "[INFO] No dev branch found — releasing main as-is." + fi + VERSION="$(read_version_from_changelog)" - echo "[INFO] Release version (from $CHANGELOG_FILE): $VERSION" + echo "[INFO] Release version (from $CHANGELOG_FILE, post-merge): $VERSION" validate_tag "$VERSION" validate_tag "latest" + # Tag collision = abort. A re-release of an existing version with different + # content would silently move what consumers think v0.X.Y points to. + if git rev-parse -q --verify "refs/tags/${VERSION}" >/dev/null; then + echo "[ERROR] Tag ${VERSION} already exists locally. Bump $CHANGELOG_FILE to a new version before releasing." + exit 1 + fi + if git ls-remote --exit-code --tags origin "refs/tags/${VERSION}" >/dev/null 2>&1; then + echo "[ERROR] Tag ${VERSION} already exists on origin. Bump $CHANGELOG_FILE to a new version before releasing." + exit 1 + fi + # Ask for confirmation so you never accidentally re-push an old version or a wrong one. read -r -p "Proceed building & pushing as ${VERSION}? [y/N] " CONFIRM CONFIRM="${CONFIRM:-N}" if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then - echo "[INFO] Aborted by user." + echo "[INFO] Aborted by user. Note: dev has been merged into local main; reset with 'git reset --hard origin/main' if you want to undo." exit 0 fi else @@ -227,10 +404,79 @@ for img in "${BUILT_IMAGES[@]}"; do done echo "============================================================" echo "" -echo "[REMINDER] No git operations were performed. If this was a release," -echo " commit and tag manually, e.g.:" + +# --- Git: release commit + tag + push (release mode only) ------------------- +# Preflight (branch, clean tree, ff origin/main, dev merge, tag collision, +# version parse) already ran BEFORE the build. dev is already merged into +# local main. We only need to land the Release commit, tag, and push. if [[ "$MODE" == "r" ]]; then - echo " git add -A && git commit -m \"Release ${VERSION}\"" - echo " git tag -a ${VERSION} -m \"Release ${VERSION}\"" - echo " git push && git push --tags" + echo "[INFO] Finalising release: version=${VERSION}" + + # Produce a clean Release commit at the tip. Preflight guarantees the working + # tree was clean at start; any post-build artefacts would be unexpected, so + # commit with --allow-empty to keep the release marker isolated. + if git diff --quiet HEAD -- && git diff --cached --quiet; then + git commit --allow-empty -m "Release ${VERSION}" + else + echo "[WARN] Working tree changed during the build — staging and including in release commit." + git add -A + git commit -m "Release ${VERSION}" + fi + + git tag -a "${VERSION}" -m "Release ${VERSION}" + + # Push main first (triggers prod webhook), then the tag. + git push origin main + git push origin "refs/tags/${VERSION}" + echo "[INFO] Pushed main and tag ${VERSION} to origin." + + # Clean up dev branch — local and remote. + if [[ "$DEV_MERGED" == "1" ]]; then + if git show-ref --verify --quiet refs/heads/dev; then + git branch -D dev + echo "[INFO] Deleted local dev branch." + fi + if git ls-remote --exit-code --heads origin dev >/dev/null 2>&1; then + git push origin --delete dev + echo "[INFO] Deleted remote dev branch." + fi + fi +fi + +# --- Git: dev branch commit + push (test mode only) ------------------------- +if [[ "$MODE" == "t" ]]; then + if [[ ! -d ".git" ]]; then + echo "[WARN] Not a git checkout — skipping dev branch commit/push." + exit 0 + fi + + CURRENT_BRANCH="$(git symbolic-ref --short -q HEAD || echo)" + + # Ensure we are on the dev branch. Create it if needed. + if [[ "$CURRENT_BRANCH" != "dev" ]]; then + if git show-ref --verify --quiet refs/heads/dev; then + echo "[INFO] Switching to existing local dev branch." + git checkout dev + elif git ls-remote --exit-code --heads origin dev >/dev/null 2>&1; then + echo "[INFO] Checking out remote dev branch." + git fetch origin dev + git checkout -b dev origin/dev + else + echo "[INFO] Creating new dev branch from main." + git fetch origin main + git checkout -b dev origin/main + fi + fi + + # Stage and commit if there are changes. + git add -A + if git diff --cached --quiet; then + echo "[INFO] Working tree clean — pushing current HEAD to dev." + else + git commit -m "Dev build $(date '+%Y-%m-%d %H:%M')" + fi + + # Non-force push. Diverged origin/dev fails hard — resolve manually. + git push -u origin dev + echo "[INFO] Pushed dev to origin." fi diff --git a/containers/sleep-meditation/site/app.js b/containers/sleep-meditation/site/app.js index da92ddf..0a1944b 100644 --- a/containers/sleep-meditation/site/app.js +++ b/containers/sleep-meditation/site/app.js @@ -127,6 +127,30 @@ if ("mediaSession" in navigator) { navigator.mediaSession.setActionHandler("nexttrack", () => setTrack(currentIndex + 1, true)); } +// ── AirPlay / Remote Playback ───────────────────────────────────────────────── +const airplayBtn = document.querySelector("#airplay"); + +function initAirplay() { + if (!airplayBtn) return; + if (window.WebKitPlaybackTargetAvailabilityEvent) { + // Safari (iOS/macOS): native AirPlay picker + player.addEventListener("webkitplaybacktargetavailabilitychanged", (e) => { + airplayBtn.hidden = e.availability !== "available"; + }); + player.addEventListener("webkitcurrentplaybacktargetiswirelesschanged", () => { + airplayBtn.classList.toggle("airplay-active", player.webkitCurrentPlaybackTargetIsWireless); + }); + airplayBtn.addEventListener("click", () => player.webkitShowPlaybackTargetPicker()); + } else if (player.remote && player.remote.watchAvailability) { + // Remote Playback API (Chrome/Edge) + player.remote.watchAvailability(available => { airplayBtn.hidden = !available; }).catch(() => {}); + player.remote.addEventListener("connect", () => airplayBtn.classList.add("airplay-active")); + player.remote.addEventListener("disconnect", () => airplayBtn.classList.remove("airplay-active")); + airplayBtn.addEventListener("click", () => player.remote.prompt().catch(() => {})); + } +} +initAirplay(); + // ── Download list (main page) ───────────────────────────────────────────────── async function loadDownloadList() { const tracks = await fetchDownloads(); diff --git a/containers/sleep-meditation/site/apple-touch-icon.png b/containers/sleep-meditation/site/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..88142d7e90dda7fa5af3e3bf0c6eb8d52dc4d719 GIT binary patch literal 26378 zcmV)rK$*XZP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/containers/sleep-meditation/site/index.html b/containers/sleep-meditation/site/index.html index a6a4a87..c821ec4 100644 --- a/containers/sleep-meditation/site/index.html +++ b/containers/sleep-meditation/site/index.html @@ -7,6 +7,7 @@ Sleep Meditation + @@ -25,7 +26,7 @@ -