Skip to content

Add Qobuz extension#28942

Open
kud wants to merge 19 commits into
raycast:mainfrom
kud:feat/add-qobuz
Open

Add Qobuz extension#28942
kud wants to merge 19 commits into
raycast:mainfrom
kud:feat/add-qobuz

Conversation

@kud

@kud kud commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Description

Adds a Qobuz extension — search the catalogue, browse your library, control the desktop app, and convert track links between services.

Commands

  • Search — albums, artists, and tracks in a grid, with a type filter; each result opens an in-Raycast detail view (cover, metadata) before any external action.
  • Convert Track Link — copy a Spotify, YouTube Music, or Qobuz track link and convert it to the other services. Forward matches are ISRC-based (exact); the reverse gives an exact Deezer link plus Spotify/YouTube Music search links.
  • Favourites — browse favourite albums, artists, and tracks in a grid.
  • Playlists — cover-art grid; drill into a playlist's tracklist and edit its description.
  • Now Playing — menu-bar command for the Qobuz desktop app, with playback controls and a configurable title length.
  • Playback controls — Play/Pause, Next, Previous, Fast-Forward, Rewind.

Throughout: Open in Qobuz, Open in Browser, and Copy Share Link actions.

Notes

  • Built on the published @kud/qobuz client library.
  • Now Playing reads the Qobuz desktop app's local player state (macOS), since Qobuz doesn't expose itself to the system Now Playing API.
  • Auth: paste a Qobuz token in preferences, or reuse the token stored by the @kud/qobuz CLI's Keychain entry.

Checklist

  • I read the extension guidelines
  • I read the documentation about publishing
  • I ran npm run build and tested this distribution build in Raycast
  • Screenshots fit the metadata guidelines (2000×1250)
  • CHANGELOG.md has an {PR_MERGE_DATE} entry
  • The license is MIT

kud added 2 commits June 22, 2026 14:20
Initial implementation of the Qobuz extension for Raycast.

- Search albums, artists, and tracks with open-in-app, open-in-browser, and copy-link actions
- Now Playing menu-bar command reading Qobuz desktop app state
- Favourites command for albums, artists, and tracks
- Playlists command with track count display
- Playback controls (play/pause, next, previous, fast-forward, rewind) via compiled Swift IOKit media-key helper
- Token-based auth with local credential caching via @kud/qobuz core library
@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Jun 22, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

kud added 11 commits June 22, 2026 15:21
Restructure README with grouped command tables, setup/token setup steps,
now-playing and playback controls notes, and credits section for Raycast Store.
- Add Up Next and History sections to the Now Playing menu bar
- Read player state from defaultPlayerStatePath to resolve queue context
- Inject Play/Pause, Previous, Next controls via sendMediaKey
- Shorten command titles: 'Next Track' → 'Next', 'Previous Track' → 'Previous'
- Reduce polling interval from 1m to 10s for more responsive updates
- Add convert-link command: converts Spotify, YouTube Music, or Qobuz track links to equivalent links on other services via ISRC lookup and Deezer fallback
- Introduce lib/resolve.ts for link resolution logic (Spotify og: scraping, Qobuz API, Deezer ISRC lookup)
- Introduce lib/details.tsx with shared TrackDetail, AlbumDetail, ArtistDetail components and unified action panels (TrackItemActions, AlbumItemActions, ArtistItemActions)
- Migrate search, favourites, and playlists from List to Grid layout
- Add playlist description editing via inline Form push
- Cache track metadata by id in now-playing to reduce repeat API calls; truncate long menu-bar titles at 45 chars
- Halve now-playing refresh interval to 5s; use composite keys for queue/history list items
- Bump @kud/qobuz 0.5.0 → 0.5.4
Bump @kud/qobuz to 0.5.5, add search result filtering by type (albums/artists/tracks), improve playlist track browsing details, and refine UI components.
Expose a `titleLength` preference on the now-playing command so users can control how many characters are shown in the menu bar before truncation. Falls back to 45 when the value is absent or invalid.

Also shows album title (falling back to artist name) as the subtitle in the Favourites and Search track lists.
- Format all source files (convert-link.tsx, favourites.tsx, details.tsx, media-command.ts, resolve.ts, now-playing.tsx, playlists.tsx, search.tsx) via Prettier
- Add .prettierrc ({}) to guard against personal ~/.prettierrc (semi:false) breaking CI
- Update CHANGELOG.md with complete feature documentation
@kud
kud marked this pull request as ready for review June 24, 2026 10:32
@greptile-apps

