Fix API endpoints: resource IDs in URL path, not query params

- artists/{artist_id}/tracks and /direct-albums: artistID in path, return ArtistTracks/ArtistAlbums with pager
- likes: /users/me/likes/{type}s/{add-multiple|remove}, IDs as body params
- queue: /queues/{queue_id}/... instead of /queue/...?queue_id=...
- radio: /rotor/station/{station_id}/info and /tracks
- concerts: /concerts/{concert_id}/info, /concerts/tab-config
- playlists: /users/{user_id}/playlists
- labels: /labels/{label_id}, /albums, /artists
- clips: /clips/will/like, /artists/{artist_id}/blocks/artist-clips
- feed: /landing3/* endpoints

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
MrixsandClaude Code committed 2026-10-18 08:32:29 +03:00
1 parent 02a6dabcfb
commit 70c2a5cd01
12 files changed
+238 -168

No files matched your search

+34 -48
View File
@@ -10,7 +10,7 @@ import (
// GetQueue gets the current queue
func (c *Client) GetQueue(ctx context.Context) (*models.Queue, error) {
var result models.Queue
if err := c.request.Get(ctx, "/queue", nil, &result); err != nil {
if err := c.request.Get(ctx, "/queues", nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -25,7 +25,7 @@ func (c *Client) CreateQueue(ctx context.Context, trackID string, queueType stri
}
var result models.Queue
if err := c.request.Post(ctx, "/queue", params, &result); err != nil {
if err := c.request.Post(ctx, "/queues", params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -33,13 +33,10 @@ func (c *Client) CreateQueue(ctx context.Context, trackID string, queueType stri
}
// GetQueueItem gets a queue item
// GET /queues/{queue_id}
func (c *Client) GetQueueItem(ctx context.Context, queueID string) (*models.QueueItem, error) {
params := map[string]string{
"queue_id": queueID,
}
var result models.QueueItem
if err := c.request.Get(ctx, "/queue/item", params, &result); err != nil {
if err := c.request.Get(ctx, fmt.Sprintf("/queues/%s", queueID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -47,15 +44,15 @@ func (c *Client) GetQueueItem(ctx context.Context, queueID string) (*models.Queu
}
// AddToQueue adds a track to the queue
// POST /queues/{queue_id}/add
func (c *Client) AddToQueue(ctx context.Context, queueID, trackID string, position int) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"track_id": trackID,
"position": fmt.Sprintf("%d", position),
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/add", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/add", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -63,14 +60,14 @@ func (c *Client) AddToQueue(ctx context.Context, queueID, trackID string, positi
}
// RemoveFromQueue removes a track from the queue
// DELETE /queues/{queue_id}/remove
func (c *Client) RemoveFromQueue(ctx context.Context, queueID, trackID string) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"track_id": trackID,
}
var result models.Queue
if err := c.request.Delete(ctx, "/queue/remove", params, &result); err != nil {
if err := c.request.Delete(ctx, fmt.Sprintf("/queues/%s/remove", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -78,15 +75,15 @@ func (c *Client) RemoveFromQueue(ctx context.Context, queueID, trackID string) (
}
// ReorderQueue reorders the queue
// PUT /queues/{queue_id}/reorder
func (c *Client) ReorderQueue(ctx context.Context, queueID string, from, to int) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"from": fmt.Sprintf("%d", from),
"to": fmt.Sprintf("%d", to),
"from": fmt.Sprintf("%d", from),
"to": fmt.Sprintf("%d", to),
}
var result models.Queue
if err := c.request.Put(ctx, "/queue/reorder", params, &result); err != nil {
if err := c.request.Put(ctx, fmt.Sprintf("/queues/%s/reorder", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -94,22 +91,17 @@ func (c *Client) ReorderQueue(ctx context.Context, queueID string, from, to int)
}
// ClearQueue clears the queue
// DELETE /queues/{queue_id}/clear
func (c *Client) ClearQueue(ctx context.Context, queueID string) error {
params := map[string]string{
"queue_id": queueID,
}
var result map[string]any
return c.request.Delete(ctx, "/queue/clear", params, &result)
return c.request.Delete(ctx, fmt.Sprintf("/queues/%s/clear", queueID), nil, &result)
}
// NextTrack moves to the next track in the queue
// POST /queues/{queue_id}/next
func (c *Client) NextTrack(ctx context.Context, queueID string) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/next", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/next", queueID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -117,13 +109,10 @@ func (c *Client) NextTrack(ctx context.Context, queueID string) (*models.Queue,
}
// PreviousTrack moves to the previous track in the queue
// POST /queues/{queue_id}/prev
func (c *Client) PreviousTrack(ctx context.Context, queueID string) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/prev", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/prev", queueID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -131,14 +120,14 @@ func (c *Client) PreviousTrack(ctx context.Context, queueID string) (*models.Que
}
// Seek seeks to a specific position in the current track (in milliseconds)
// POST /queues/{queue_id}/seek
func (c *Client) Seek(ctx context.Context, queueID string, positionMs int) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"position": fmt.Sprintf("%d", positionMs),
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/seek", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/seek", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -147,14 +136,14 @@ func (c *Client) Seek(ctx context.Context, queueID string, positionMs int) (*mod
// SetRepeatMode sets the repeat mode for the queue
// mode can be "off", "one", or "all"
// POST /queues/{queue_id}/repeat
func (c *Client) SetRepeatMode(ctx context.Context, queueID, mode string) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"mode": mode,
"mode": mode,
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/repeat", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/repeat", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -162,14 +151,14 @@ func (c *Client) SetRepeatMode(ctx context.Context, queueID, mode string) (*mode
}
// SetShuffle enables or disables shuffle for the queue
// POST /queues/{queue_id}/shuffle
func (c *Client) SetShuffle(ctx context.Context, queueID string, enabled bool) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"enabled": fmt.Sprintf("%t", enabled),
"enabled": fmt.Sprintf("%t", enabled),
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/shuffle", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/shuffle", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -177,14 +166,14 @@ func (c *Client) SetShuffle(ctx context.Context, queueID string, enabled bool) (
}
// SetVolume sets the volume for the queue (0-100)
// POST /queues/{queue_id}/volume
func (c *Client) SetVolume(ctx context.Context, queueID string, volume int) (*models.Queue, error) {
params := map[string]string{
"queue_id": queueID,
"volume": fmt.Sprintf("%d", volume),
"volume": fmt.Sprintf("%d", volume),
}
var result models.Queue
if err := c.request.Post(ctx, "/queue/volume", params, &result); err != nil {
if err := c.request.Post(ctx, fmt.Sprintf("/queues/%s/volume", queueID), params, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -192,13 +181,10 @@ func (c *Client) SetVolume(ctx context.Context, queueID string, volume int) (*mo
}
// GetCurrentTrack gets the currently playing track from the queue
// GET /queues/{queue_id}/current
func (c *Client) GetCurrentTrack(ctx context.Context, queueID string) (*models.QueueItem, error) {
params := map[string]string{
"queue_id": queueID,
}
var result models.QueueItem
if err := c.request.Get(ctx, "/queue/current", params, &result); err != nil {
if err := c.request.Get(ctx, fmt.Sprintf("/queues/%s/current", queueID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
@@ -206,14 +192,14 @@ func (c *Client) GetCurrentTrack(ctx context.Context, queueID string) (*models.Q
}
// GetQueueHistory gets the queue history (recently played tracks)
// GET /queues/{queue_id}/history
func (c *Client) GetQueueHistory(ctx context.Context, queueID string, limit int) ([]*models.QueueItem, error) {
params := map[string]string{
"queue_id": queueID,
"limit": fmt.Sprintf("%d", limit),
"limit": fmt.Sprintf("%d", limit),
}
var result []models.QueueItem
if err := c.request.Get(ctx, "/queue/history", params, &result); err != nil {
if err := c.request.Get(ctx, fmt.Sprintf("/queues/%s/history", queueID), params, &result); err != nil {
return nil, err
}