fix: Handle musicex tag correctly

This commit is contained in:
鲁树人
2025-09-15 21:35:12 +09:00
parent e4bfefd0a6
commit aea3bd5714
2 changed files with 20 additions and 10 deletions

View File

@@ -137,10 +137,10 @@ func (d *Decoder) searchKey() (err error) {
d.decodedKey, err = deriveKey([]byte(key))
if err == nil {
d.audioLen = fileSize
return nil
} else {
d.decodedKey = nil
d.logger.Warn("could not derive key, skip", zap.Error(err))
}
d.decodedKey = nil
d.logger.Warn("could not derive key, skip", zap.Error(err))
}
suffixBuf := make([]byte, 4)
@@ -153,7 +153,7 @@ 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
// speculative guess for "musicex\0"
case "cex\x00":
footer, err := NewMusicExTag(d.raw)
if err != nil {
@@ -161,17 +161,26 @@ func (d *Decoder) searchKey() (err error) {
}
d.audioLen = fileSize - int(footer.TagSize)
if key, ok := d.params.CryptoParams.QmcKeys.Get(footer.MediaFileName); ok {
d.logger.Debug("searchKey: using key from MediaFileName", zap.String("MediaFileName", footer.MediaFileName), zap.String("key", key))
d.decodedKey, err = deriveKey([]byte(key))
} else if d.decodedKey == nil {
return errors.New("searchKey: no key found for musicex tag")
}
return err
default:
size := binary.LittleEndian.Uint32(suffixBuf)
// if we already have a key from legacy mmkv, use it
if d.decodedKey != nil {
return nil
}
// try to use suffix as key length
size := binary.LittleEndian.Uint32(suffixBuf)
if size <= 0xFFFF && size != 0 { // assume size is key len
return d.readRawKey(int64(size))
}
// try to use default static cipher
// try to use default static cipher,
// or the key read from the legacy mmkv
d.audioLen = fileSize
return nil
}