mirror of
https://git.um-react.app/um/cli.git
synced 2025-11-28 03:33:02 +00:00
refactor: use io.Reader instead of custom method
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package kgm
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
@@ -9,64 +8,48 @@ import (
|
||||
)
|
||||
|
||||
type Decoder struct {
|
||||
header Header
|
||||
initializer kgmCryptoInitializer
|
||||
header header
|
||||
cipher common.StreamDecoder
|
||||
|
||||
file []byte
|
||||
audio []byte
|
||||
rd io.ReadSeeker
|
||||
offset int
|
||||
}
|
||||
|
||||
type kgmCryptoInitializer func(header *Header, body io.Reader) (io.Reader, error)
|
||||
func NewDecoder(rd io.ReadSeeker) common.Decoder {
|
||||
return &Decoder{rd: rd}
|
||||
}
|
||||
|
||||
var kgmCryptoInitializers = map[uint32]kgmCryptoInitializer{
|
||||
var kgmCryptoInitializers = map[uint32]func(header *header) (common.StreamDecoder, error){
|
||||
3: newKgmCryptoV3,
|
||||
}
|
||||
|
||||
func NewDecoder(file []byte) common.Decoder {
|
||||
return &Decoder{
|
||||
file: file,
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Decoder) GetAudioData() []byte {
|
||||
return d.audio
|
||||
}
|
||||
|
||||
func (d *Decoder) GetAudioExt() string {
|
||||
return "" // use sniffer
|
||||
}
|
||||
|
||||
func (d *Decoder) GetMeta() common.Meta {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Decoder) Validate() error {
|
||||
if err := d.header.FromBytes(d.file); err != nil {
|
||||
if err := d.header.FromFile(d.rd); err != nil {
|
||||
return err
|
||||
}
|
||||
// TODO; validate crypto version
|
||||
|
||||
var ok bool
|
||||
d.initializer, ok = kgmCryptoInitializers[d.header.CryptoVersion]
|
||||
initializer, ok := kgmCryptoInitializers[d.header.CryptoVersion]
|
||||
if !ok {
|
||||
return fmt.Errorf("kgm: unsupported crypto version %d", d.header.CryptoVersion)
|
||||
}
|
||||
|
||||
var err error
|
||||
d.cipher, err = initializer(&d.header)
|
||||
if err != nil {
|
||||
return fmt.Errorf("kgm: failed to initialize crypto: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Decoder) Decode() error {
|
||||
d.audio = d.file[d.header.AudioOffset:]
|
||||
|
||||
r, err := d.initializer(&d.header, bytes.NewReader(d.audio))
|
||||
if err != nil {
|
||||
return fmt.Errorf("kgm: failed to initialize crypto: %w", err)
|
||||
func (d *Decoder) Read(buf []byte) (int, error) {
|
||||
n, err := d.rd.Read(buf)
|
||||
if n > 0 {
|
||||
d.cipher.Decrypt(buf[:n], d.offset)
|
||||
d.offset += n
|
||||
}
|
||||
d.audio, err = io.ReadAll(r)
|
||||
if err != nil {
|
||||
return fmt.Errorf("kgm: failed to decrypt audio: %w", err)
|
||||
}
|
||||
return nil
|
||||
return n, err
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
||||
Reference in New Issue
Block a user