Files
yandex-music-api-go/internal/ynison/helpers.go
T
2026-10-14 23:04:51 +03:00

207 lines
6.5 KiB
Go

package ynison
import (
"time"
"gitea.mrixs.me/Mrixs/yandex-music-api-go/internal/ynison/proto"
)
// CreatePlayingStatus creates a playing status
func CreatePlayingStatus(progressMs, durationMs int64, paused bool, playbackSpeed float64, deviceID string) *proto.PlayingStatus {
return &proto.PlayingStatus{
ProgressMs: progressMs,
DurationMs: durationMs,
Paused: paused,
PlaybackSpeed: playbackSpeed,
Version: &proto.UpdateVersion{
DeviceId: deviceID,
Version: 1,
TimestampMs: time.Now().UnixMilli(),
},
}
}
// CreatePlayable creates a playable entity
func CreatePlayable(playableID, albumID, from, title, coverURL string, playableType proto.PlayablePlayableType) *proto.Playable {
return &proto.Playable{
PlayableId: playableID,
AlbumIdOptional: albumID,
PlayableType: playableType,
From: from,
Title: title,
CoverUrlOptional: coverURL,
}
}
// CreateTrackPlayable creates a track playable
func CreateTrackPlayable(playableID, albumID, from, title, coverURL string, trackSourceKey uint32, batchID string) *proto.Playable {
return &proto.Playable{
PlayableId: playableID,
AlbumIdOptional: albumID,
PlayableType: proto.PlayablePlayableType_PLAYABLE_TYPE_TRACK,
From: from,
Title: title,
CoverUrlOptional: coverURL,
TrackInfo: &proto.TrackInfo{
TrackSourceKey: trackSourceKey,
BatchIdOptional: batchID,
},
}
}
// CreateVideoClipPlayable creates a video clip playable
func CreateVideoClipPlayable(playableID, from, title, coverURL string, recommendationType proto.VideoClipInfoRecommendationType) *proto.Playable {
return &proto.Playable{
PlayableId: playableID,
PlayableType: proto.PlayablePlayableType_PLAYABLE_TYPE_VIDEO_CLIP,
From: from,
Title: title,
CoverUrlOptional: coverURL,
VideoClipInfo: &proto.VideoClipInfo{
RecommendationType: recommendationType,
},
}
}
// CreatePlayerQueue creates a player queue
func CreatePlayerQueue(entityID string, entityType proto.PlayerQueueEntityType, playables []*proto.Playable, currentIndex int32, deviceID string) *proto.PlayerQueue {
return &proto.PlayerQueue{
EntityId: entityID,
EntityType: entityType,
CurrentPlayableIndex: currentIndex,
PlayableList: playables,
Options: &proto.PlayerStateOptions{
RepeatMode: proto.PlayerStateOptionsRepeatMode_REPEAT_MODE_NONE,
},
Version: &proto.UpdateVersion{
DeviceId: deviceID,
Version: 1,
TimestampMs: time.Now().UnixMilli(),
},
EntityContext: proto.PlayerQueueEntityContext_ENTITY_CONTEXT_BASED_ON_ENTITY_BY_DEFAULT,
}
}
// CreateWaveQueue creates a wave queue
func CreateWaveQueue(recommended []*proto.Playable, liveIndex int32, sessionID string, deviceID string) *proto.PlayerQueueQueue {
// Build track sources from playables
var trackSources []*proto.PlayerQueueQueueWaveQueueEntityOptionsTrackSourceWithKey
for i := range recommended {
trackSources = append(trackSources, &proto.PlayerQueueQueueWaveQueueEntityOptionsTrackSourceWithKey{
Key: uint32(i + 1),
WaveSource: &proto.PlayerQueueQueueWaveQueueEntityOptionsWaveSource{
SourceType: proto.WaveSourceSourceType_WAVE_SOURCE_ONLINE_BY_DEFAULT,
},
})
}
return &proto.PlayerQueueQueue{
WaveQueue: &proto.PlayerQueueQueueWaveQueue{
RecommendedPlayableList: recommended,
LivePlayableIndex: liveIndex,
EntityOptions: &proto.PlayerQueueQueueWaveQueueEntityOptions{
WaveEntityOptional: &proto.PlayerQueueQueueWaveQueueEntityOptionsWaveSession{
SessionId: sessionID,
},
TrackSources: trackSources,
},
NavigationIdOptional: "",
PlaybackActionIdOptional: "",
},
}
}
// CreateGenerativeQueue creates a generative queue
func CreateGenerativeQueue(id string) *proto.PlayerQueueQueue {
return &proto.PlayerQueueQueue{
GenerativeQueue: &proto.PlayerQueueQueueGenerativeQueue{
Id: id,
},
}
}
// CreateFMRadioQueue creates an FM radio queue
func CreateFMRadioQueue(id string) *proto.PlayerQueueQueue {
return &proto.PlayerQueueQueue{
FmRadioQueue: &proto.PlayerQueueQueueFmRadioQueue{
Id: id,
},
}
}
// CreateVideoWaveQueue creates a video wave queue
func CreateVideoWaveQueue(id string) *proto.PlayerQueueQueue {
return &proto.PlayerQueueQueue{
VideoWaveQueue: &proto.PlayerQueueQueueVideoWaveQueue{
Id: id,
},
}
}
// CreateLocalTracksQueue creates a local tracks queue
func CreateLocalTracksQueue() *proto.PlayerQueueQueue {
return &proto.PlayerQueueQueue{
LocalTracksQueue: &proto.PlayerQueueQueueLocalTracksQueue{},
}
}
// CreateDeviceInfo creates device info
func CreateDeviceInfo(deviceID, title string, deviceType proto.DeviceType, appName, appVersion string) *proto.DeviceInfo {
return &proto.DeviceInfo{
DeviceId: deviceID,
Title: title,
Type: deviceType,
AppName: appName,
AppVersion: appVersion,
}
}
// CreateDeviceCapabilities creates device capabilities
func CreateDeviceCapabilities(canBePlayer, canBeRemote bool, volumeGranularity uint32) *proto.DeviceCapabilities {
return &proto.DeviceCapabilities{
CanBePlayer: canBePlayer,
CanBeRemoteController: canBeRemote,
VolumeGranularity: volumeGranularity,
}
}
// CreateDeviceVolume creates device volume
func CreateDeviceVolume(volume float64, deviceID string) *proto.DeviceVolume {
return &proto.DeviceVolume{
Volume: volume,
Version: &proto.UpdateVersion{
DeviceId: deviceID,
Version: 1,
TimestampMs: time.Now().UnixMilli(),
},
}
}
// CreateDevice creates a device
func CreateDevice(deviceID, title string, deviceType proto.DeviceType, appName, appVersion string, volume float64) *proto.Device {
return &proto.Device{
Info: CreateDeviceInfo(deviceID, title, deviceType, appName, appVersion),
Volume: volume,
Capabilities: CreateDeviceCapabilities(true, true, 100),
Session: &proto.Session{
Id: time.Now().UnixNano(),
},
IsOffline: false,
VolumeInfo: CreateDeviceVolume(volume, deviceID),
}
}
// CreateUpdateFullState creates an UpdateFullState request
func CreateUpdateFullState(deviceID string, isActive bool, playerState *proto.PlayerState) *proto.UpdateFullState {
return &proto.UpdateFullState{
PlayerState: playerState,
IsCurrentlyActive: isActive,
Device: &proto.UpdateDevice{
Info: CreateDeviceInfo(deviceID, "Go Ynison Client", proto.DeviceType_DEVICE_TYPE_WEB_DESKTOP, "YandexMusicGo", "1.0.0"),
Volume: 0.5,
Capabilities: CreateDeviceCapabilities(true, true, 100),
VolumeInfo: CreateDeviceVolume(0.5, deviceID),
},
}
}