greptile-apps Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a new Qobuz extension for Raycast, providing catalogue search, library browsing, playback controls via a compiled Swift media-key helper, now-playing menu bar, and a link converter between Spotify, YouTube Music, and Qobuz.

  • Playback control is handled by compiling a Swift binary at runtime (media-keys.ts), content-addressed by a SHA-256 of the source so updates auto-recompile; errors surface via showFailureToast or HUD across all command entry points.
  • Link conversion (resolve.ts) uses ISRC lookup via Deezer as the primary match strategy with a fuzzy token-overlap fallback, and correctly uses track-level deep links for "Open in Browser" and "Copy Qobuz Link" actions.
  • Now Playing reads the Qobuz desktop app's local player state file for queue and history, with a per-track in-memory cache to keep the 5-second menu bar poll cheap; both nextIds and histIds correctly extract numeric trackId values before fetching.

Confidence Score: 4/5

Safe to merge with minor polish; no data-loss or correctness issues were found in the changed code.

A duplicate import in convert-link.tsx and a missing singleQuote entry in .prettierrc are the only real issues. The core logic — ISRC-based link conversion, Swift media-key compilation, queue/history ID extraction, and auth handling — is sound.

.prettierrc should have singleQuote: false added; src/convert-link.tsx has a duplicate @raycast/api import that should be consolidated.

Important Files Changed

Filename Overview
extensions/qobuz/src/convert-link.tsx Link conversion flow; duplicate @raycast/api import should be merged into one statement.
extensions/qobuz/src/now-playing.tsx Menu-bar command reads local player state; history and queue IDs correctly extracted as numbers.
extensions/qobuz/src/lib/resolve.ts ISRC-based Deezer lookup with fuzzy fallback; clean implementation with good entity decoding.
extensions/qobuz/src/lib/media-keys.ts Compiles Swift helper at runtime, content-addressed by SHA-256 to avoid stale binaries.
extensions/qobuz/src/lib/client.ts Auth via preference token or shared Keychain entry; credential caching via Raycast LocalStorage.
extensions/qobuz/src/lib/details.tsx Detail views and action panels for albums, artists, tracks, and playlists; well-organized.
extensions/qobuz/src/search.tsx Grid-based search with type filter; properly throttled and keeps previous data.
extensions/qobuz/src/favourites.tsx Favourite albums, artists, tracks in grid with type switcher; straightforward.
extensions/qobuz/src/playlists.tsx Playlist grid with tracklist drill-down and inline description editor.
extensions/qobuz/.prettierrc Missing explicit singleQuote: false required by extension guidelines.
extensions/qobuz/package.json Well-formed package.json with schema, correct platform, and all dependencies in use.
extensions/qobuz/assets/media-key.swift Sends IOKit media key events with Accessibility trust check; clean and minimal.

Reviews (7): Last reviewed commit: "🐛 fix(qobuz): map history items to trac..." | Re-trigger Greptile

Comment thread extensions/qobuz/src/convert-link.tsx Outdated
Comment thread extensions/qobuz/src/now-playing.tsx Outdated
kud added 2 commits June 24, 2026 12:57
Switch convert-link actions from album URL to track deep link via deepLink.track(), ensuring the correct resource is opened/copied.

Replace silent catch in now-playing media key handler with a HUD message guiding users to grant Accessibility permission.
… printWidth: 120

The compiled Swift helper now hashes the source file and caches the binary
at a content-addressed path, ensuring stale builds don't persist across
extension updates. Also standardises the project to Raycast's Prettier
config (printWidth: 120), triggering a reformat of all source files.
@kud

kud commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

@pernielsentikaer ?

Expand the Credits disclaimer to include trademark attribution and clarify unofficial/unaffiliated status.

Also reorder the Now Playing menu bar items so Next appears before Previous, matching the conventional playback control sequence.
Comment thread extensions/qobuz/src/now-playing.tsx Outdated
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​kud/​qobuz@​0.5.5751008993100

View full report

kud added 2 commits July 5, 2026 11:54
Replace the PNG extension icon with an optimised version (24.8 kB → 15.0 kB) and remove the SVG metadata-only file that wasn't a valid SVG source.
Extract trackId from queue history items to populate the History section,
matching the pattern used for queued and upcoming tracks.
@kud kud closed this Jul 8, 2026
@kud kud reopened this Jul 10, 2026
@kud

kud commented Jul 17, 2026

Copy link
Copy Markdown
Contributor Author

@raycastbot assign @pernielsentikaer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants