Add missing Track and Album model fields from Python reference
Track: Added 50+ missing fields (storage_dir, file_size, real_id, og_image, type, normalization, error, can_publish, state, filename, user_info, meta_data, regions, content_warning, preview_duration_ms, remember_position, background_video_uri, short_description, is_suitable_for_children, track_source, available_for_options, derived_colors, fade, smart_preview_params, special_audio_resources, disclaimers, background_video_id, player_id, mix_fade, chart, clip_ids, isrc, ugc_artist_name, podcast_episode_type, pub_date, and more) New types: Normalization, MetaData, Fade, SmartPreviewParams, CoverDerivedColors, CustomWave, TrackId, TrackFullInfo, SimilarTracks, TrackTrailer Album: Added 40+ missing fields (error, version, original_release_year, text_color, short_description, is_premiere, is_banner, meta_type, storage_dir, og_image, buy, recent, very_important, bests, duplicates, prerolls, regions, available_as_rbt, lyrics_available, remember_position, duration_ms, explicit, start_date, likes_count, deprecation, available_regions, available_for_options, disclaimers, action_button, cover, derived_colors, meta_tag_id, child_content, background_image_url, duration_sec, has_trailer, pager, sort_order) New types: Deprecation, AlbumActionButton
This commit is contained in:
1 parent
a9be10b5e5
commit
bc026d82b4
2 files changed
+478
-159
No files matched your search
+130
-68
@@ -8,35 +8,78 @@ import (
|
||||
// Album represents a full album from the Yandex Music API.
|
||||
type Album struct {
|
||||
BaseModel
|
||||
ID JSONID `json:"id"`
|
||||
Title string `json:"title"`
|
||||
CoverURI string `json:"cover_uri"`
|
||||
Genre string `json:"genre"`
|
||||
Year int `json:"year"`
|
||||
TrackCount int `json:"track_count"`
|
||||
Available bool `json:"available"`
|
||||
ReleaseDate string `json:"release_date"`
|
||||
Artists []Artist `json:"artists"`
|
||||
Labels []LabelOrString `json:"labels"`
|
||||
Volumes [][]Track `json:"volumes"`
|
||||
Description string `json:"description"`
|
||||
Meta *AlbumMeta `json:"meta"`
|
||||
Best *Best `json:"best"`
|
||||
// Additional fields
|
||||
Region string `json:"region"`
|
||||
AvailableForPremiumUsers bool `json:"available_for_premium_users"`
|
||||
AvailableForPremiumUsersOnly bool `json:"available_for_premium_users_only"`
|
||||
ContentWarning string `json:"content_warning"`
|
||||
Label string `json:"label"`
|
||||
CatalogNumber string `json:"catalog_number"`
|
||||
Options []string `json:"options"`
|
||||
TrackPositions []TrackPosition `json:"track_positions"`
|
||||
SimilarAlbums []Album `json:"similar_albums"`
|
||||
Trailer *AlbumTrailerStatus `json:"trailer"`
|
||||
ID JSONID `json:"id"`
|
||||
Error string `json:"error"`
|
||||
Title string `json:"title"`
|
||||
TrackCount int `json:"track_count"`
|
||||
Artists []Artist `json:"artists"`
|
||||
Labels []LabelOrString `json:"labels"`
|
||||
Available bool `json:"available"`
|
||||
AvailableForPremiumUsers bool `json:"available_for_premium_users"`
|
||||
Version string `json:"version"`
|
||||
CoverURI string `json:"cover_uri"`
|
||||
ContentWarning string `json:"content_warning"`
|
||||
OriginalReleaseYear int `json:"original_release_year"`
|
||||
Genre string `json:"genre"`
|
||||
TextColor string `json:"text_color"`
|
||||
ShortDescription string `json:"short_description"`
|
||||
Description string `json:"description"`
|
||||
IsPremiere bool `json:"is_premiere"`
|
||||
IsBanner bool `json:"is_banner"`
|
||||
MetaType string `json:"meta_type"`
|
||||
StorageDir string `json:"storage_dir"`
|
||||
OgImage string `json:"og_image"`
|
||||
Buy []json.RawMessage `json:"buy"`
|
||||
Recent bool `json:"recent"`
|
||||
VeryImportant bool `json:"very_important"`
|
||||
AvailableForMobile bool `json:"available_for_mobile"`
|
||||
AvailablePartially bool `json:"available_partially"`
|
||||
Bests []int `json:"bests"`
|
||||
Duplicates []Album `json:"duplicates"`
|
||||
Prerolls []json.RawMessage `json:"prerolls"`
|
||||
Volumes [][]Track `json:"volumes"`
|
||||
Year int `json:"year"`
|
||||
ReleaseDate string `json:"release_date"`
|
||||
Type string `json:"type"`
|
||||
TrackPosition *TrackPosition `json:"track_position"`
|
||||
Regions []string `json:"regions"`
|
||||
AvailableAsRbt bool `json:"available_as_rbt"`
|
||||
LyricsAvailable bool `json:"lyrics_available"`
|
||||
RememberPosition bool `json:"remember_position"`
|
||||
Albums []Album `json:"albums"`
|
||||
DurationMs int `json:"duration_ms"`
|
||||
Explicit bool `json:"explicit"`
|
||||
StartDate string `json:"start_date"`
|
||||
LikesCount int `json:"likes_count"`
|
||||
Deprecation *Deprecation `json:"deprecation"`
|
||||
AvailableRegions []string `json:"available_regions"`
|
||||
AvailableForOptions []string `json:"available_for_options"`
|
||||
ListeningFinished bool `json:"listening_finished"`
|
||||
Disclaimers []string `json:"disclaimers"`
|
||||
ActionButton *AlbumActionButton `json:"action_button"`
|
||||
Cover *Cover `json:"cover"`
|
||||
DerivedColors *CoverDerivedColors `json:"derived_colors"`
|
||||
MetaTagID string `json:"meta_tag_id"`
|
||||
ChildContent bool `json:"child_content"`
|
||||
BackgroundImageURL string `json:"background_image_url"`
|
||||
CustomWave *CustomWave `json:"custom_wave"`
|
||||
DurationSec int `json:"duration_sec"`
|
||||
HasTrailer bool `json:"has_trailer"`
|
||||
Trailer *AlbumTrailerStatus `json:"trailer"`
|
||||
Pager *Pager `json:"pager"`
|
||||
SortOrder string `json:"sort_order"`
|
||||
Meta *AlbumMeta `json:"meta"`
|
||||
Best *Best `json:"best"`
|
||||
Region string `json:"region"`
|
||||
AvailableForPremiumUsersOnly bool `json:"available_for_premium_users_only"`
|
||||
Label string `json:"label"`
|
||||
CatalogNumber string `json:"catalog_number"`
|
||||
Options []string `json:"options"`
|
||||
TrackPositions []TrackPosition `json:"track_positions"`
|
||||
SimilarAlbums []Album `json:"similar_albums"`
|
||||
}
|
||||
|
||||
// LabelOrString represents a label that can be either a Label object or a string.
|
||||
// The Yandex Music API sometimes returns labels as objects and sometimes as strings.
|
||||
type LabelOrString struct {
|
||||
Label *Label `json:"-"`
|
||||
Str string `json:"-"`
|
||||
@@ -45,14 +88,12 @@ type LabelOrString struct {
|
||||
|
||||
// UnmarshalJSON implements json.Unmarshaler, accepting both Label objects and strings.
|
||||
func (l *LabelOrString) UnmarshalJSON(data []byte) error {
|
||||
// Try string first
|
||||
var s string
|
||||
if err := json.Unmarshal(data, &s); err == nil {
|
||||
l.Str = s
|
||||
l.IsStr = true
|
||||
return nil
|
||||
}
|
||||
// Try Label object
|
||||
var label Label
|
||||
if err := json.Unmarshal(data, &label); err != nil {
|
||||
return err
|
||||
@@ -81,46 +122,6 @@ func (l LabelOrString) String() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// AlbumTrailerStatus represents trailer availability status for an album.
|
||||
type AlbumTrailerStatus struct {
|
||||
BaseModel
|
||||
Available bool `json:"available"`
|
||||
}
|
||||
|
||||
// DeJSON deserializes AlbumTrailerStatus from JSON data.
|
||||
func (ats *AlbumTrailerStatus) DeJSON(data []byte, c ClientInterface) (Model, error) {
|
||||
var raw map[string]json.RawMessage
|
||||
if err := json.Unmarshal(data, &raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
status := &AlbumTrailerStatus{BaseModel: *NewBaseModel(c)}
|
||||
|
||||
if v, ok := raw["available"]; ok {
|
||||
json.Unmarshal(v, &status.Available)
|
||||
}
|
||||
|
||||
return status, nil
|
||||
}
|
||||
|
||||
// DeList deserializes a list of AlbumTrailerStatus from JSON data.
|
||||
func (ats *AlbumTrailerStatus) DeList(data []byte, c 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 {
|
||||
status := &AlbumTrailerStatus{BaseModel: *NewBaseModel(c)}
|
||||
if err := json.Unmarshal(item, status); err != nil {
|
||||
continue
|
||||
}
|
||||
result = append(result, status)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// DeJSON deserializes an Album from JSON data.
|
||||
func (a *Album) DeJSON(data []byte, c ClientInterface) (Model, error) {
|
||||
var raw map[string]json.RawMessage
|
||||
@@ -134,6 +135,9 @@ func (a *Album) DeJSON(data []byte, c ClientInterface) (Model, error) {
|
||||
if v, ok := raw["id"]; ok {
|
||||
json.Unmarshal(v, &album.ID)
|
||||
}
|
||||
if v, ok := raw["error"]; ok {
|
||||
json.Unmarshal(v, &album.Error)
|
||||
}
|
||||
if v, ok := raw["title"]; ok {
|
||||
json.Unmarshal(v, &album.Title)
|
||||
}
|
||||
@@ -360,3 +364,61 @@ func (ti *TrailerInfo) DeList(data []byte, c ClientInterface) ([]Model, error) {
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// AlbumTrailerStatus represents trailer availability status for an album.
|
||||
type AlbumTrailerStatus struct {
|
||||
BaseModel
|
||||
Available bool `json:"available"`
|
||||
}
|
||||
|
||||
// DeJSON deserializes AlbumTrailerStatus from JSON data.
|
||||
func (ats *AlbumTrailerStatus) DeJSON(data []byte, c ClientInterface) (Model, error) {
|
||||
var raw map[string]json.RawMessage
|
||||
if err := json.Unmarshal(data, &raw); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
status := &AlbumTrailerStatus{BaseModel: *NewBaseModel(c)}
|
||||
|
||||
if v, ok := raw["available"]; ok {
|
||||
json.Unmarshal(v, &status.Available)
|
||||
}
|
||||
|
||||
return status, nil
|
||||
}
|
||||
|
||||
// DeList deserializes a list of AlbumTrailerStatus from JSON data.
|
||||
func (ats *AlbumTrailerStatus) DeList(data []byte, c 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 {
|
||||
status := &AlbumTrailerStatus{BaseModel: *NewBaseModel(c)}
|
||||
if err := json.Unmarshal(item, status); err != nil {
|
||||
continue
|
||||
}
|
||||
result = append(result, status)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Deprecation represents album deprecation info.
|
||||
type Deprecation struct {
|
||||
BaseModel
|
||||
TargetAlbumID JSONID `json:"target_album_id"`
|
||||
Status string `json:"status"`
|
||||
Done bool `json:"done"`
|
||||
}
|
||||
|
||||
// AlbumActionButton represents an action button for an album.
|
||||
type AlbumActionButton struct {
|
||||
BaseModel
|
||||
Text string `json:"text"`
|
||||
URL string `json:"url"`
|
||||
Color string `json:"color"`
|
||||
ViewBrowser bool `json:"view_browser"`
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user