Source code for scfile.formats.nbt.decoder
import gzip
import zstandard as zstd
from scfile import formats
from scfile.core import FileDecoder, NbtContent
from scfile.enums import ByteOrder, FileFormat
from .enums import Tag
from .io import NbtBufferIO
[docs]
class NbtDecoder(FileDecoder[NbtContent]):
format = FileFormat.NBT
order = ByteOrder.LITTLE
_content = NbtContent
[docs]
def as_json(self):
return self.convert_to(formats.json.JsonEncoder)
[docs]
def parse(self):
data = self._decompress()
stream = NbtBufferIO(data)
# Read root tag
tag = stream._read_tag()
if tag == Tag.END:
return
_ = stream._readutf8() # Skip name
self.data.value = stream._parse_tag(tag)
def _decompress(self):
data = self.read()
try:
# Gzip is standard nbt compression
data = gzip.decompress(data)
except Exception:
try:
# Some synced configs use zstd
data = zstd.decompress(data)
except Exception:
pass
return data