package monochrome import ( "bytes" "encoding/base64" "encoding/json" "fmt" "strconv" ) type TrackInfo struct { TrackId int `json:"trackId"` Manifest string `json:"manifest"` } type TrackInfoResponse struct { Data TrackInfo `json:"data"` } func (c *Client) TrackInfo(id int, quality AudioQuality) (*TrackInfo, error) { req, err := c.makeRequest("GET", "/track", nil, map[string]string{ "id": strconv.Itoa(id), "quality": quality, }) if err != nil { return nil, fmt.Errorf("failed to create request: %v", err) } data, err := c.do(req) if err != nil { return nil, fmt.Errorf("failed to send request: %v", err) } response := TrackInfoResponse{} if err := json.NewDecoder(bytes.NewReader(data)).Decode(&response); err != nil { return nil, fmt.Errorf("failed to decode json response: %v", err) } return &response.Data, nil } type TrackManifestEncryption = string var ( TrackManifestEncryptionNone TrackManifestEncryption = "NONE" ) type TrackManifest struct { MimeType string `json:"mimeType"` Codecs string `json:"codecs"` EncryptionType TrackManifestEncryption `json:"encryptionType"` URLs []string `json:"urls"` } func (c *Client) DecodeManifest(manifest string) (*TrackManifest, error) { m, err := base64.StdEncoding.DecodeString(manifest) if err != nil { return nil, fmt.Errorf("failed to decode track manifest: %v", err) } mData := &TrackManifest{} if err := json.NewDecoder(bytes.NewReader(m)).Decode(mData); err != nil { return nil, fmt.Errorf("failed to decode track manifest: %v", err) } return mData, nil }