mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
242 lines
11 KiB
Go
242 lines
11 KiB
Go
// Package models defines data structures used for Bose SoundTouch API communication
|
|
// and service management. It includes types for BMX (Bose Media eXchange) services,
|
|
// device information, presets, recents, and other core data models.
|
|
package models
|
|
|
|
import (
|
|
"encoding/xml"
|
|
)
|
|
|
|
// Link represents a navigational link with URL and client usage preferences.
|
|
type Link struct {
|
|
Href string `json:"href" xml:"href,attr"`
|
|
UseInternalClient string `json:"useInternalClient,omitempty" xml:"useInternalClient,attr,omitempty"`
|
|
}
|
|
|
|
// Links contains various navigation links used by BMX services.
|
|
type Links struct {
|
|
BmxLogout *Link `json:"bmx_logout,omitempty" xml:"bmx_logout,omitempty"`
|
|
BmxNavigate *Link `json:"bmx_navigate,omitempty" xml:"bmx_navigate,omitempty"`
|
|
BmxServicesAvailability *Link `json:"bmx_services_availability,omitempty" xml:"bmx_services_availability,omitempty"`
|
|
BmxToken *Link `json:"bmx_token,omitempty" xml:"bmx_token,omitempty"`
|
|
Self *Link `json:"self,omitempty" xml:"self,omitempty"`
|
|
BmxAvailability *Link `json:"bmx_availability,omitempty" xml:"bmx_availability,omitempty"`
|
|
BmxReporting *Link `json:"bmx_reporting,omitempty" xml:"bmx_reporting,omitempty"`
|
|
BmxFavorite *Link `json:"bmx_favorite,omitempty" xml:"bmx_favorite,omitempty"`
|
|
BmxNowPlaying *Link `json:"bmx_nowplaying,omitempty" xml:"bmx_nowplaying,omitempty"`
|
|
BmxTrack *Link `json:"bmx_track,omitempty" xml:"bmx_track,omitempty"`
|
|
}
|
|
|
|
// IconSet represents a collection of icons with different sizes for media content.
|
|
type IconSet struct {
|
|
DefaultAlbumArt string `json:"defaultAlbumArt,omitempty" xml:"defaultAlbumArt,omitempty"`
|
|
LargeSvg string `json:"largeSvg" xml:"largeSvg"`
|
|
MonochromePng string `json:"monochromePng" xml:"monochromePng"`
|
|
MonochromeSvg string `json:"monochromeSvg" xml:"monochromeSvg"`
|
|
SmallSvg string `json:"smallSvg" xml:"smallSvg"`
|
|
}
|
|
|
|
// Asset represents a media asset with URL and content type information.
|
|
type Asset struct {
|
|
Color string `json:"color" xml:"color"`
|
|
Description string `json:"description" xml:"description"`
|
|
Icons IconSet `json:"icons" xml:"icons"`
|
|
Name string `json:"name" xml:"name"`
|
|
ShortDescription string `json:"shortDescription,omitempty" xml:"shortDescription,omitempty"`
|
|
}
|
|
|
|
// Id represents an identifier structure used in various API responses.
|
|
type Id struct {
|
|
Name string `json:"name" xml:"name"`
|
|
Value int `json:"value" xml:"value"`
|
|
}
|
|
|
|
// BmxService represents a Bose Media eXchange service configuration.
|
|
type BmxService struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
AskAdapter bool `json:"askAdapter" xml:"askAdapter"`
|
|
Assets Asset `json:"assets" xml:"assets"`
|
|
BaseUrl string `json:"baseUrl" xml:"baseUrl"`
|
|
SignupUrl string `json:"signupUrl,omitempty" xml:"signupUrl,omitempty"`
|
|
StreamTypes []string `json:"streamTypes" xml:"streamTypes>streamType"`
|
|
AuthenticationModel map[string]interface{} `json:"authenticationModel" xml:"authenticationModel"`
|
|
ID Id `json:"id" xml:"id"`
|
|
}
|
|
|
|
// BmxResponse represents a response from BMX services.
|
|
type BmxResponse struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
AskAgainAfter int `json:"askAgainAfter" xml:"askAgainAfter"`
|
|
BmxServices []Service `json:"bmx_services" xml:"bmx_services>service"`
|
|
}
|
|
|
|
// Stream represents audio stream information including URL and format details.
|
|
type Stream struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
BufferingTimeout int `json:"bufferingTimeout,omitempty" xml:"bufferingTimeout,omitempty"`
|
|
ConnectingTimeout int `json:"connectingTimeout,omitempty" xml:"connectingTimeout,omitempty"`
|
|
HasPlaylist bool `json:"hasPlaylist" xml:"hasPlaylist"`
|
|
IsRealtime bool `json:"isRealtime" xml:"isRealtime"`
|
|
StreamUrl string `json:"streamUrl" xml:"streamUrl"`
|
|
}
|
|
|
|
// Audio represents audio content metadata including format and quality information.
|
|
type Audio struct {
|
|
HasPlaylist bool `json:"hasPlaylist" xml:"hasPlaylist"`
|
|
IsRealtime bool `json:"isRealtime" xml:"isRealtime"`
|
|
MaxTimeout int `json:"maxTimeout,omitempty" xml:"maxTimeout,omitempty"`
|
|
StreamUrl string `json:"streamUrl" xml:"streamUrl"`
|
|
Streams []Stream `json:"streams" xml:"streams>stream"`
|
|
}
|
|
|
|
// BmxPlaybackResponse represents a playback response from BMX services.
|
|
type BmxPlaybackResponse struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
Artist struct {
|
|
Name string `json:"name,omitempty" xml:"name,omitempty"`
|
|
} `json:"artist,omitempty" xml:"artist,omitempty"`
|
|
Audio Audio `json:"audio" xml:"audio"`
|
|
ImageUrl string `json:"imageUrl" xml:"imageUrl"`
|
|
IsFavorite *bool `json:"isFavorite,omitempty" xml:"isFavorite,omitempty"`
|
|
Name string `json:"name" xml:"name"`
|
|
StreamType string `json:"streamType" xml:"streamType"`
|
|
Duration int `json:"duration,omitempty" xml:"duration,omitempty"`
|
|
ShuffleDisabled bool `json:"shuffle_disabled,omitempty" xml:"shuffleDisabled,omitempty"`
|
|
RepeatDisabled bool `json:"repeat_disabled,omitempty" xml:"repeatDisabled,omitempty"`
|
|
}
|
|
|
|
// Track represents track information for media playback.
|
|
type Track struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
IsSelected bool `json:"isSelected" xml:"isSelected"`
|
|
Name string `json:"name" xml:"name"`
|
|
}
|
|
|
|
// BmxPodcastInfoResponse represents podcast information from BMX services.
|
|
type BmxPodcastInfoResponse struct {
|
|
Links *Links `json:"_links,omitempty" xml:"links,omitempty"`
|
|
Name string `json:"name" xml:"name"`
|
|
ShuffleDisabled bool `json:"shuffleDisabled" xml:"shuffleDisabled"`
|
|
RepeatDisabled bool `json:"repeatDisabled" xml:"repeatDisabled"`
|
|
StreamType string `json:"streamType" xml:"streamType"`
|
|
Tracks []Track `json:"tracks" xml:"tracks>track"`
|
|
}
|
|
|
|
// SourceProvider represents a media source provider configuration.
|
|
type SourceProvider struct {
|
|
ID int `json:"id" xml:"id,attr"`
|
|
CreatedOn string `json:"created_on" xml:"createdOn"`
|
|
Name string `json:"name" xml:"name"`
|
|
UpdatedOn string `json:"updated_on" xml:"updatedOn"`
|
|
}
|
|
|
|
// ServiceContentItem represents a media content item with source and location details.
|
|
type ServiceContentItem struct {
|
|
ID string `json:"id" xml:"id,attr"`
|
|
Name string `json:"name" xml:"itemName"`
|
|
Source string `json:"source,omitempty" xml:"source,attr,omitempty"`
|
|
Type string `json:"type" xml:"type,attr"`
|
|
Location string `json:"location" xml:"location,attr"`
|
|
SourceAccount string `json:"source_account,omitempty" xml:"sourceAccount,attr,omitempty"`
|
|
SourceID string `json:"source_id,omitempty" xml:"sourceid,omitempty"`
|
|
IsPresetable string `json:"is_presetable,omitempty" xml:"isPresetable,attr,omitempty"`
|
|
}
|
|
|
|
// ServicePreset represents a user-defined preset for quick access to media content.
|
|
type ServicePreset struct {
|
|
ServiceContentItem
|
|
ContainerArt string `json:"container_art" xml:"containerArt"`
|
|
CreatedOn string `json:"created_on" xml:"createdOn"`
|
|
UpdatedOn string `json:"updated_on" xml:"updatedOn"`
|
|
}
|
|
|
|
// ServiceRecent represents recently played media content.
|
|
type ServiceRecent struct {
|
|
ServiceContentItem
|
|
DeviceID string `json:"device_id" xml:"deviceid"`
|
|
UtcTime string `json:"utc_time" xml:"utc_time"`
|
|
ContainerArt string `json:"container_art,omitempty" xml:"containerArt,omitempty"`
|
|
}
|
|
|
|
// ConfiguredSource represents a configured media source with authentication details.
|
|
type ConfiguredSource struct {
|
|
DisplayName string `json:"display_name" xml:"displayName,attr"`
|
|
ID string `json:"id" xml:"id,attr"`
|
|
Secret string `json:"secret" xml:"secret,attr"`
|
|
SecretType string `json:"secret_type" xml:"secretType,attr"`
|
|
SourceKey struct {
|
|
Type string `xml:"type,attr"`
|
|
Account string `xml:"account,attr"`
|
|
} `json:"source_key" xml:"sourceKey"`
|
|
|
|
// Legacy fields for backward compatibility in code if needed,
|
|
// though it's better to update the code to use SourceKey.
|
|
SourceKeyType string `json:"source_key_type" xml:"-"`
|
|
SourceKeyAccount string `json:"source_key_account" xml:"-"`
|
|
}
|
|
|
|
// ServiceDeviceInfo represents information about a SoundTouch device.
|
|
type ServiceDeviceInfo struct {
|
|
DeviceID string `json:"device_id" xml:"deviceID,attr"`
|
|
ProductCode string `json:"product_code" xml:"type"`
|
|
DeviceSerialNumber string `json:"device_serial_number" xml:"serialnumber"`
|
|
ProductSerialNumber string `json:"product_serial_number" xml:"product_serial_number"`
|
|
FirmwareVersion string `json:"firmware_version" xml:"softwareVersion"`
|
|
IPAddress string `json:"ip_address" xml:"ipAddress"`
|
|
Name string `json:"name" xml:"name"`
|
|
DiscoveryMethod string `json:"discovery_method,omitempty"`
|
|
}
|
|
|
|
// CustomerSupportDevice represents device information for customer support purposes.
|
|
type CustomerSupportDevice struct {
|
|
ID string `xml:"id,attr"`
|
|
SerialNumber string `xml:"serialnumber"`
|
|
FirmwareVersion string `xml:"firmware-version"`
|
|
Product struct {
|
|
ProductCode string `xml:"product_code,attr"`
|
|
Type string `xml:"type,attr"`
|
|
SerialNumber string `xml:"serialnumber"`
|
|
} `xml:"product"`
|
|
}
|
|
|
|
// CustomerSupportRequest represents a customer support request with device and configuration details.
|
|
type CustomerSupportRequest struct {
|
|
XMLName xml.Name `xml:"device-data"`
|
|
Device CustomerSupportDevice `xml:"device"`
|
|
DiagnosticData struct {
|
|
DeviceLandscape struct {
|
|
RSSI string `xml:"rssi"`
|
|
GatewayIP string `xml:"gateway-ip-address"`
|
|
IPAddress string `xml:"ip-address"`
|
|
NetworkConnectionType string `xml:"network-connection-type"`
|
|
MacAddresses []string `xml:"macaddresses>macaddress"`
|
|
} `xml:"device-landscape"`
|
|
} `xml:"diagnostic-data"`
|
|
}
|
|
|
|
// UsageStats represents usage statistics for the service.
|
|
type UsageStats struct {
|
|
DeviceID string `json:"deviceId" xml:"deviceId"`
|
|
AccountID string `json:"accountId" xml:"accountId"`
|
|
Timestamp string `json:"timestamp" xml:"timestamp"`
|
|
EventType string `json:"eventType" xml:"eventType"`
|
|
Parameters map[string]interface{} `json:"parameters" xml:"parameters"`
|
|
}
|
|
|
|
// ErrorStats represents error statistics for monitoring and debugging.
|
|
type ErrorStats struct {
|
|
DeviceID string `json:"deviceId" xml:"deviceId"`
|
|
ErrorCode string `json:"errorCode" xml:"errorCode"`
|
|
ErrorMessage string `json:"errorMessage" xml:"errorMessage"`
|
|
Timestamp string `json:"timestamp" xml:"timestamp"`
|
|
Details string `json:"details,omitempty" xml:"details,omitempty"`
|
|
}
|
|
|
|
// DeviceEvent represents an event that occurred on a device.
|
|
type DeviceEvent struct {
|
|
Type string `json:"type"`
|
|
Time string `json:"time"`
|
|
MonoTime int64 `json:"monoTime"`
|
|
Data map[string]interface{} `json:"data"`
|
|
}
|