Source code for scfile.formats.nbt.decoder

import gzip

import zstandard as zstd

from scfile.core import FileDecoder, NbtContent
from scfile.core.io import StructFileIO
from scfile.enums import ByteOrder, FileFormat

from .enums import Tag
from .io import NbtBytesIO


[docs] class NbtDecoder(FileDecoder[NbtContent], StructFileIO): format = FileFormat.NBT order = ByteOrder.LITTLE _content = NbtContent
[docs] def to_json(self): from scfile.formats.json.encoder import JsonEncoder return self.convert_to(JsonEncoder)
[docs] def parse(self): data = self._decompress() stream = NbtBytesIO(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