audio streaming app plyr.fm

feat: default new uploads to store audio on user's PDS (#1060)

PDS audio uploads were opt-in; flip the default so new uploads go to
the user's PDS automatically. Users who have never toggled the setting
get PDS uploads; users who explicitly disabled it stay opted out.
Falls back to R2-only if the PDS rejects the blob (too large).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

authored by zzstoatzz.io

Claude Opus 4.6 and committed by
GitHub
3b08be09 7054fc42

+4 -4
+2 -2
backend/src/backend/api/tracks/uploads.py
··· 310 311 312 async def _should_upload_pds_blob(db: AsyncSession, user_did: str) -> bool: 313 - """check if PDS audio uploads are enabled for the user.""" 314 result = await db.execute( 315 select(UserPreferences.ui_settings).where(UserPreferences.did == user_did) 316 ) 317 ui_settings = result.scalar_one_or_none() or {} 318 - return bool(ui_settings.get(PDS_AUDIO_UPLOADS_SETTING_KEY)) 319 320 321 async def _transcode_audio(
··· 310 311 312 async def _should_upload_pds_blob(db: AsyncSession, user_did: str) -> bool: 313 + """check if PDS audio uploads are enabled for the user (default: on).""" 314 result = await db.execute( 315 select(UserPreferences.ui_settings).where(UserPreferences.did == user_did) 316 ) 317 ui_settings = result.scalar_one_or_none() or {} 318 + return ui_settings.get(PDS_AUDIO_UPLOADS_SETTING_KEY, True) is not False 319 320 321 async def _transcode_audio(
+2 -2
frontend/src/lib/components/PdsAudioUploadsToggle.svelte
··· 2 import { preferences } from '$lib/preferences.svelte'; 3 import { toast } from '$lib/toast.svelte'; 4 5 - let enabled = $derived(preferences.uiSettings.pds_audio_uploads_enabled ?? false); 6 7 async function handleToggle(event: Event) { 8 const input = event.target as HTMLInputElement; ··· 19 <div class="setting-row"> 20 <div class="setting-info"> 21 <h3>store audio on your pds</h3> 22 - <p>store uploaded audio on your pds (falls back to plyr.fm storage if too large)</p> 23 </div> 24 <label class="toggle-switch"> 25 <input type="checkbox" checked={enabled} onchange={handleToggle} />
··· 2 import { preferences } from '$lib/preferences.svelte'; 3 import { toast } from '$lib/toast.svelte'; 4 5 + let enabled = $derived(preferences.uiSettings.pds_audio_uploads_enabled ?? true); 6 7 async function handleToggle(event: Event) { 8 const input = event.target as HTMLInputElement; ··· 19 <div class="setting-row"> 20 <div class="setting-info"> 21 <h3>store audio on your pds</h3> 22 + <p>new uploads are stored on your pds by default (falls back to plyr.fm storage if too large)</p> 23 </div> 24 <label class="toggle-switch"> 25 <input type="checkbox" checked={enabled} onchange={handleToggle} />