Files
ncmdump-go-wasm/cmd/wasm/main.go
T
2026-06-08 22:09:35 +08:00

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 {}
}