No description
  • Shell 50.6%
  • Python 49.4%
Find a file
aaronjan a3af901ae6 sync.command: only notify success + eject when the sync actually succeeded
Previously it always showed 'Sync complete' and ejected even on failure (e.g.
the TCC EPERM when run as a background launchd agent). Now a failure shows a
FAILED notification and leaves the volume mounted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 10:46:40 -07:00
mac-sync-kit sync.command: only notify success + eject when the sync actually succeeded 2026-06-17 10:46:40 -07:00
.gitignore Add macOS sync kit; slim BUILD.md to distfiles-based reference 2026-06-16 19:18:18 -07:00
BUILD.md Add macOS sync kit; slim BUILD.md to distfiles-based reference 2026-06-16 19:18:18 -07:00
CONTEXT.md add ipod-dap-sync: Subsonic playlist -> Rockbox iPod sync tool + all-Linux build guide 2026-06-16 15:04:04 -07:00
ipod-sync.py Send a browser User-Agent (Cloudflare 403/1010 fix) 2026-06-17 10:33:52 -07:00
make-kit.sh Add macOS sync kit; slim BUILD.md to distfiles-based reference 2026-06-16 19:18:18 -07:00
README.md add ipod-dap-sync: Subsonic playlist -> Rockbox iPod sync tool + all-Linux build guide 2026-06-16 15:04:04 -07:00

ipod-dap-sync

Sync a Navidrome/Subsonic playlist onto a Rockbox iPod over USB. The iPod's /Music is made to match the playlist exactly (downloads new tracks, deletes removed ones), and a Rockbox .m3u8 is written. Pure-stdlib Python — no deps.

Usage

# 1. stash the Navidrome password privately (chmod 600) — NOT via any logged shell:
read -rs PW && printf '%s' "$PW" > ~/ipod-rockbox/.dj-pass && chmod 600 ~/ipod-rockbox/.dj-pass && unset PW

# 2. mount the iPod's FAT32 partition, then sync:
python3 ipod-sync.py \
  --server http://10.0.50.83:4533 \   # LAN; or https://music.janovitch.com remotely
  --user dj --playlist iPod \
  --mount /run/media/aj/IPOD

# preview the playlist's tracks without downloading:
python3 ipod-sync.py --server ... --user dj --playlist iPod --mount /run/media/aj/IPOD --list

Password resolution: $SUBSONIC_PASSWORD, else --pass-file (default ~/ipod-rockbox/.dj-pass).

⚠️ Never poke the iPod while it's writing

Do not run du/find/ls on the mounted iPod during a sync — the old iPod USB bridge wedges into an unkillable D-state (only a physical unplug recovers it). Watch progress via /proc/<pid>/io (write_bytes) instead.

Notes

  • Sustained multi-file writes through the iPod bridge are slow (~0.5 MB/s) — the first full load is slow; subsequent deltas (a few added/removed tracks) are quick.
  • Paths are sanitized for FAT32 (: / * ? " < > | → _).

TODO

  • macOS .command wrapper + launchd auto-run on iPod plug-in (Dennis's MacBook Air).
  • Completion notification (osascript) + auto-eject → "✅ synced, safe to unplug."