Post-v1 features: offline, radio, plugin API, registry, media controls, social, Windows/macOS, track matching #13
Labels
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
SBDeveloper/medley#13
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem Statement
v1 plays Deezer and local files, but it stops at the basics. The user cannot listen without a network, music stops when the Queue runs out, Plugins only ship with the app, desktop media controls and social features are missing, and the same song from different Sources shows up as unrelated Tracks. Windows/macOS users risk losing the official Deezer app's
deezer://handling. These were decided during the initial design session and deferred from v1.Solution
Deliver the deferred features as one umbrella, in dependency order:
deezer://only when the user opts in.Status and delivery order
Re-ordered together with the UI rework (#32), because the rework gives the remaining features their home in the UI. Order: headless core (#34, #17, #39, #29) → UI shell (#36, #40, #41, #42, #43, #44) → plugins (#18–#21, #45, #27, #25, #26, #22) → Windows/macOS (#28) and fuzzy matching (#30).
Remaining: none.
UI rework and its slices: #32.
User Stories
Offline Tracks
Radio
12. As a listener, I want playback to continue when the Queue runs out, so that music does not stop.
13. As a listener, I want an autoplay toggle, so that I can turn Radio off.
14. As a listener, I want Radio seeded by the last played Track or chosen seed, so that it matches my taste.
15. As a listener, I want Radio Tracks to come from the Source of the seed (e.g. Deezer Flow), so that continuation is relevant.
16. As a listener, I want Radio Tracks to be visible in the Queue, so that I can skip or remove them.
17. As a listener, I want Radio to stop gracefully if the Source has no continuation or is offline, so that playback ends cleanly.
18. As a Plugin author, I want an optional continuation capability on a Source, so that Sources without Radio simply do not append anything.
Public plugin API
19. As a user, I want to install a Plugin from a .zip file, so that I can try third-party extensions.
20. As a user, I want to install a Plugin from a URL, so that I do not need to download it by hand.
21. As a user, I want to see the capabilities a Plugin requests (Sources, playback events, UI views, DSP) before install and consent, so that I know what it can do.
22. As a user, I want install to fail clearly on an invalid manifest, missing wasm or bad archive, so that I can fix the problem.
23. As a user, I want to enable, disable and uninstall Plugins, so that I stay in control.
24. As a user, I want a Plugin to be denied any capability I did not consent to, so that consent is meaningful.
25. As a user, I want secrets like the ARL never to leave the Plugin that owns them, so that other Plugins cannot read my login.
26. As a Plugin author, I want a documented manifest (wasm plus optional UI bundle), so that I can package my Plugin.
27. As a Plugin author, I want to add a Source, react to playback events, add UI views and process audio, so that I can extend every part of the player.
28. As a Plugin author, I want bundled Deezer and local-files Plugins to use the same API, so that the contract is proven.
29. As a user, I want a misbehaving Plugin to be isolated, so that it cannot crash the player.
Plugin registry
30. As a user, I want to browse a curated index of Plugins, so that I can discover them safely.
31. As a user, I want to install from the registry with one action using the same consent flow, so that registry and manual install behave the same.
32. As a user, I want to see available updates, so that I keep Plugins current.
33. As a maintainer, I want the index to be a curated list, so that I control what is offered.
MPRIS / media keys / notifications
34. As a Linux user, I want the desktop to show now-playing metadata and artwork over MPRIS, so that my panel and lock screen show it.
35. As a user, I want media keys (play/pause, next, previous, stop) to control the player, so that I do not need the window.
36. As a user, I want a notification on track change, optionally, so that I know what started playing.
37. As a user, I want the desktop's seek and volume controls to work, so that integrations behave like other players.
Social integrations
38. As a user, I want Discord rich presence of the current Track, so that friends see what I play.
39. As a user, I want scrobbling to a service, so that my history is recorded.
40. As a user, I want lyrics for the current Track, so that I can sing along.
41. As a user, I want each social integration to be optional and off by default, so that nothing is shared without my choice.
42. As a Plugin author, I want these built purely from playback events, so that the same API supports third-party ones.
Windows/macOS
43. As a Windows or macOS user, I want the app to run on my platform, so that I can use it.
44. As a Windows or macOS user, I want claiming
deezer://to be opt-in, so that the official Deezer app keeps working.45. As a Windows or macOS user, I want to be told when another app owns
deezer://, so that I understand why login callbacks go elsewhere.46. As a user, I want the pasted-ARL fallback to work everywhere, so that login works without the protocol handler.
Track matching
47. As a listener, I want the same song from several Sources grouped into one Recording (ISRC first, then user-accepted fuzzy suggestions), so that my Library has no duplicates.
48. As a listener, I want to choose which Source plays a Recording, so that I can prefer local or lossless.
49. As a listener, I want playback to fall back to another Source when the preferred one is unavailable, so that Recordings keep playing.
50. As a listener, I want to un-group wrongly matched Tracks, so that fuzzy matching can be corrected.
51. As a listener, I want matching to be optional, so that the v1 behaviour of separate Tracks remains available.
Implementation Decisions
deezer://is opt-in on those platforms; Linux keeps default claim. Existingdeezer://link handling and pasted-ARL fallback are unchanged.Testing Decisions
Corepublic API and its event stream, never internals such as cache file layout or wasm calls.Coreintegration tests in the core crate, using the fake-source plugin, the fake gw-light server and the test sink from the shared test helpers. No new seams.Out of Scope
Further Notes
docs/post-v1.md, decided during the initial design session. UsesGLOSSARY.mdterms (Track, Source, Library, Plugin, Queue, Radio, Quality cap, Offline Tracks).Verified in code: every item is delivered (#22, #28, #30 closed, code and tests present). Closing.