- 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>
355 lines
9.6 KiB
Go
355 lines
9.6 KiB
Go
package yandexmusic
|
|
|
|
import (
|
|
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/client"
|
|
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/models"
|
|
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/utils"
|
|
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/ynison"
|
|
)
|
|
|
|
// ClientConfig holds configuration for the Client
|
|
type ClientConfig = client.ClientConfig
|
|
|
|
// Client is the main Yandex Music API client
|
|
type Client = client.Client
|
|
|
|
// NewClient creates a new Yandex Music client
|
|
func NewClient(config ClientConfig) *Client {
|
|
return client.NewClient(config)
|
|
}
|
|
|
|
// Request is the HTTP request handler
|
|
type Request = client.Request
|
|
|
|
// DeviceCode represents the device authorization response
|
|
type DeviceCode = client.DeviceCode
|
|
|
|
// OAuthToken represents an OAuth token response
|
|
type OAuthToken = client.OAuthToken
|
|
|
|
// Status represents account status
|
|
type Status = client.Status
|
|
|
|
// Account represents a user account
|
|
type Account = client.Account
|
|
|
|
// Track represents a music track
|
|
type Track = models.Track
|
|
|
|
// Artist represents an artist
|
|
type Artist = models.Artist
|
|
|
|
// Album represents an album
|
|
type Album = models.Album
|
|
|
|
// Playlist represents a playlist
|
|
type Playlist = models.Playlist
|
|
|
|
// User represents a user
|
|
type User = models.User
|
|
|
|
// DownloadInfo represents file download info
|
|
type DownloadInfo = models.DownloadInfo
|
|
|
|
// SupplementLyrics represents lyrics content from supplement
|
|
type SupplementLyrics = models.SupplementLyrics
|
|
|
|
// Major represents major label info
|
|
type Major = models.Major
|
|
|
|
// Label represents a label
|
|
type Label = models.Label
|
|
|
|
// Availability represents availability info
|
|
type Availability = models.Availability
|
|
|
|
// Upsell represents upsell info
|
|
type Upsell = models.Upsell
|
|
|
|
// AlbumMeta represents album metadata
|
|
type AlbumMeta = models.AlbumMeta
|
|
|
|
// Best represents best tracks info
|
|
type Best = models.Best
|
|
|
|
// Ratings represents artist ratings
|
|
type Ratings = models.Ratings
|
|
|
|
// Counts represents artist counts
|
|
type Counts = models.Counts
|
|
|
|
// TrackShort represents a lightweight track
|
|
type TrackShort = models.TrackShort
|
|
|
|
// TracksList represents a list of tracks with metadata
|
|
type TracksList = models.TracksList
|
|
|
|
// Pager represents pagination info
|
|
type Pager = models.Pager
|
|
|
|
// TrackPosition represents track position
|
|
type TrackPosition = models.TrackPosition
|
|
|
|
// TrailerInfo represents trailer info
|
|
type TrailerInfo = models.TrailerInfo
|
|
|
|
// Cover represents cover image info
|
|
type Cover = models.Cover
|
|
|
|
// ArtistBriefInfo represents brief artist info
|
|
type ArtistBriefInfo = models.ArtistBriefInfo
|
|
|
|
// ArtistDonations represents artist donations info
|
|
type ArtistDonations = models.ArtistDonations
|
|
|
|
// DonationItem represents a donation item
|
|
type DonationItem = models.DonationItem
|
|
|
|
// Concert represents a concert (minimal)
|
|
type Concert = models.Concert
|
|
|
|
// Clip represents a clip (short video)
|
|
type Clip = models.Clip
|
|
|
|
// SearchResult represents search results
|
|
type SearchResult = models.SearchResult
|
|
|
|
// SearchTracksResult represents track search results
|
|
type SearchTracksResult = models.SearchTracksResult
|
|
|
|
// SearchAlbumsResult represents album search results
|
|
type SearchAlbumsResult = models.SearchAlbumsResult
|
|
|
|
// SearchArtistsResult represents artist search results
|
|
type SearchArtistsResult = models.SearchArtistsResult
|
|
|
|
// SearchPlaylistsResult represents playlist search results
|
|
type SearchPlaylistsResult = models.SearchPlaylistsResult
|
|
|
|
// SearchVideosResult represents video search results
|
|
type SearchVideosResult = models.SearchVideosResult
|
|
|
|
// SearchUsersResult represents user search results
|
|
type SearchUsersResult = models.SearchUsersResult
|
|
|
|
// SearchBanner represents a search banner
|
|
type SearchBanner = models.SearchBanner
|
|
|
|
// Tag represents a search tag
|
|
type Tag = models.Tag
|
|
|
|
// Video represents a video
|
|
type Video = models.Video
|
|
|
|
// ChartInfoMenu represents a chart info menu
|
|
type ChartInfoMenu = models.ChartInfoMenu
|
|
|
|
// ChartInfoMenuItem represents a chart info menu item
|
|
type ChartInfoMenuItem = models.ChartInfoMenuItem
|
|
|
|
// ChartItems represents chart items response
|
|
type ChartItems = models.ChartItems
|
|
|
|
// AccountSettings represents account settings
|
|
type AccountSettings = models.AccountSettings
|
|
|
|
// Subscription represents subscription info
|
|
type Subscription = models.Subscription
|
|
|
|
// PlusInfo represents Plus subscription info
|
|
type PlusInfo = models.PlusInfo
|
|
|
|
// PromoCodeStatus represents promo code status
|
|
type PromoCodeStatus = models.PromoCodeStatus
|
|
|
|
// Queue represents a playback queue
|
|
type Queue = models.Queue
|
|
|
|
// QueueItem represents a queue item
|
|
type QueueItem = models.QueueItem
|
|
|
|
// PlayContext represents a play context
|
|
type PlayContext = models.PlayContext
|
|
|
|
// PlayContextsData represents play contexts data
|
|
type PlayContextsData = models.PlayContextsData
|
|
|
|
// Feed represents the main feed
|
|
type Feed = models.Feed
|
|
|
|
// Day represents a day in the feed
|
|
type Day = models.Day
|
|
|
|
// DayBlock represents a block in a day
|
|
type DayBlock = models.DayBlock
|
|
|
|
// DayBlockData represents data in a day block
|
|
type DayBlockData = models.DayBlockData
|
|
|
|
// GeneratedPlaylist represents a generated playlist
|
|
type GeneratedPlaylist = models.GeneratedPlaylist
|
|
|
|
// Event represents a feed event
|
|
type Event = models.Event
|
|
|
|
// AlbumEvent represents an album event
|
|
type AlbumEvent = models.AlbumEvent
|
|
|
|
// ArtistEvent represents an artist event
|
|
type ArtistEvent = models.ArtistEvent
|
|
|
|
// TrackWithAds represents a track with ads
|
|
type TrackWithAds = models.TrackWithAds
|
|
|
|
// Ad represents an ad
|
|
type Ad = models.Ad
|
|
|
|
// AdParams represents ad parameters
|
|
type AdParams = models.AdParams
|
|
|
|
// Landing represents a landing page
|
|
type Landing = models.Landing
|
|
|
|
// LandingBlock represents a block in a landing
|
|
type LandingBlock = models.LandingBlock
|
|
|
|
// LandingBlockData represents data in a landing block
|
|
type LandingBlockData = models.LandingBlockData
|
|
|
|
// LandingList represents a list of landings
|
|
type LandingList = models.LandingList
|
|
|
|
// LyricsInfo represents lyrics information
|
|
type LyricsInfo = models.LyricsInfo
|
|
|
|
// VideoSupplement represents video supplement
|
|
type VideoSupplement = models.VideoSupplement
|
|
|
|
// Supplement represents track supplement
|
|
type Supplement = models.Supplement
|
|
|
|
// LyricsMajor represents a lyrics provider (e.g., Genius, Musixmatch)
|
|
type LyricsMajor = models.LyricsMajor
|
|
|
|
// TrackLyrics represents lyrics information from /tracks/{id}/lyrics endpoint
|
|
type TrackLyrics = models.TrackLyrics
|
|
|
|
// Credits represents track credits
|
|
type Credits = models.Credits
|
|
|
|
// Credit represents a credit item
|
|
type Credit = models.Credit
|
|
|
|
// ArtistTracks represents a page of tracks by an artist
|
|
type ArtistTracks = models.ArtistTracks
|
|
|
|
// ArtistAlbums represents a page of albums by an artist
|
|
type ArtistAlbums = models.ArtistAlbums
|
|
|
|
// RadioStation represents a radio station
|
|
type RadioStation = models.RadioStation
|
|
|
|
// StationTracksResult represents station tracks result
|
|
type StationTracksResult = models.StationTracksResult
|
|
|
|
// RotorStation represents a rotor (generative) station
|
|
type RotorStation = models.RotorStation
|
|
|
|
// RotorSettings represents rotor station settings
|
|
type RotorSettings = models.RotorSettings
|
|
|
|
// RotorStationTracksResult represents rotor station tracks result
|
|
type RotorStationTracksResult = models.RotorStationTracksResult
|
|
|
|
// RotorSession represents a rotor session
|
|
type RotorSession = models.RotorSession
|
|
|
|
// SessionFeedback represents session feedback
|
|
type SessionFeedback = models.SessionFeedback
|
|
|
|
// SessionFeedbacks represents multiple session feedbacks
|
|
type SessionFeedbacks = models.SessionFeedbacks
|
|
|
|
// Experiments represents experiments
|
|
type Experiments = models.Experiments
|
|
|
|
// ExperimentDetail represents experiment details
|
|
type ExperimentDetail = models.ExperimentDetail
|
|
|
|
// Permissions represents user permissions
|
|
type Permissions = models.Permissions
|
|
|
|
// PermissionAlerts represents permission alerts
|
|
type PermissionAlerts = models.PermissionAlerts
|
|
|
|
// PermissionAlert represents a permission alert
|
|
type PermissionAlert = models.PermissionAlert
|
|
|
|
// ContentRestrictions represents content restrictions
|
|
type ContentRestrictions = models.ContentRestrictions
|
|
|
|
// JSONBackend defines the interface for JSON encoding/decoding
|
|
type JSONBackend = utils.JSONBackend
|
|
|
|
// GetDefaultJSONBackend returns the default JSON backend
|
|
func GetDefaultJSONBackend() JSONBackend {
|
|
return utils.GetDefaultJSONBackend()
|
|
}
|
|
|
|
// SchemaMismatchConfig holds configuration for schema mismatch handling
|
|
type SchemaMismatchConfig = utils.SchemaMismatchConfig
|
|
|
|
// DefaultSchemaMismatchConfig returns the default configuration
|
|
func DefaultSchemaMismatchConfig() SchemaMismatchConfig {
|
|
return utils.DefaultSchemaMismatchConfig()
|
|
}
|
|
|
|
// SchemaMismatchHandler is a callback for handling schema mismatches
|
|
type SchemaMismatchHandler = utils.SchemaMismatchHandler
|
|
|
|
// SchemaMismatch represents a mismatch between expected and actual API response
|
|
type SchemaMismatch = utils.SchemaMismatch
|
|
|
|
// YnisonClient represents a Ynison WebSocket client
|
|
type YnisonClient = ynison.YnisonClient
|
|
|
|
// DeviceConfig holds device configuration for Ynison
|
|
type DeviceConfig = ynison.DeviceConfig
|
|
|
|
// Example usage:
|
|
//
|
|
// client := yandexmusic.NewClient(yandexmusic.ClientConfig{
|
|
// Token: "your-oauth-token",
|
|
// Language: "en",
|
|
// })
|
|
//
|
|
// ctx := context.Background()
|
|
// if err := client.Init(ctx); err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
//
|
|
// // Get liked tracks
|
|
// tracks, err := client.GetLikedTracks(ctx)
|
|
// if err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
//
|
|
// for _, track := range tracks {
|
|
// fmt.Println(track.Title, "-", track.Artists[0].Name)
|
|
// }
|
|
//
|
|
// // Search for tracks
|
|
// results, err := client.SearchTracks(ctx, "Daft Punk", 10)
|
|
// if err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
//
|
|
// // Download a track
|
|
// if len(tracks) > 0 {
|
|
// data, err := client.DownloadTrack(ctx, tracks[0].ID, "mp3", 320)
|
|
// if err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
// os.WriteFile("track.mp3", data, 0644)
|
|
// }
|