115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
//go:build js && wasm
|
|
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"syscall/js"
|
|
|
|
"git.taurusxin.com/taurusxin/ncmdump-go/ncmcrypt"
|
|
)
|
|
|
|
func convertNcm(this js.Value, args []js.Value) interface{} {
|
|
if len(args) < 1 {
|
|
return errorResult("no data provided")
|
|
}
|
|
|
|
dataLen := args[0].Get("byteLength").Int()
|
|
if dataLen == 0 {
|
|
return errorResult("empty data")
|
|
}
|
|
|
|
data := make([]byte, dataLen)
|
|
js.CopyBytesToGo(data, args[0])
|
|
|
|
ncm, err := ncmcrypt.NewNeteaseCloudMusicFromBytes(data)
|
|
if err != nil {
|
|
return errorResult(err.Error())
|
|
}
|
|
defer ncm.Close()
|
|
|
|
var buf bytes.Buffer
|
|
if err := ncm.DumpStream(&buf, nil); err != nil {
|
|
return errorResult(err.Error())
|
|
}
|
|
|
|
format := ncm.GetFormat()
|
|
result := js.Global().Get("Uint8Array").New(js.ValueOf(buf.Len()))
|
|
js.CopyBytesToJS(result, buf.Bytes())
|
|
|
|
meta := ncm.GetMetadata()
|
|
|
|
return js.ValueOf(map[string]interface{}{
|
|
"data": result,
|
|
"format": format,
|
|
"title": meta["title"],
|
|
"artist": meta["artist"],
|
|
"album": meta["album"],
|
|
"coverUrl": meta["coverUrl"],
|
|
})
|
|
}
|
|
|
|
func embedMetadata(this js.Value, args []js.Value) interface{} {
|
|
if len(args) < 2 {
|
|
return errorResult("insufficient arguments")
|
|
}
|
|
|
|
audioLen := args[0].Get("byteLength").Int()
|
|
audio := make([]byte, audioLen)
|
|
js.CopyBytesToGo(audio, args[0])
|
|
|
|
format := args[1].String()
|
|
title := ""
|
|
artist := ""
|
|
album := ""
|
|
var coverData []byte
|
|
|
|
if len(args) > 2 && args[2].Type() == js.TypeObject {
|
|
opts := args[2]
|
|
if v := opts.Get("title"); v.Type() == js.TypeString {
|
|
title = v.String()
|
|
}
|
|
if v := opts.Get("artist"); v.Type() == js.TypeString {
|
|
artist = v.String()
|
|
}
|
|
if v := opts.Get("album"); v.Type() == js.TypeString {
|
|
album = v.String()
|
|
}
|
|
if v := opts.Get("coverData"); v.Type() != js.TypeUndefined && v.Type() != js.TypeNull {
|
|
coverLen := v.Get("byteLength").Int()
|
|
coverData = make([]byte, coverLen)
|
|
js.CopyBytesToGo(coverData, v)
|
|
}
|
|
}
|
|
|
|
result, err := ncmcrypt.EmbedMetadata(audio, format, title, artist, album, coverData)
|
|
if err != nil {
|
|
return errorResult(err.Error())
|
|
}
|
|
|
|
out := js.Global().Get("Uint8Array").New(js.ValueOf(len(result)))
|
|
js.CopyBytesToJS(out, result)
|
|
return js.ValueOf(map[string]interface{}{
|
|
"data": out,
|
|
"format": format,
|
|
})
|
|
}
|
|
|
|
func errorResult(msg string) js.Value {
|
|
return js.ValueOf(map[string]interface{}{
|
|
"error": msg,
|
|
})
|
|
}
|
|
|
|
func main() {
|
|
js.Global().Set("ncmdumpConvert", js.FuncOf(convertNcm))
|
|
js.Global().Set("ncmdumpEmbed", js.FuncOf(embedMetadata))
|
|
|
|
ready := js.Global().Get("ncmdumpOnReady")
|
|
if ready.Type() == js.TypeFunction {
|
|
ready.Invoke()
|
|
}
|
|
|
|
select {}
|
|
}
|