You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to #442 (slice 2). The manual-mp4 per-track Canvas shipped in #467 (core-only). This issue tracks the automatic sourcing path: a plugin that resolves the current track to a directly-playable loop and hands it to the existing Canvas pipeline — no manual drop.
A viable source exists: Spotify Canvas
Spotify serves Canvas clips as directly-playable mp4 from its CDN (https://canvaz.scdn.co/.../<hash>.cnvs.mp4) — no HLS, so it plays in the desktop webview via <video src> exactly like the manual Canvas and the Apple Motion Artwork overlay.
Resolution flow (reference: two local GPL-3.0 projects — a Python original and a clean Rust rewrite, spotify-canvas-downloader-rs v0.2.0, GET /api/canvas/{track_id} → {canvas_url}):
A Spotify track ID (22 chars) is turned into an access token derived from a logged-in session's sp_dc cookie (TOTP token dance — totp-rs).
The private Canvas API (spclient.wg.spotify.com/canvaz-cache/) returns a protobuf pointing at the .cnvs.mp4 on canvaz.scdn.co.
The core loops the mp4 through the existing CanvasStage / MotionCoverOverlay plumbing — slice 1 already proves the rendering works.
Why this stays a separate, non-signed plugin repo (not the core)
Same line #442 drew for YouTube. Spotify does not publish a Canvas API; this relies on private endpoints, and the token endpoint's own terms state its use is not permitted under Spotify's Developer Terms/Policy (quoted verbatim in the RS project's README). So:
License is fine (both reference projects are GPL-3.0-only, matching WaveFlow) — the constraint is Spotify's ToS, not code licensing.
Open problems (all real, none blocking-forever)
Per-user sp_dc cookie. Only works for users with a Spotify account willing to paste their cookie; it's their account carrying the risk. Needs a plugin-options field + clear consent copy.
Local track → Spotify track ID matching. Local files have no Spotify ID; the plugin must search by artist+title (or ISRC when present) first, then fetch the Canvas. Fuzzy, may mismatch.
Private API fragility. Can break without notice; the plugin must fail soft (fall back to motion cover → slideshow → static cover, the existing precedence).
Goal
Follow-up to #442 (slice 2). The manual-mp4 per-track Canvas shipped in #467 (core-only). This issue tracks the automatic sourcing path: a plugin that resolves the current track to a directly-playable loop and hands it to the existing Canvas pipeline — no manual drop.
A viable source exists: Spotify Canvas
Spotify serves Canvas clips as directly-playable mp4 from its CDN (
https://canvaz.scdn.co/.../<hash>.cnvs.mp4) — no HLS, so it plays in the desktop webview via<video src>exactly like the manual Canvas and the Apple Motion Artwork overlay.Resolution flow (reference: two local GPL-3.0 projects — a Python original and a clean Rust rewrite,
spotify-canvas-downloader-rsv0.2.0,GET /api/canvas/{track_id}→{canvas_url}):sp_dccookie (TOTP token dance —totp-rs).spclient.wg.spotify.com/canvaz-cache/) returns a protobuf pointing at the.cnvs.mp4oncanvaz.scdn.co.CanvasStage/MotionCoverOverlayplumbing — slice 1 already proves the rendering works.Why this stays a separate, non-signed plugin repo (not the core)
Same line #442 drew for YouTube. Spotify does not publish a Canvas API; this relies on private endpoints, and the token endpoint's own terms state its use is not permitted under Spotify's Developer Terms/Policy (quoted verbatim in the RS project's README). So:
Open problems (all real, none blocking-forever)
sp_dccookie. Only works for users with a Spotify account willing to paste their cookie; it's their account carrying the risk. Needs a plugin-options field + clear consent copy.Prerequisites (blocked)
plugin.wasmCI-rebuild prerequisite — same brick every plugin slice waits on.waveflow:host/*can carry thesp_dctoken flow, or extend it.Related
waveflow:ui/v1).spotify-canvas-downloader(Python, GPL-3.0) +spotify-canvas-downloader-rs(Rust, GPL-3.0-only).