The v1 endpoint (api.tidal.com/v1/artists/{id}/bio) returns 404.
Switch getArtistBiography to the v2 OpenAPI endpoint with
include=biography, extracting the biography from the included
resources in the JSON:API response.
Also restore text and source on JsonApiIncludeAttributes, which
were dropped when the v2 artist fix was reverted in b528720.
- Set crossorigin="anonymous" as a static HTML attribute on audio/video elements
so all users can use createMediaElementSource (required for Web Audio API)
- Remove window.__tidalOriginExtension guards from AudioContext init/changeSource:
binaural DSP, EQ, M/S processing, and audio graph now active for everyone
- Route direct (non-DASH) stream URLs through getProxyUrl in player.js so
non-extension users get CORS headers from the proxy for lossless/MP4 audio
- Proxy preloader src as well so browser cache warms with the proxied URL
- Add idempotency guard in getProxyUrl to prevent double-proxying when Shaka
retries segment requests (proxied URL still contains "tidal.com" in params)
- Extension users: still bypass proxy and get CDN URLs directly (unchanged)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add crossorigin="anonymous" for audio/video elements in extension context only
(required for createMediaElementSource in Web Audio API)
- Restore EQ, binaural DSP, M/S processing, and audio graph wiring for extension users
- Fix recommended tracks showing "Unknown Artist" and no album cover:
- v2 OpenAPI artist endpoint doesn't include track details in `included`,
so now fetches v1 /artists/{id}/toptracks in parallel for complete TidalTrack objects
- v1 tracks carry album.cover UUID and full artist/artists arrays directly
- Fix prepareTrack() to populate artists[] from artist when missing (and vice versa)
- Fix relationship data polymorphism (single ref vs array) in getSimilarArtists/Albums
- Add artistBiographies lookup key for biography included items
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>