From fbab76d2697963c7334446940f5b174ff412a86f Mon Sep 17 00:00:00 2001 From: Tyler Date: Sun, 12 Apr 2020 12:03:08 -0400 Subject: [PATCH] Use time.Duration for track lengths --- .gitignore | 6 +++++- decoder.go | 5 +++-- model.go | 50 +++++++++++++++++++++++++++++++++++++++----------- model_test.go | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 model_test.go diff --git a/.gitignore b/.gitignore index 9b9e5bf..50082d1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,8 @@ # End of https://www.gitignore.io/api/go -.env \ No newline at end of file +.env + +# IntelliJ +.idea/ +*.iml diff --git a/decoder.go b/decoder.go index d1f99b8..bb9c919 100644 --- a/decoder.go +++ b/decoder.go @@ -6,6 +6,7 @@ import ( "encoding/binary" "github.com/valyala/fastjson" "io" + "time" ) const trackInfoVersioned int32 = 1 @@ -109,7 +110,7 @@ func Decode(r io.Reader) (*TrackInfo, error) { Author: author, URI: url, Stream: stream == 1, - Length: int(length), + Length: time.Duration(length) * time.Millisecond, } return track, nil @@ -128,7 +129,7 @@ func readString(r io.Reader) (string, error) { return string(buf), nil } -func jsonStringValue(v *fastjson.Value, keys ... string) string { +func jsonStringValue(v *fastjson.Value, keys ...string) string { value := v.Get(keys...) if value == nil { diff --git a/model.go b/model.go index f51c4c7..a32cadb 100644 --- a/model.go +++ b/model.go @@ -1,9 +1,11 @@ package gavalink import ( + "encoding/json" "io" "net/http" "os" + "time" ) const ( @@ -27,7 +29,7 @@ type Tracks struct { // NoMatches, or LoadFailed Type string `json:"loadType"` PlaylistInfo *PlaylistInfo `json:"playlistInfo"` - Tracks []Track `json:"tracks"` + Tracks []*Track `json:"tracks"` } // PlaylistInfo contains information about a loaded playlist @@ -42,20 +44,46 @@ type PlaylistInfo struct { // Track contains information about a loaded track type Track struct { // Data contains the base64 encoded Lavaplayer track - Data string `json:"track"` - Info TrackInfo `json:"info"` + Data string `json:"track"` + Info *TrackInfo `json:"info"` } // TrackInfo contains more data about a loaded track type TrackInfo struct { - Identifier string `json:"identifier"` - Title string `json:"title"` - Author string `json:"author"` - URI string `json:"uri"` - Seekable bool `json:"isSeekable"` - Stream bool `json:"isStream"` - Length int `json:"length"` - Position int `json:"position"` + Identifier string `json:"identifier"` + Title string `json:"title"` + Author string `json:"author"` + URI string `json:"uri"` + Seekable bool `json:"isSeekable"` + Stream bool `json:"isStream"` + Length time.Duration `json:"length"` + Position int `json:"position"` +} + +func (t *TrackInfo) MarshalJSON() ([]byte, error) { + type Alias TrackInfo + return json.Marshal(&struct { + Length int64 `json:"length"` + *Alias + }{ + Length: int64(t.Length / time.Millisecond), + Alias: (*Alias)(t), + }) +} + +func (t *TrackInfo) UnmarshalJSON(data []byte) error { + type Alias TrackInfo + aux := &struct { + Length int64 `json:"length"` + *Alias + }{ + Alias: (*Alias)(t), + } + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + t.Length = time.Duration(aux.Length) * time.Millisecond + return nil } const ( diff --git a/model_test.go b/model_test.go new file mode 100644 index 0000000..0a4bcd3 --- /dev/null +++ b/model_test.go @@ -0,0 +1,33 @@ +package gavalink + +import ( + "encoding/json" + "testing" + "time" +) + +func TestTrackInfo_JSON(t *testing.T) { + i := &TrackInfo{ + Length: 10 * time.Second, + } + + b, err := json.Marshal(i) + + if err != nil { + t.Fatal(err) + } + + t.Log(string(b)) + + deserialize := &TrackInfo{} + + if err = json.Unmarshal(b, &deserialize); err != nil { + t.Fatal(err) + } + + t.Log("Deserialized length:", deserialize.Length) + + if deserialize.Length != time.Second*10 { + t.Fatal("Expected deserialized time to be 10 seconds!") + } +}