Files
Mrixs a9be10b5e5 Fix remaining type mismatches vs Python reference
- RotorSettings: Diversity float64→string, Energy float64→int, add Mood int and MoodEnergy string
- Ratings: Rating float64→int, add Week int and Day int
- MetatagArtistEntry: Remove Score float64 (not in Python), add PopularTracks []Track
- MusicHistoryItemData: Remove Progress float64 (not in Python)
2026-10-18 12:57:21 +03:00

139 lines
4.0 KiB
Go

// Package models provides data models for the Yandex Music API.
package models
import (
"encoding/json"
)
// MusicHistory represents music history from the Yandex Music API.
type MusicHistory struct {
BaseModel
Tabs []MusicHistoryTab `json:"tabs"`
Groups []MusicHistoryGroup `json:"groups"`
Items []MusicHistoryItem `json:"items"`
Context *MusicHistoryContextFullModel `json:"context"`
}
// DeJSON deserializes a MusicHistory from JSON data.
func (mh *MusicHistory) DeJSON(data []byte, client ClientInterface) (Model, error) {
var raw map[string]json.RawMessage
if err := json.Unmarshal(data, &raw); err != nil {
return nil, err
}
history := &MusicHistory{BaseModel: *NewBaseModel(client)}
if v, ok := raw["tabs"]; ok {
var tabs []MusicHistoryTab
json.Unmarshal(v, &tabs)
history.Tabs = tabs
}
if v, ok := raw["groups"]; ok {
var groups []MusicHistoryGroup
json.Unmarshal(v, &groups)
history.Groups = groups
}
if v, ok := raw["items"]; ok {
var items []MusicHistoryItem
json.Unmarshal(v, &items)
history.Items = items
}
if v, ok := raw["context"]; ok {
var context MusicHistoryContextFullModel
json.Unmarshal(v, &context)
history.Context = &context
}
return history, nil
}
// DeList deserializes a list of MusicHistory from JSON data.
func (mh *MusicHistory) DeList(data []byte, client ClientInterface) ([]Model, error) {
var rawList []json.RawMessage
if err := json.Unmarshal(data, &rawList); err != nil {
return nil, err
}
result := make([]Model, 0, len(rawList))
for _, item := range rawList {
history := &MusicHistory{BaseModel: *NewBaseModel(client)}
if err := json.Unmarshal(item, history); err != nil {
continue
}
result = append(result, history)
}
return result, nil
}
// MusicHistoryTab represents a music history tab.
type MusicHistoryTab struct {
BaseModel
ID JSONID `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
Icon string `json:"icon"`
Active bool `json:"active"`
Position int `json:"position"`
}
// MusicHistoryGroup represents a music history group.
type MusicHistoryGroup struct {
BaseModel
ID JSONID `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
Items []MusicHistoryItem `json:"items"`
Total int `json:"total"`
}
// MusicHistoryItem represents a music history item.
type MusicHistoryItem struct {
BaseModel
ID JSONID `json:"id"`
Type string `json:"type"` // "track", "album", "artist", "playlist"
Track *Track `json:"track"`
Album *Album `json:"album"`
Artist *Artist `json:"artist"`
Playlist *Playlist `json:"playlist"`
PlayedAt string `json:"played_at"`
PlayCount int `json:"play_count"`
Duration int `json:"duration"`
Context *MusicHistoryItemData `json:"context"`
}
// MusicHistoryItemData represents music history item data.
type MusicHistoryItemData struct {
BaseModel
Source string `json:"source"`
SourceID string `json:"source_id"`
SourceType string `json:"source_type"`
PlayContext *PlayContext `json:"play_context"`
Position int `json:"position"`
Duration int `json:"duration"`
}
// MusicHistoryItemID represents music history item ID.
type MusicHistoryItemID struct {
BaseModel
ID JSONID `json:"id"`
Type string `json:"type"`
}
// MusicHistoryItems represents music history items.
type MusicHistoryItems struct {
BaseModel
Items []MusicHistoryItem `json:"items"`
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}
// MusicHistoryContextFullModel represents music history context full model.
type MusicHistoryContextFullModel struct {
BaseModel
DeviceID string `json:"device_id"`
SessionID string `json:"session_id"`
Timestamp string `json:"timestamp"`
ClientInfo string `json:"client_info"`
}