A wrapper for events().instances. Returns the list of recurring events for the given calendar alias within the specified timeframe.

def get_recurring_events(self, calendar_id, event_id, start_time, end_time, maxResults = None):
        '''A wrapper for events().instances. Returns the list of recurring events for the given calendar alias within the specified timeframe.'''
        es = []
        page_token = None
        while True:
            events = self.service.events().instances(calendarId = self.configured_calendar_ids[calendar_id], eventId = event_id, pageToken=page_token, timeMin = start_time, timeMax = end_time, maxResults = maxResults, showDeleted = False).execute()
            for event in events['items']:
                dt = None
                nb = DeepNonStrictNestedBunch(event)
                assert(not(nb._event))
                nb._event = event # keep the original event as returned in case we want to reuse it e.g. insert it into another calendar
                if nb.start.date:
                    dt = dateutil.parser.parse(nb.start.date + 'T00:00:00-08:00')
                elif nb.start.dateTime:
                    dt = dateutil.parser.parse(nb.start.dateTime)
                nb.datetime_o = dt
                nb.calendar_id = calendar_id
                es.append(nb)
            page_token = events.get('nextPageToken')
            if not page_token:
                break
        return es