Isaac454 commited on
Commit
b38a110
Β·
verified Β·
1 Parent(s): 77854c5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -4
app.py CHANGED
@@ -2,6 +2,7 @@ import os
2
  import assemblyai as aai
3
  import gradio as gr
4
  import requests
 
5
  from supabase import create_client, Client
6
 
7
  # --------------------------------------------------
@@ -29,7 +30,54 @@ supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
29
  # --------------------------------------------------
30
  # In-memory session
31
  # --------------------------------------------------
32
- session = {"user": None, "user_id": None}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  # --------------------------------------------------
35
  # Auth functions
@@ -40,6 +88,7 @@ def signup(email, password):
40
  if res.user:
41
  session["user"] = res.user.email
42
  session["user_id"] = res.user.id
 
43
  return (
44
  "βœ… Signup successful.",
45
  gr.update(visible=False), # hide auth
@@ -55,6 +104,7 @@ def login(email, password):
55
  if res.user:
56
  session["user"] = res.user.email
57
  session["user_id"] = res.user.id
 
58
  return (
59
  "βœ… Login successful.",
60
  gr.update(visible=False), # hide auth
@@ -64,6 +114,19 @@ def login(email, password):
64
  except Exception as e:
65
  return f"❌ Login error: {str(e)}", gr.update(), gr.update()
66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  # --------------------------------------------------
68
  # Transcription logic
69
  # --------------------------------------------------
@@ -77,6 +140,10 @@ def transcribe(audio_path: str):
77
  return transcript.text, transcript.audio_duration
78
 
79
  def transcribe_audio(audio_file):
 
 
 
 
80
  if session["user_id"] is None:
81
  return "❌ Please log in."
82
 
@@ -84,6 +151,9 @@ def transcribe_audio(audio_file):
84
  return "⚠️ Please upload an audio file."
85
 
86
  try:
 
 
 
87
  # Transcribe audio
88
  text, duration_seconds = transcribe(audio_file)
89
  minutes_used = max(1, int(duration_seconds // 60))
@@ -91,6 +161,7 @@ def transcribe_audio(audio_file):
91
  # Save transcription
92
  supabase.table("transcriptions").insert({
93
  "user_id": session["user_id"],
 
94
  "audio_duration": minutes_used,
95
  "transcript": text
96
  }).execute()
@@ -130,7 +201,7 @@ def transcribe_audio(audio_file):
130
  with gr.Blocks() as app:
131
 
132
  # πŸ” AUTH SECTION
133
- with gr.Column(visible=True) as auth_section:
134
  gr.Markdown("## πŸ” Login or Signup")
135
  email = gr.Textbox(label="Email")
136
  password = gr.Textbox(label="Password", type="password")
@@ -141,9 +212,13 @@ with gr.Blocks() as app:
141
  signup_btn = gr.Button("Signup")
142
 
143
  # πŸŽ™οΈ TRANSCRIPTION SECTION (hidden initially)
144
- with gr.Column(visible=False) as transcription_section:
145
  gr.Markdown("## πŸŽ™οΈ AI Transcription")
146
  gr.Markdown("Upload audio β†’ get transcript")
 
 
 
 
147
  audio_input = gr.Audio(type="filepath", label="Upload Audio")
148
  output_text = gr.Textbox(label="Transcript", lines=10)
149
  transcribe_btn = gr.Button("Transcribe")
@@ -153,8 +228,12 @@ with gr.Blocks() as app:
153
  gr.Markdown("## πŸ“‹ Site Report Form")
154
  gr.HTML(
155
  '<iframe src="http://13.48.132.18:5678/form/SITEREPORT" '
156
- 'width="100%" height="700" frameborder="0" style="border: 1px solid #ccc; border-radius: 5px;"></iframe>'
 
 
157
  )
 
 
158
 
159
  # --------------------------------------------------
160
  # Button bindings
@@ -168,6 +247,11 @@ with gr.Blocks() as app:
168
  [email, password],
169
  [auth_status, auth_section, transcription_section]
170
  )
 
 
 
 
 
171
 
172
  # --------------------------------------------------
173
  # Launch
 
2
  import assemblyai as aai
3
  import gradio as gr
4
  import requests
5
+ import time
6
  from supabase import create_client, Client
7
 
8
  # --------------------------------------------------
 
30
  # --------------------------------------------------
31
  # In-memory session
32
  # --------------------------------------------------
33
+ INACTIVITY_TIMEOUT = 30 * 60 # 30 minutes in seconds
34
+ session = {"user": None, "user_id": None, "last_activity": None}
35
+
36
+ # --------------------------------------------------
37
+ # Check for existing Supabase session on startup
38
+ # --------------------------------------------------
39
+ def restore_session():
40
+ try:
41
+ user = supabase.auth.get_user()
42
+ if user and user.user:
43
+ session["user"] = user.user.email
44
+ session["user_id"] = user.user.id
45
+ return True
46
+ except Exception as e:
47
+ print(f"⚠️ Session restore error: {e}")
48
+ return False
49
+
50
+ # Restore session on app startup
51
+ restore_session()
52
+
53
+ # --------------------------------------------------
54
+ # Inactivity timeout check
55
+ # --------------------------------------------------
56
+ def check_inactivity():
57
+ """Check if user has been inactive for 30 mins, auto-logout if true"""
58
+ if session["user_id"] is None:
59
+ return False
60
+
61
+ if session["last_activity"] is None:
62
+ return False
63
+
64
+ elapsed = time.time() - session["last_activity"]
65
+ if elapsed > INACTIVITY_TIMEOUT:
66
+ # Auto logout
67
+ try:
68
+ supabase.auth.sign_out()
69
+ except:
70
+ pass
71
+ session["user"] = None
72
+ session["user_id"] = None
73
+ session["last_activity"] = None
74
+ return True # Timed out
75
+
76
+ return False
77
+
78
+ def update_activity():
79
+ """Update last activity timestamp"""
80
+ session["last_activity"] = time.time()
81
 
82
  # --------------------------------------------------
83
  # Auth functions
 
88
  if res.user:
89
  session["user"] = res.user.email
90
  session["user_id"] = res.user.id
91
+ session["last_activity"] = time.time()
92
  return (
93
  "βœ… Signup successful.",
94
  gr.update(visible=False), # hide auth
 
104
  if res.user:
105
  session["user"] = res.user.email
106
  session["user_id"] = res.user.id
107
+ session["last_activity"] = time.time()
108
  return (
109
  "βœ… Login successful.",
110
  gr.update(visible=False), # hide auth
 
114
  except Exception as e:
115
  return f"❌ Login error: {str(e)}", gr.update(), gr.update()
116
 
117
+ def logout():
118
+ try:
119
+ supabase.auth.sign_out()
120
+ session["user"] = None
121
+ session["user_id"] = None
122
+ return (
123
+ "βœ… Logged out successfully.",
124
+ gr.update(visible=True), # show auth
125
+ gr.update(visible=False) # hide transcription
126
+ )
127
+ except Exception as e:
128
+ return f"❌ Logout error: {str(e)}", gr.update(), gr.update()
129
+
130
  # --------------------------------------------------
131
  # Transcription logic
132
  # --------------------------------------------------
 
140
  return transcript.text, transcript.audio_duration
141
 
142
  def transcribe_audio(audio_file):
143
+ # Check for inactivity timeout
144
+ if check_inactivity():
145
+ return "❌ Session expired due to inactivity. Please log in again."
146
+
147
  if session["user_id"] is None:
148
  return "❌ Please log in."
149
 
 
151
  return "⚠️ Please upload an audio file."
152
 
153
  try:
154
+ # Update activity timestamp
155
+ update_activity()
156
+
157
  # Transcribe audio
158
  text, duration_seconds = transcribe(audio_file)
159
  minutes_used = max(1, int(duration_seconds // 60))
 
161
  # Save transcription
162
  supabase.table("transcriptions").insert({
163
  "user_id": session["user_id"],
164
+ "user_email": session["user"],
165
  "audio_duration": minutes_used,
166
  "transcript": text
167
  }).execute()
 
201
  with gr.Blocks() as app:
202
 
203
  # πŸ” AUTH SECTION
204
+ with gr.Column(visible=not restore_session()) as auth_section:
205
  gr.Markdown("## πŸ” Login or Signup")
206
  email = gr.Textbox(label="Email")
207
  password = gr.Textbox(label="Password", type="password")
 
212
  signup_btn = gr.Button("Signup")
213
 
214
  # πŸŽ™οΈ TRANSCRIPTION SECTION (hidden initially)
215
+ with gr.Column(visible=restore_session()) as transcription_section:
216
  gr.Markdown("## πŸŽ™οΈ AI Transcription")
217
  gr.Markdown("Upload audio β†’ get transcript")
218
+
219
+ with gr.Row():
220
+ logout_btn = gr.Button("πŸšͺ Logout", scale=1)
221
+
222
  audio_input = gr.Audio(type="filepath", label="Upload Audio")
223
  output_text = gr.Textbox(label="Transcript", lines=10)
224
  transcribe_btn = gr.Button("Transcribe")
 
228
  gr.Markdown("## πŸ“‹ Site Report Form")
229
  gr.HTML(
230
  '<iframe src="http://13.48.132.18:5678/form/SITEREPORT" '
231
+ 'width="100%" height="700" frameborder="0" '
232
+ 'allow="same-origin" allowfullscreen '
233
+ 'style="border: 1px solid #ccc; border-radius: 5px; background: white;"></iframe>'
234
  )
235
+
236
+ logout_status = gr.Textbox(label="Status", visible=False)
237
 
238
  # --------------------------------------------------
239
  # Button bindings
 
247
  [email, password],
248
  [auth_status, auth_section, transcription_section]
249
  )
250
+ logout_btn.click(
251
+ logout,
252
+ None,
253
+ [logout_status, transcription_section, auth_section]
254
+ )
255
 
256
  # --------------------------------------------------
257
  # Launch