Symptom — alert "Something failed" → "Spotify/SoundCloud gave a page this app no longer understands — the scraper needs updating."
Where — Sources/Core/Playlists.swift: spotifyPlaylist(id:sourceURL:), soundcloudSet(url:); surfaced via Coordinator.lastError.
Not a dead scraper — testSpotifyPlaylistFetch (editorial "Today's Top Hits") and testSoundCloudSetFetch (/flume/sets/skin) both pass on device. This is a coverage gap:
- Spotify — parser keys on a
trackList array in the embed __NEXT_DATA__; likely a different shape for user-created playlists. spotify.link short URLs, /album/, /track/ unhandled (only /playlist/).
- SoundCloud — only
/sets/ resolve to an object with a tracks array. Track URLs, likes pages, user profiles → parseFailed.
Fix direction — follow redirects for short links; accept album/track/user URLs; tolerate alternate JSON shapes; error should name what's unsupported.
From verse-inbox.md.
Symptom — alert "Something failed" → "Spotify/SoundCloud gave a page this app no longer understands — the scraper needs updating."
Where —
Sources/Core/Playlists.swift:spotifyPlaylist(id:sourceURL:),soundcloudSet(url:); surfaced viaCoordinator.lastError.Not a dead scraper —
testSpotifyPlaylistFetch(editorial "Today's Top Hits") andtestSoundCloudSetFetch(/flume/sets/skin) both pass on device. This is a coverage gap:trackListarray in the embed__NEXT_DATA__; likely a different shape for user-created playlists.spotify.linkshort URLs,/album/,/track/unhandled (only/playlist/)./sets/resolve to an object with atracksarray. Track URLs, likes pages, user profiles →parseFailed.Fix direction — follow redirects for short links; accept album/track/user URLs; tolerate alternate JSON shapes; error should name what's unsupported.
From
verse-inbox.md.