package client import ( "context" "fmt" "gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/models" ) // 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 { return nil, err } result.SetClient(c) return &result, nil } // CreateQueue creates a new queue func (c *Client) CreateQueue(ctx context.Context, trackID string, queueType string) (*models.Queue, error) { params := map[string]string{ "track_id": trackID, "queue_type": queueType, // "radio", "album", "playlist", etc. } var result models.Queue if err := c.request.Post(ctx, "/queue", params, &result); err != nil { return nil, err } result.SetClient(c) return &result, nil } // GetQueueItem gets a queue item 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 { return nil, err } result.SetClient(c) return &result, nil } // AddToQueue adds a track to the queue 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 { return nil, err } result.SetClient(c) return &result, nil } // RemoveFromQueue removes a track from the queue 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 { return nil, err } result.SetClient(c) return &result, nil } // ReorderQueue reorders the queue 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), } var result models.Queue if err := c.request.Put(ctx, "/queue/reorder", params, &result); err != nil { return nil, err } result.SetClient(c) return &result, nil } // ClearQueue clears the queue 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) } // NextTrack moves to the next track in the queue 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 { return nil, err } result.SetClient(c) return &result, nil } // PreviousTrack moves to the previous track in the queue 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 { return nil, err } result.SetClient(c) return &result, nil } // Seek seeks to a specific position in the current track (in milliseconds) 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 { return nil, err } result.SetClient(c) return &result, nil } // SetRepeatMode sets the repeat mode for the queue // mode can be "off", "one", or "all" func (c *Client) SetRepeatMode(ctx context.Context, queueID, mode string) (*models.Queue, error) { params := map[string]string{ "queue_id": queueID, "mode": mode, } var result models.Queue if err := c.request.Post(ctx, "/queue/repeat", params, &result); err != nil { return nil, err } result.SetClient(c) return &result, nil } // SetShuffle enables or disables shuffle for the queue 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), } var result models.Queue if err := c.request.Post(ctx, "/queue/shuffle", params, &result); err != nil { return nil, err } result.SetClient(c) return &result, nil } // SetVolume sets the volume for the queue (0-100) 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), } var result models.Queue if err := c.request.Post(ctx, "/queue/volume", params, &result); err != nil { return nil, err } result.SetClient(c) return &result, nil } // GetCurrentTrack gets the currently playing track from the queue 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 { return nil, err } result.SetClient(c) return &result, nil } // GetQueueHistory gets the queue history (recently played tracks) 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), } var result []models.QueueItem if err := c.request.Get(ctx, "/queue/history", params, &result); err != nil { return nil, err } items := make([]*models.QueueItem, len(result)) for i := range result { result[i].SetClient(c) items[i] = &result[i] } return items, nil } // GetPlayContexts gets play contexts func (c *Client) GetPlayContexts(ctx context.Context) ([]*models.PlayContext, error) { var result []models.PlayContext if err := c.request.Get(ctx, "/play-contexts", nil, &result); err != nil { return nil, err } contexts := make([]*models.PlayContext, len(result)) for i := range result { result[i].SetClient(c) contexts[i] = &result[i] } return contexts, nil } // GetPlayContextsData gets play contexts data func (c *Client) GetPlayContextsData(ctx context.Context) (*models.PlayContextsData, error) { var result models.PlayContextsData if err := c.request.Get(ctx, "/play-contexts/data", nil, &result); err != nil { return nil, err } return &result, nil }