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