'Creates a new CrunchyrollAPI object, initiates it\'s session and
tries to authenticate it either by using saved credentials or the
user\'s username and password.'

def _create_api(self):

    if self.options.get('purge_credentials'):
        self.cache.set('session_id', None, 0)
        self.cache.set('auth', None, 0)
    current_time = datetime.datetime.utcnow()
    device_id = self._get_device_id()
    locale = self.options.get('locale')
    api = CrunchyrollAPI(self.cache.get('session_id'), self.cache.get('auth'), locale)
    self.logger.debug('Creating    session')
    try:
        api.session_id = api.start_session(device_id, schema=_session_schema)
    except CrunchyrollAPIError as err:
        if (err.code == 'bad_session'):
            self.logger.debug('Current    session    has    expired,    creating    a    new    one')
            api = CrunchyrollAPI(locale=locale)
            api.session_id = api.start_session(device_id, schema=_session_schema)
        else:
            raise err
    self.cache.set('session_id', api.session_id, ((4 * 60) * 60))
    self.logger.debug('Session    created')
    if api.auth:
        self.logger.debug('Using    saved    credentials')
    elif self.options.get('username'):
        try:
            self.logger.info('Attempting    to    login    using    username    and    password')
            login = api.login(self.options.get('username'), self.options.get('password'), schema=_login_schema)
            api.auth = login['auth']
            self.logger.info("Successfully    logged    in    as    '{0}'", login['user']['username'])
            expires = (login['expires'] - current_time).total_seconds()
            self.cache.set('auth', login['auth'], expires)
        except CrunchyrollAPIError as err:
            raise PluginError(u'Authentication    error:    {0}'.format(err.msg))
    else:
        self.logger.warning("No    authentication    provided,    you    won't    be    able    to    access    premium    restricted    content")
    return api
