feat: store audio blobs on user's PDS for data ownership (#823)
* feat: store audio blobs on user's PDS for data ownership
embraces ATProto's data ownership model by uploading audio to the user's
PDS while keeping R2 copies for CDN streaming performance.
- upload audio blob to PDS during track creation (non-gated only)
- store BlobRef in track record with ref, mimeType, size
- add migration endpoint POST /tracks/{id}/migrate-to-pds
- track audio_storage ("r2" | "pds" | "both"), pds_blob_cid, pds_blob_size
- handle PayloadTooLargeError gracefully (fall back to R2-only)
- add frontend indicator for PDS-stored tracks
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor: move imports to module level
imports were unnecessarily deferred inside migrate_track_to_pds function.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: resolve type warning in search result iteration
ArtistSearchResult doesn't have an `id` field, so use getattr for safe access.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(frontend): add PDS indicator to track detail page
show PDS storage status in track-stats section, consistent with TrackItem.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: update STATUS.md with PDS blob storage
- add PR #823 to recent work with implementation details
- note fast follow needed: UI for migrating existing tracks
- note: verify via staging integration tests after merge
- update current focus and what's working sections
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
authored by
zzstoatzz.io