99 lines
2.0 KiB
Go
99 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/wailsapp/wails/v2/pkg/runtime"
|
|
|
|
"git.taurusxin.com/taurusxin/ncmdump-go/ncmcrypt"
|
|
)
|
|
|
|
// App struct
|
|
type App struct {
|
|
ctx context.Context
|
|
}
|
|
|
|
// NewApp creates a new App application struct
|
|
func NewApp() *App {
|
|
return &App{}
|
|
}
|
|
|
|
// startup is called when the app starts. The context is saved
|
|
// so we can call the runtime methods
|
|
func (a *App) startup(ctx context.Context) {
|
|
a.ctx = ctx
|
|
}
|
|
|
|
// select files to dump
|
|
func (a *App) SelectFiles() []string {
|
|
selection, err := runtime.OpenMultipleFilesDialog(a.ctx, runtime.OpenDialogOptions{
|
|
Title: "请选择文件",
|
|
Filters: []runtime.FileFilter{
|
|
{
|
|
DisplayName: "NCM Files",
|
|
Pattern: "*.ncm",
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
return []string{}
|
|
}
|
|
return selection
|
|
}
|
|
|
|
func (a *App) SelectFolder() string {
|
|
folder, err := runtime.OpenDirectoryDialog(a.ctx, runtime.OpenDialogOptions{
|
|
Title: "请选择保存目录",
|
|
})
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return folder
|
|
}
|
|
|
|
type Status = string
|
|
|
|
const (
|
|
Pending Status = "pending"
|
|
Processing Status = "processing"
|
|
Done Status = "done"
|
|
Error Status = "error"
|
|
)
|
|
|
|
type NcmFile struct {
|
|
Name string
|
|
Status Status
|
|
}
|
|
|
|
// process single file
|
|
func (a *App) processFile(file string, index int, savePath string) {
|
|
runtime.EventsEmit(a.ctx, "file-status-changed", index, Processing)
|
|
ncm, err := ncmcrypt.NewNeteaseCloudMusic(file)
|
|
if err != nil {
|
|
runtime.EventsEmit(a.ctx, "file-status-changed", index, Error)
|
|
return
|
|
}
|
|
dumpResult, err := ncm.Dump(savePath)
|
|
if err != nil {
|
|
runtime.EventsEmit(a.ctx, "file-status-changed", index, Error)
|
|
return
|
|
}
|
|
if dumpResult {
|
|
_, err := ncm.FixMetadata(true)
|
|
if err != nil {
|
|
runtime.EventsEmit(a.ctx, "file-status-changed", index, Error)
|
|
return
|
|
}
|
|
runtime.EventsEmit(a.ctx, "file-status-changed", index, Done)
|
|
}
|
|
}
|
|
|
|
// process files
|
|
func (a *App) ProcessFiles(files []NcmFile, savePath string) {
|
|
for index, file := range files {
|
|
if file.Status == Pending {
|
|
go a.processFile(file.Name, index, savePath)
|
|
}
|
|
}
|
|
}
|