python from flask import Flask, render_template, request, jsonify, send_file from ics import Calendar, Event from datetime import datetime import io app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/generate', methods=['POST']) def generate_ics(): try: data = request.get_json() events_data = data.get('events', []) cal = Calendar() for event_data in events_data: event = Event() event.name = event_data.get('title', 'Untitled Event') event.location = event_data.get('location', '') event.description = event_data.get('description', '') # Parse dates based on all-day flag is_all_day = event_data.get('allDay', False) if is_all_day: start_str = event_data.get('start') end_str = event_data.get('end') # Parse date strings (format depends on browser locale) start_date = datetime.strptime(start_str.split('T')[0], '%Y-%m-%d').date() end_date = datetime.strptime(end_str.split('T')[0], '%Y-%m-%d').date() event.begin = start_date event.end = end_date event.all_day = True else: # Parse datetime strings start_str = event_data.get('start') end_str = event_data.get('end') # Handle different datetime formats from different browsers for fmt in ('%Y-%m-%dT%H:%M', '%m/%d/%Y, %I:%M:%S %p', '%Y-%m-%d %H:%M:%S'): try: start_dt = datetime.strptime(start_str, fmt) end_dt = datetime.strptime(end_str, fmt) event.begin = start_dt event.end = end_dt break except ValueError: continue cal.events.add(event) # Create in-memory file ics_file = io.BytesIO() ics_file.write(str(cal).encode('utf-8')) ics_file.seek(0) return send_file( ics_file, as_attachment=True, download_name='calendar_events.ics', mimetype='text/calendar' ) except Exception as e: print(f"Error generating ICS: {str(e)}") return jsonify({'error': str(e)}), 500 if __name__ == '__main__': app.run(debug=True)