#!/usr/bin/env bash # audiopen-ingest.sh # # Normalises raw AudioPen drops in inbox/raw/ into proper fleeting notes in inbox/. # Adds frontmatter, renames to timestamp-slug format, moves to inbox/. # Idempotent: safe to re-run. Destructive on inbox/raw/ (files are moved, not copied). # # Environment: # COUNCIL_REPO — vault root. Default: /var/mnt/data/projects/council # # Exit status: # 0 = success (even if zero files were processed) # 1 = unexpected error set -euo pipefail REPO="${COUNCIL_REPO:-/var/mnt/data/projects/council}" RAW="$REPO/inbox/raw" OUT="$REPO/inbox" if [ ! -d "$RAW" ]; then echo "audiopen-ingest: raw dir $RAW does not exist; nothing to do." >&2 exit 0 fi mkdir -p "$OUT" shopt -s nullglob count=0 for f in "$RAW"/*.md; do # mtime as ISO-8601 (date -r works on GNU coreutils; Bazzite ships it) captured=$(date -r "$f" -Iseconds) ts=$(date -r "$f" +%Y-%m-%d-%H%M) # Title: first `# ` line, else filename (without extension) title=$(grep -m1 '^# ' "$f" 2>/dev/null | sed 's/^# *//' || true) if [ -z "$title" ]; then title=$(basename "$f" .md) fi # Slugify: lowercase, non-alnum → dash, collapse dashes, trim, cap at 60 slug=$(printf '%s' "$title" | tr '[:upper:]' '[:lower:]' \ | sed 's/[^a-z0-9]/-/g' \ | sed 's/--*/-/g' \ | sed 's/^-*//;s/-*$//' \ | cut -c1-60) [ -z "$slug" ] && slug="untitled" out="$OUT/${ts}_${slug}.md" # If target exists (same timestamp + slug), append a numeric suffix i=2 while [ -e "$out" ]; do out="$OUT/${ts}_${slug}_${i}.md" i=$((i+1)) done # Body: strip the first `# title` line so we regenerate it in the normalised form content=$(awk 'BEGIN{stripped=0} /^# / && !stripped { stripped=1; next } { print }' "$f") { echo "---" echo "type: fleeting" echo "source: audiopen" echo "captured: $captured" echo "slug: $slug" echo "---" echo echo "# $title" echo printf '%s\n' "$content" } > "$out" rm "$f" echo "ingested: $(basename "$f") → $(basename "$out")" count=$((count+1)) done echo "audiopen-ingest: $count file(s) normalised."