def get_events_for_date_api(target_date=None): """ Fetches events for a specific date from Google Calendar using the Calendar API. Args: target_date: datetime.date object for the target day. If None, uses today. Returns: List of event dictionaries, or None if API call fails. """ service = get_calendar_service() if not service: return None day_start, day_end, target_date, tz_name, local = _get_local_time_range(target_date) print(f"\n[GCal API] Fetching events for {target_date.strftime('%Y-%m-%d')}") print(f" Timezone: {tz_name}") # Get calendar IDs from environment, or use primary calendar_ids_str = os.getenv('GCAL_CALENDAR_IDS', '') if calendar_ids_str: calendar_ids = [cid.strip() for cid in calendar_ids_str.split(',')] else: calendar_ids = ['primary'] all_events = [] # Fetch from each calendar for calendar_id in calendar_ids: try: print(f"[GCal API] Fetching from calendar: {calendar_id}") # Call the Calendar API with timeoutlobally old_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(10) try: events_result = service.events().list( calendarId=calendar_id, timeMin=day_start.isoformat(), timeMax=day_end.isoformat(), singleEvents=True, orderBy='startTime' ).execute() finally: socket.setdefaulttimeout(old_timeout) events = events_result.get('items', []) print(f"[GCal API] Found {len(events)} event(s) in {calendar_id}") # Parse events for event in events: # Get start time start = event['start'].get('dateTime', event['start'].get('date')) end = event['end'].get('dateTime', event['end'].get('date')) # Parse datetime if 'T' in start: # DateTime start_dt = datetime.fromisoformat(start.replace('Z', '+00:00')) end_dt = datetime.fromisoformat(end.replace('Z', '+00:00')) # Convert to local timezone start_local = start_dt.astimezone(local) end_local = end_dt.astimezone(local) start_str = start_local.strftime("%H:%M") end_str = end_local.strftime("%H:%M") else: # All-day event start_str = "00:00" end_str = "23:59" all_events.append({ "title": event.get('summary', 'Untitled Event'), "start": start_str, "end": end_str, "location": event.get('location', ''), "description": event.get('description', '') }) except Exception as e: print(f"[GCal API] Error fetching from {calendar_id}: {e}") continue # Sort by start time all_events.sort(key=lambda x: x["start"]) print(f"[GCal API] Total events: {len(all_events)}") return all_events