Navya-Sree commited on
Commit
100a76f
·
verified ·
1 Parent(s): 10844ac

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +129 -210
app.py CHANGED
@@ -1,229 +1,148 @@
1
  import os
2
  import json
3
- import time
4
- import streamlit as st
5
  from datetime import datetime, timedelta
6
- from streamlit_mic_recorder import mic_recorder
 
 
 
 
7
 
8
- # Create data directories
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  DATA_DIR = "data"
10
  os.makedirs(DATA_DIR, exist_ok=True)
11
- VOICE_DIR = os.path.join(DATA_DIR, "voice_notes")
12
- os.makedirs(VOICE_DIR, exist_ok=True)
13
- DATA_FILE = os.path.join(DATA_DIR, "reminders.json")
14
-
15
- # Initialize session state
16
- def init_session():
17
- if "reminders" not in st.session_state:
18
- st.session_state.reminders = load_reminders()
19
- if "ai_enabled" not in st.session_state:
20
- st.session_state.ai_enabled = True
21
- if "notifications" not in st.session_state:
22
- st.session_state.notifications = []
23
-
24
- # Data management
 
 
 
 
 
 
 
 
 
25
  def load_reminders():
26
  try:
27
- if os.path.exists(DATA_FILE):
28
- with open(DATA_FILE, "r") as f:
29
  return json.load(f)
30
  return []
31
- except json.JSONDecodeError:
32
  return []
33
 
34
- def save_reminders():
35
- with open(DATA_FILE, "w") as f:
36
- json.dump(st.session_state.reminders, f)
37
-
38
- # Voice functions
39
- def save_voice_note(audio_bytes, reminder_id):
40
- filename = f"{VOICE_DIR}/{reminder_id}_{int(time.time())}.wav"
41
- with open(filename, "wb") as f:
42
- f.write(audio_bytes)
43
- return filename
44
-
45
- def play_voice_note(path):
46
- if os.path.exists(path):
47
- with open(path, "rb") as f:
48
- audio_bytes = f.read()
49
- st.audio(audio_bytes, format="audio/wav")
50
- else:
51
- st.warning("Voice note file not found")
52
-
53
- # Simple AI function (no external dependencies)
54
- def generate_ai_response(title, description):
55
- return f"**AI Insights for '{title}'**:\n\nThis seems like an important task. Consider preparing in advance by gathering all necessary materials. Set multiple reminders if it's critical."
56
-
57
- # Main app
58
- def main():
59
- st.set_page_config(
60
- page_title="AI-Powered Reminder System",
61
- layout="wide",
62
- page_icon="⏰"
63
  )
64
- init_session()
65
-
66
- # Sidebar
67
- with st.sidebar:
68
- st.header("⚙️ System Settings")
69
- st.session_state.ai_enabled = st.checkbox("Enable AI Insights", value=True)
70
-
71
- st.divider()
72
-
73
- st.header("📝 Add New Reminder")
74
- with st.form("new_reminder", clear_on_submit=True):
75
- title = st.text_input("Title*", placeholder="What to remember?")
76
- description = st.text_area("Description", placeholder="Details...")
77
-
78
- col1, col2 = st.columns(2)
79
- due_date = col1.date_input("Date*", min_value=datetime.today())
80
- due_time = col2.time_input("Time*", value=datetime.now().time())
81
-
82
- priority = st.select_slider("Priority", ["Low", "Medium", "High"], value="Medium")
83
- voice_note = st.checkbox("Add Voice Reminder")
84
-
85
- # Voice recorder
86
- audio_bytes = None
87
- if voice_note:
88
- audio = mic_recorder(
89
- start_prompt="⏺️ Start Recording",
90
- stop_prompt="⏹️ Stop Recording",
91
- key=f"recorder_{int(time.time())}"
92
- )
93
- if audio and 'bytes' in audio:
94
- audio_bytes = audio['bytes']
95
- if audio_bytes:
96
- st.audio(audio_bytes, format="audio/wav")
97
-
98
- submitted = st.form_submit_button("Create Reminder")
99
- if submitted and title:
100
- new_reminder = {
101
- "id": int(time.time() * 1000),
102
- "title": title,
103
- "description": description,
104
- "due_date": str(due_date),
105
- "due_time": due_time.strftime("%H:%M"),
106
- "priority": priority,
107
- "created_at": str(datetime.now()),
108
- "completed": False,
109
- "voice_note": ""
110
- }
111
-
112
- if voice_note and audio_bytes:
113
- voice_path = save_voice_note(audio_bytes, new_reminder["id"])
114
- new_reminder["voice_note"] = voice_path
115
-
116
- if st.session_state.ai_enabled:
117
- new_reminder["ai_insights"] = generate_ai_response(title, description)
118
-
119
- st.session_state.reminders.append(new_reminder)
120
- save_reminders()
121
- st.success("Reminder created successfully!")
122
-
123
- # Main interface
124
- st.title("⏰ AI-Powered Reminder System")
125
-
126
- # Dashboard
127
- col1, col2, col3 = st.columns(3)
128
- pending = sum(1 for r in st.session_state.reminders if not r.get('completed', False))
129
- high_priority = sum(1 for r in st.session_state.reminders if not r.get('completed', False) and r.get('priority') == "High")
130
-
131
- with col1:
132
- st.metric("Total Reminders", len(st.session_state.reminders))
133
- with col2:
134
- st.metric("Pending Tasks", pending)
135
- with col3:
136
- st.metric("High Priority", high_priority)
137
 
138
- # Calendar view
139
- with st.expander("📅 Calendar View", expanded=True):
140
- selected_date = st.date_input("View reminders for", value=datetime.today(), key="calendar_date")
141
- date_reminders = [r for r in st.session_state.reminders
142
- if datetime.strptime(r["due_date"], "%Y-%m-%d").date() == selected_date]
143
-
144
- if not date_reminders:
145
- st.info("No reminders for selected date")
146
- else:
147
- for r in date_reminders:
148
- with st.container(border=True):
149
- cols = st.columns([0.7, 3, 1])
150
- cols[0].checkbox(
151
- f"Done {r['id']}",
152
- value=r.get("completed", False),
153
- key=f"completed_{r['id']}",
154
- on_change=lambda id=r['id']: update_completion(id)
155
- )
156
-
157
- with cols[1]:
158
- st.subheader(r["title"])
159
- st.caption(f"⏰ {r['due_time']} | {r['priority']} priority")
160
-
161
- if r.get("description"):
162
- st.write(r["description"])
163
-
164
- if r.get("voice_note"):
165
- st.write("Voice Reminder:")
166
- play_voice_note(r["voice_note"])
167
-
168
- if st.session_state.ai_enabled and r.get("ai_insights"):
169
- with st.expander("🤖 AI Insights"):
170
- st.write(r["ai_insights"])
171
-
172
- with cols[2]:
173
- if st.button("🗑️", key=f"delete_{r['id']}"):
174
- delete_reminder(r["id"])
175
 
176
- # Upcoming reminders
177
- st.subheader("🚨 Upcoming Alerts (Next 7 Days)")
178
- today = datetime.today().date()
179
- next_week = today + timedelta(days=7)
180
 
181
- upcoming = sorted(
182
- [r for r in st.session_state.reminders
183
- if not r.get('completed', False) and
184
- today <= datetime.strptime(r["due_date"], "%Y-%m-%d").date() <= next_week],
185
- key=lambda x: (x["due_date"], x["due_time"])
186
- )
 
187
 
188
- if not upcoming:
189
- st.info("No upcoming reminders in the next week")
190
- else:
191
- for r in upcoming:
192
- due_date = datetime.strptime(r["due_date"], "%Y-%m-%d").date()
193
- days_left = (due_date - today).days
194
- days_text = "today" if days_left == 0 else f"in {days_left} days"
195
-
196
- with st.container(border=True):
197
- cols = st.columns([3, 1])
198
- cols[0].subheader(r["title"])
199
- cols[0].caption(f"📅 {r['due_date']} at {r['due_time']} ({days_text}) | {r['priority']} priority")
200
-
201
- if r.get("description"):
202
- cols[0].write(r["description"])
203
-
204
- with cols[1]:
205
- if st.button("Complete", key=f"complete_{r['id']}"):
206
- complete_reminder(r['id'])
207
-
208
- # Helper functions
209
- def update_completion(reminder_id):
210
- for r in st.session_state.reminders:
211
- if r["id"] == reminder_id:
212
- r["completed"] = st.session_state[f"completed_{reminder_id}"]
213
- if r['completed']:
214
- r['completion_time'] = str(datetime.now())
215
- save_reminders()
216
-
217
- def complete_reminder(reminder_id):
218
- for r in st.session_state.reminders:
219
- if r["id"] == reminder_id:
220
- r["completed"] = True
221
- r['completion_time'] = str(datetime.now())
222
- save_reminders()
223
-
224
- def delete_reminder(reminder_id):
225
- st.session_state.reminders = [r for r in st.session_state.reminders if r["id"] != reminder_id]
226
- save_reminders()
227
 
228
  if __name__ == "__main__":
229
- main()
 
 
1
  import os
2
  import json
3
+ import uuid
4
+ import base64
5
  from datetime import datetime, timedelta
6
+ from fastapi import FastAPI, HTTPException, Request
7
+ from fastapi.staticfiles import StaticFiles
8
+ from fastapi.middleware.cors import CORSMiddleware
9
+ from fastapi.responses import HTMLResponse, FileResponse
10
+ from pydantic import BaseModel
11
 
12
+ app = FastAPI()
13
+
14
+ # Mount static files
15
+ app.mount("/static", StaticFiles(directory="static"), name="static")
16
+
17
+ # Enable CORS
18
+ app.add_middleware(
19
+ CORSMiddleware,
20
+ allow_origins=["*"],
21
+ allow_methods=["*"],
22
+ allow_headers=["*"],
23
+ )
24
+
25
+ # Data storage
26
  DATA_DIR = "data"
27
  os.makedirs(DATA_DIR, exist_ok=True)
28
+ REMINDERS_FILE = os.path.join(DATA_DIR, "reminders.json")
29
+
30
+ # Data models
31
+ class Reminder(BaseModel):
32
+ id: str
33
+ title: str
34
+ description: str
35
+ due_date: str
36
+ due_time: str
37
+ priority: str
38
+ created_at: str
39
+ completed: bool
40
+ voice_note: str = ""
41
+
42
+ class CreateReminderRequest(BaseModel):
43
+ title: str
44
+ description: str
45
+ due_date: str
46
+ due_time: str
47
+ priority: str
48
+ voice_note: str = ""
49
+
50
+ # Load/save reminders
51
  def load_reminders():
52
  try:
53
+ if os.path.exists(REMINDERS_FILE):
54
+ with open(REMINDERS_FILE, "r") as f:
55
  return json.load(f)
56
  return []
57
+ except:
58
  return []
59
 
60
+ def save_reminders(reminders):
61
+ with open(REMINDERS_FILE, "w") as f:
62
+ json.dump(reminders, f)
63
+
64
+ # API endpoints
65
+ @app.get("/", response_class=HTMLResponse)
66
+ async def read_index():
67
+ return FileResponse("index.html")
68
+
69
+ @app.get("/api/reminders")
70
+ async def get_reminders():
71
+ return load_reminders()
72
+
73
+ @app.post("/api/reminders")
74
+ async def create_reminder(request: CreateReminderRequest):
75
+ reminders = load_reminders()
76
+ new_reminder = Reminder(
77
+ id=str(uuid.uuid4()),
78
+ title=request.title,
79
+ description=request.description,
80
+ due_date=request.due_date,
81
+ due_time=request.due_time,
82
+ priority=request.priority,
83
+ created_at=datetime.now().isoformat(),
84
+ completed=False,
85
+ voice_note=request.voice_note
 
 
 
86
  )
87
+ reminders.append(new_reminder.dict())
88
+ save_reminders(reminders)
89
+ return new_reminder
90
+
91
+ @app.put("/api/reminders/{reminder_id}")
92
+ async def update_reminder(reminder_id: str, request: Request):
93
+ data = await request.json()
94
+ reminders = load_reminders()
95
+ for r in reminders:
96
+ if r["id"] == reminder_id:
97
+ r.update(data)
98
+ save_reminders(reminders)
99
+ return r
100
+ raise HTTPException(status_code=404, detail="Reminder not found")
101
+
102
+ @app.delete("/api/reminders/{reminder_id}")
103
+ async def delete_reminder(reminder_id: str):
104
+ reminders = load_reminders()
105
+ reminders = [r for r in reminders if r["id"] != reminder_id]
106
+ save_reminders(reminders)
107
+ return {"status": "success"}
108
+
109
+ # AI insights endpoint
110
+ @app.post("/api/ai-insights")
111
+ async def get_ai_insights(request: Request):
112
+ data = await request.json()
113
+ title = data.get("title", "")
114
+ description = data.get("description", "")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
+ # Simple AI logic
117
+ return {
118
+ "insights": f"**AI Insights for '{title}'**:\n\n"
119
+ f"This seems like an important task. Consider preparing in advance by gathering all necessary materials. "
120
+ f"Set multiple reminders if it's critical. {'You provided detailed notes - good job!' if description else ''}"
121
+ }
122
+
123
+ # Voice notes endpoint
124
+ @app.post("/api/save-voice-note")
125
+ async def save_voice_note(request: Request):
126
+ data = await request.json()
127
+ audio_data = data.get("audio_data")
128
+ if not audio_data:
129
+ raise HTTPException(status_code=400, detail="No audio data provided")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
+ # Save audio to file
132
+ os.makedirs("static/voice_notes", exist_ok=True)
133
+ filename = f"voice_note_{uuid.uuid4()}.wav"
134
+ filepath = os.path.join("static", "voice_notes", filename)
135
 
136
+ # Decode base64 audio data
137
+ try:
138
+ audio_bytes = base64.b64decode(audio_data.split(",")[1])
139
+ with open(filepath, "wb") as f:
140
+ f.write(audio_bytes)
141
+ except:
142
+ raise HTTPException(status_code=500, detail="Failed to save audio")
143
 
144
+ return {"path": f"/static/voice_notes/{filename}"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  if __name__ == "__main__":
147
+ import uvicorn
148
+ uvicorn.run(app, host="0.0.0.0", port=8501)