Files
yandex-music-api-go/internal/client/albums.go
T
Mrixs 49920d8908 Add missing Track, Album, Artist model types and client methods
Track: Added FileInfo, FileDownloadInfo, TrackFullInfo, SimilarTracks types
Album: Added AlbumSimilarEntities, AlbumTrailer, SimilarEntityItem types
Artist: Added ArtistSimilar, ArtistLinks, ArtistAbout, ArtistInfo, ArtistSkeleton,
       ArtistTrailerStatus, ArtistLink, Stats, SkeletonBlock types

Client methods added:
- artists.go: GetArtistBriefInfo, GetArtistSimilar, GetArtistLinks, GetArtistAlsoAlbums,
  GetArtistDiscographyAlbums, GetArtistSafeDirectAlbums, GetArtistTrackIds, GetArtistAbout,
  GetArtistDonation, GetArtistInfo, GetArtistSkeleton, GetArtistTrailer
- albums.go: GetAlbumSimilarEntities, GetAlbumTrailer
- tracks.go: GetTracksFileInfo, GetTracksSimilar, GetTrackTrailer, GetTrackFullInfo
2026-10-18 13:24:41 +03:00

93 lines
2.7 KiB
Go

// Package client provides methods for interacting with Yandex Music API endpoints.
package client
import (
"context"
"fmt"
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/models"
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/utils"
)
// GetAlbums gets albums by their IDs (GET /tracks?album-ids=...).
// Returns a slice of Album pointers, or nil if no IDs are provided.
func (c *Client) GetAlbums(ctx context.Context, albumIDs []string) ([]*models.Album, error) {
if len(albumIDs) == 0 {
return nil, nil
}
params := map[string]string{
"album-ids": joinIDs(albumIDs),
}
var result []models.Album
if err := c.request.Get(ctx, "/albums", params, &result); err != nil {
return nil, err
}
albums := make([]*models.Album, len(result))
for i := range result {
result[i].SetClient(c)
albums[i] = &result[i]
}
return albums, nil
}
// GetAlbum gets a single album by ID using GetAlbums.
// Returns an error if no album is found with the given ID.
func (c *Client) GetAlbum(ctx context.Context, albumID string) (*models.Album, error) {
albums, err := c.GetAlbums(ctx, []string{albumID})
if err != nil {
return nil, err
}
if len(albums) == 0 {
return nil, utils.NewYandexMusicError("album not found", utils.ErrNotFound)
}
return albums[0], nil
}
// GetAlbumsWithTracks gets albums with tracks expanded (GET /tracks?with-tracks=true).
// Returns a slice of Album pointers with their tracks populated.
func (c *Client) GetAlbumsWithTracks(ctx context.Context, albumIDs []string) ([]*models.Album, error) {
if len(albumIDs) == 0 {
return nil, nil
}
params := map[string]string{
"album-ids": joinIDs(albumIDs),
"with-tracks": "true",
}
var result []models.Album
if err := c.request.Get(ctx, "/albums", params, &result); err != nil {
return nil, err
}
albums := make([]*models.Album, len(result))
for i := range result {
result[i].SetClient(c)
albums[i] = &result[i]
}
return albums, nil
}
// GetAlbumSimilarEntities gets similar entities for an album (GET /albums/{id}/similar-entities).
func (c *Client) GetAlbumSimilarEntities(ctx context.Context, albumID string) (*models.AlbumSimilarEntities, error) {
var result models.AlbumSimilarEntities
if err := c.request.Get(ctx, fmt.Sprintf("/albums/%s/similar-entities", albumID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
return &result, nil
}
// GetAlbumTrailer gets album trailer (GET /albums/{id}/trailer).
func (c *Client) GetAlbumTrailer(ctx context.Context, albumID string) (*models.AlbumTrailer, error) {
var result models.AlbumTrailer
if err := c.request.Get(ctx, fmt.Sprintf("/albums/%s/trailer", albumID), nil, &result); err != nil {
return nil, err
}
result.SetClient(c)
return &result, nil
}