def __init__()

in Firmware/RaspberryPi/animation.py [0:0]


    def __init__(self, data):
        offset = 0

        if not data:
            self.id = str(uuid4()).replace('-', '')
            self.utc = int(datetime.utcnow().timestamp()) 
            self.data = []
            self.palette = []
            self.frame_rate = 20
            self.frames_count = 0
            self.loop_count = 1
            self.name = ''
            return

        animation_id = ''.join(list(f'{ch:02x}' for ch in data[:16]))
        offset += 16

        # header
        utc, offset = self._read_uint32(data, offset)
        frames_size, offset = self._read_uint32(data, offset)

        palette_count, offset = self._read_uint16(data, offset)
        frame_count, offset = self._read_uint16(data, offset)

        frame_rate, offset = self._read_uint8(data, offset)
        loop_count, offset = self._read_uint8(data, offset)
        name_length, offset = self._read_uint8(data, offset)
        
        pad, offset = self._read_uint8(data, offset)

        name = ''.join(chr(ch) for ch in data[offset : offset + name_length])
        offset += name_length

        # palette bytes
        palette = []
        for i in range(palette_count):
            r, offset = self._read_uint8(data, offset)
            g, offset = self._read_uint8(data, offset)
            b, offset = self._read_uint8(data, offset)
            palette.append(Color(r, g, b))
        
        # frame_data = data[offset:]
        frames = []
        for i in range(frame_count):
            frame = None
            frame_type, offset = self._read_uint8(data, offset)
            if frame_type == ord('I'):
                count, offset = self._read_uint16_be(data, offset)
                frame_data = []
                for j in range(count):
                    index, offset = self._read_uint8(data, offset)
                    frame_data.append(index)
                frame = IFrame(frame_type, count, frame_data)
            elif frame_type == ord('P'):
                count, offset = self._read_uint16_be(data, offset)
                frame_data = []
                for j in range(count):
                    pixel_index, offset = self._read_uint16_be(data, offset)
                    palette_index, offset = self._read_uint8(data, offset)
                    frame_data.append(PFrameData(pixel_index, palette_index))
                frame = PFrame(frame_type, count, frame_data)
            elif frame_type == ord('D'):
                delay, offset = self._read_uint16_be(data, offset)
                frame = DFrame(frame_type, delay)
            elif frame_type == ord('F'):
                fade, offset = self._read_uint16_be(data, offset)
                frame = FFrame(frame_type, fade)
            else:
                raise ("Unknown frame type")
            frames.append(frame)

        self.id = animation_id
        self.utc = utc 
        self.data = frames
        self.palette = palette
        self.frame_rate = frame_rate
        self.frames_count = frame_count
        self.loop_count = max(loop_count, 1)
        self.name = name