class Twitch(object):
    RING_BUFFER_SIZE_KEY = 'ringbuffer-size'
    OAUTH_TOKEN_KEY = 'oauth_token'
    LIVESTREAMER_PLUGIN_TWITCH = 'twitch'

    def __init__(self, buffer_size, resolution, oauth, channel):
        self.oauth = oauth
        self.resolution = resolution
        self.channel = channel

        self.buffer_size = buffer_size
        self.buffer = RingBuffer(buffer_size=buffer_size)

        self.initialized = False
        self.stream = None

    def __del__(self):
        if self.initialized:
            self.stream.close()

    def initialize(self):
        self.buffer.clear()
        stream = self._init_stream(self.oauth, self.channel)
        if stream:
            self.initialized = True
            self.stream = stream.open()

    def get_stream_data(self):
        if not self.initialized:
            print('Read: Try to initialize')
            self.initialize()
            raise StreamBufferIsEmptyException

        return self.buffer.read_all()

    def update_stream_data(self):
        if self.initialized:
            data = self.stream.read(self.buffer_size)
            print('Update: {length}'.format(length=len(data)))

            if len(data) != 0:
                self.buffer.write(data)
            else:
                print('Update: Try to initialize')
                self.initialize()

        else:
            print('Update: Try to initialize')
            self.initialize()

    def stream_initialized(self):
        return self.stream is not None

    def _init_stream(self, oauth, channel):
        session = Livestreamer()

        session.set_plugin_option(self.LIVESTREAMER_PLUGIN_TWITCH,
                                  self.OAUTH_TOKEN_KEY, oauth)
        session.set_option(self.RING_BUFFER_SIZE_KEY, self.buffer_size)

        streams = session.streams(self._generate_stream_url(channel))
        return streams.get(self.resolution)

    @staticmethod
    def _generate_stream_url(channel):
        return 'https://www.twitch.tv/{channel}'.format(channel=channel)