Skip to content

fix(embed): honor is_streamable so inactive artists' tracks don't render - #14571

Merged
dylanjeffers merged 1 commit into
mainfrom
fix/embed-honor-is-streamable
Aug 20, 2026
Merged

fix(embed): honor is_streamable so inactive artists' tracks don't render#14571
dylanjeffers merged 1 commit into
mainfrom
fix/embed-honor-is-streamable

Conversation

@dylanjeffers

Copy link
Copy Markdown
Contributor

Follow-up to #14570, which gated the web and mobile track pages on is_streamable. The embed player is its own app and was missed — it still rendered the full card (title, artist, artwork, play button) for a track whose owner deactivated their own account or was delisted by the trusted notifier.

AudiusProject/api#1023 already made /v1/tracks/{id}/stream 404, so the player couldn't actually play these. It just showed the metadata and then failed silently on press.

Change

Route non-streamable tracks into the existing not-available treatment (the same path a 404 takes), with its own copy rather than reusing the deleted-by-creator string — the same flag covers a self deactivation and a delisted account, and we shouldn't tell listeners the creator removed a track when moderation suppressed it. Wording matches the web tombstone from #14570.

The check is an explicit === false, matching isTrackUnavailable in common: an absent field must not read as unavailable. (The embed depends on @audius/sdk rather than @audius/common, so the helper isn't importable here.)

Verification

Ran against prod data using audius.co/rehoxx/just-for-tonight-wmellark-hoonds (ENxw4), the track from the original report:

card "This track can no longer be streamed on Audius."
compact same
tiny "Track Unavailable"

Both routes covered — hash id (getTrack) and permalink (getBulkTracks). A streamable trending track still renders normally with artwork and play button. vite build, eslint, and jest all pass.

Note

The remaining gap is server-side: /v1/tracks/{id} still returns a signed content-node URL for these tracks, which AudiusProject/api#1024 fixes.

🤖 Generated with Claude Code

apps#14570 gated the web and mobile track pages on `is_streamable`, but the
embed player is its own app and was left rendering the full card - title,
artist, artwork, play button - for a track whose owner deactivated their own
account or was delisted by the trusted notifier. api#1023 made the stream
endpoint 404, so the player was already unable to play these; it just showed
the metadata and then failed silently on press.

Route non-streamable tracks into the existing not-available treatment. The copy
is its own message rather than reusing the deleted-by-creator string: the same
flag covers a self deactivation and a delisted account, and we shouldn't tell
listeners the creator removed a track when moderation suppressed it. Wording
matches the web tombstone from #14570.

The check is an explicit `=== false` because an absent field must not read as
unavailable.

Verified against audius.co/rehoxx/just-for-tonight-wmellark-hoonds in all three
flavors (card, compact, tiny) and both routes (hash id and permalink), with a
streamable track confirmed unaffected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 04609d5

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@dylanjeffers
dylanjeffers merged commit fbe39da into main Aug 20, 2026
3 checks passed
@dylanjeffers
dylanjeffers deleted the fix/embed-honor-is-streamable branch August 20, 2026 19:05
dylanjeffers added a commit that referenced this pull request Sep 9, 2026
The embed player has had **no deploy path since 2026-06-23**. CircleCI
shipped it via `embed-deploy-production-cloudflare`; #14504 deleted
`.circleci` without porting that job, and nothing in `.github/` has
referenced `packages/embed` since. The package README still says
"Deployed via CI".

Caught because #14571 sat merged for four days with the old bundle still
serving on `audius.co/embed`.

## The port

Adds an `embed-deploy` job to `web.yml`. Three deliberate differences
from the CircleCI original:

| | CircleCI | here |
|---|---|---|
| trigger | `release*` branches | `main` |
| gate | none | none (see below) |
| deploy cmd | `npm run deploy:prod` | `npx wrangler@4.54.0 deploy`,
matching the web deploy |

Not behind the `production` gate that web and desktop share. The embed
is a self-contained player with no desktop/S3 half to coordinate with,
and gating it would mean the deploy that just rotted for two months
needs a human every time. Easy to add `needs: [production-gate]` if
you'd rather it wait.

Also adds `packages/embed/**` to the workflow path filters — without it
an embed-only change doesn't trigger this workflow at all, which is why
#14571 ran no CI beyond the security scanners.

## Two fixes it depends on

- **`wrangler.toml` was wrangler-1.x era.** `type = "webpack"` is
silently ignored and `[site] entry-point` is deprecated; both replaced
with a top-level `main`. Verified with `--dry-run` on the pinned 3.30.1
*and* 4.54.0 — clean on both, warnings on neither.
- **`deploy:prod` called `wrangler publish`**, which no longer exists in
wrangler 4. So the manual deploy documented in the README was already
broken on any current wrangler. Now `wrangler deploy --env production`.

The odd-looking build/deploy split is preserved, not fixed: `build:prod`
renames `build/` → `build-production/` and the deploy job renames it
back, because `[site] bucket` points at `./build`. That split across
repo and CI is why `build:prod && deploy:prod` deploys nothing on its
own. Worth collapsing someday; left alone here to keep this a port.

## Verification

Ran the job's exact step sequence locally: `npm run build:prod` →
`workers-site npm i` → `mv build-production build` → `npx
wrangler@4.54.0 deploy --env production --dry-run`. Uploads 57.95 KiB,
zero warnings. Confirmed the built bundle contains #14571's strings, so
this would ship the fix that's currently stuck.

Only thing not verifiable without merging: that
`secrets.CLOUDFLARE_API_TOKEN` (already used by the web deploy in this
same workflow) has access to the `embed` worker.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant