feature: add track decoder

This commit is contained in:
Christopher F 2018-08-24 17:14:58 -04:00
parent f5c6bdc457
commit ba704b963d
3 changed files with 145 additions and 1 deletions

View File

@ -1,4 +1,3 @@
- pause state should be reset on a play command
- match node balancing against lavalink-client's
https://github.com/FredBoat/Lavalink-Client/blob/master/src/main/java/lavalink/client/io/LavalinkLoadBalancer.java#L121-L146
- track decoder

128
decoder.go Normal file
View File

@ -0,0 +1,128 @@
package gavalink
import (
"bytes"
"encoding/base64"
"encoding/binary"
"io"
)
const trackInfoVersioned int32 = 1
// DecodeString decodes a base64 Lavaplayer string to a TrackInfo
func DecodeString(data string) (*TrackInfo, error) {
b, err := base64.StdEncoding.DecodeString(data)
if err != nil {
return nil, err
}
r := bytes.NewReader(b)
return Decode(r)
}
// Decode decodes a reader into a TrackInfo
func Decode(r io.Reader) (*TrackInfo, error) {
// https://github.com/serenity-rs/lavalink.rs/blob/master/src/decoder.rs
var value uint8
if err := binary.Read(r, binary.LittleEndian, &value); err != nil {
return nil, err
}
flags := int32(int64(value) & 0xC00000000)
// irrelevant data?
var ignore [2]byte
if err := binary.Read(r, binary.LittleEndian, &ignore); err != nil {
return nil, err
}
var version uint8
if flags&trackInfoVersioned == 0 {
version = 1
} else {
if err := binary.Read(r, binary.LittleEndian, &version); err != nil {
return nil, err
}
}
if err := binary.Read(r, binary.LittleEndian, &ignore); err != nil {
return nil, err
}
title, err := readString(r)
if err != nil {
return nil, err
}
author, err := readString(r)
if err != nil {
return nil, err
}
var length uint64
if err := binary.Read(r, binary.BigEndian, &length); err != nil {
return nil, err
}
identifier, err := readString(r)
if err != nil {
return nil, err
}
var stream uint8
if err := binary.Read(r, binary.LittleEndian, &stream); err != nil {
return nil, err
}
var hasURL uint8
if err := binary.Read(r, binary.LittleEndian, &hasURL); err != nil {
return nil, err
}
var url string
if hasURL == 1 {
url, err = readString(r)
if err != nil {
return nil, err
}
} else {
var size uint8
if err := binary.Read(r, binary.LittleEndian, &size); err != nil {
return nil, err
}
ignore := make([]byte, size)
if err := binary.Read(r, binary.LittleEndian, &ignore); err != nil {
return nil, err
}
}
/*source, err := readString(r)
if err != nil {
return nil, err
}*/
track := &TrackInfo{
Identifier: identifier,
Title: title,
Author: author,
URI: url,
Stream: stream == 1,
Length: int(length),
}
return track, nil
}
func readString(r io.Reader) (string, error) {
var size uint16
if err := binary.Read(r, binary.BigEndian, &size); err != nil {
return "", err
}
buf := make([]byte, size)
if err := binary.Read(r, binary.BigEndian, &buf); err != nil {
return "", err
}
return string(buf), nil
}

17
decoder_test.go Normal file
View File

@ -0,0 +1,17 @@
package gavalink_test
import (
"testing"
"github.com/foxbot/gavalink"
)
func TestDecoder(t *testing.T) {
data := "QAAAkAIALGxvZmkgaGlwIGhvcCByYWRpbyAtIGJlYXRzIHRvIHJlbGF4L3N0dWR5IHRvAApDaGlsbGVkQ293f/////////8AC2hIVzFvWTI2a3hRAQEAK2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9aEhXMW9ZMjZreFEAB3lvdXR1YmUAAAAAAAAAAA=="
track, err := gavalink.DecodeString(data)
if err != nil {
t.Error(err)
return
}
t.Log(track)
}