refactor: improve mmkv logic

This commit is contained in:
鲁树人
2025-09-06 23:44:07 +09:00
parent 92ad51402e
commit 9b0455b0fd
10 changed files with 216 additions and 160 deletions

View File

@@ -6,7 +6,6 @@ import (
"errors"
"fmt"
"io"
"runtime"
"strconv"
"strings"
@@ -133,14 +132,15 @@ func (d *Decoder) searchKey() (err error) {
}
fileSize := int(fileSizeM4) + 4
//goland:noinspection GoBoolExpressions
if runtime.GOOS == "darwin" && !strings.HasPrefix(d.params.Extension, ".qmc") {
d.decodedKey, err = readKeyFromMMKV(d.params.FilePath, d.logger)
if key, ok := d.params.CryptoParams.QmcKeys.Get(d.params.FilePath); ok {
d.logger.Debug("QQMusic Mac Legacy file", zap.String("file", d.params.FilePath), zap.String("key", key))
d.decodedKey, err = deriveKey([]byte(key))
if err == nil {
d.audioLen = fileSize
return
return nil
}
d.logger.Warn("read key from mmkv failed", zap.Error(err))
d.decodedKey = nil
d.logger.Warn("could not derive key, skip", zap.Error(err))
}
suffixBuf := make([]byte, 4)
@@ -153,17 +153,17 @@ func (d *Decoder) searchKey() (err error) {
return d.readRawMetaQTag()
case "STag":
return errors.New("qmc: file with 'STag' suffix doesn't contains media key")
// MusicEx\0
case "cex\x00":
footer, err := NewMusicExTag(d.raw)
if err != nil {
return err
}
d.audioLen = fileSize - int(footer.TagSize)
d.decodedKey, err = readKeyFromMMKVCustom(footer.MediaFileName)
if err != nil {
return err
if key, ok := d.params.CryptoParams.QmcKeys.Get(footer.MediaFileName); ok {
d.decodedKey, err = deriveKey([]byte(key))
}
return nil
return err
default:
size := binary.LittleEndian.Uint32(suffixBuf)