awacke1 commited on
Commit
23488d1
Β·
verified Β·
1 Parent(s): 3aed0ab

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -2
app.py CHANGED
@@ -247,9 +247,141 @@ def generate_filename(prompt, file_type):
247
  safe_prompt = re.sub(r'\s+', ' ', replaced_prompt).strip()[:230]
248
  return f"{safe_date_time}_{safe_prompt}.{file_type}"
249
 
250
- # [Previous helper functions remain the same]
251
- # ... [Include all the helper functions from the second file]
 
 
 
 
252
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
  def main():
254
  st.sidebar.markdown("### 🚲BikeAIπŸ† Claude and GPT Multi-Agent Research AI")
255
 
 
247
  safe_prompt = re.sub(r'\s+', ' ', replaced_prompt).strip()[:230]
248
  return f"{safe_date_time}_{safe_prompt}.{file_type}"
249
 
250
+ # File Management Functions
251
+ def load_file(file_name):
252
+ """Load file content."""
253
+ with open(file_name, "r", encoding='utf-8') as file:
254
+ content = file.read()
255
+ return content
256
 
257
+ def create_zip_of_files(files):
258
+ """Create zip archive of files."""
259
+ zip_name = "all_files.zip"
260
+ with zipfile.ZipFile(zip_name, 'w') as zipf:
261
+ for file in files:
262
+ zipf.write(file)
263
+ return zip_name
264
+
265
+ def get_download_link(file):
266
+ """Create download link for file."""
267
+ with open(file, "rb") as f:
268
+ contents = f.read()
269
+ b64 = base64.b64encode(contents).decode()
270
+ return f'<a href="data:file/txt;base64,{b64}" download="{os.path.basename(file)}">Download {os.path.basename(file)}πŸ“‚</a>'
271
+
272
+ def display_file_manager():
273
+ """Display file management sidebar."""
274
+ st.sidebar.title("πŸ“ File Management")
275
+
276
+ all_files = glob.glob("*.md")
277
+ all_files.sort(reverse=True)
278
+
279
+ if st.sidebar.button("πŸ—‘ Delete All"):
280
+ for file in all_files:
281
+ os.remove(file)
282
+ st.rerun()
283
+
284
+ if st.sidebar.button("⬇️ Download All"):
285
+ zip_file = create_zip_of_files(all_files)
286
+ st.sidebar.markdown(get_download_link(zip_file), unsafe_allow_html=True)
287
+
288
+ for file in all_files:
289
+ col1, col2, col3, col4 = st.sidebar.columns([1,3,1,1])
290
+ with col1:
291
+ if st.button("🌐", key="view_"+file):
292
+ st.session_state.current_file = file
293
+ st.session_state.file_content = load_file(file)
294
+ with col2:
295
+ st.markdown(get_download_link(file), unsafe_allow_html=True)
296
+ with col3:
297
+ if st.button("πŸ“‚", key="edit_"+file):
298
+ st.session_state.current_file = file
299
+ st.session_state.file_content = load_file(file)
300
+ with col4:
301
+ if st.button("πŸ—‘", key="delete_"+file):
302
+ os.remove(file)
303
+ st.rerun()
304
+
305
+ def create_media_gallery():
306
+ """Create the media gallery interface."""
307
+ st.header("🎬 Media Gallery")
308
+
309
+ tabs = st.tabs(["πŸ–ΌοΈ Images", "🎡 Audio", "πŸŽ₯ Video", "🎨 Scene Generator"])
310
+
311
+ with tabs[0]:
312
+ image_files = glob.glob("*.png") + glob.glob("*.jpg")
313
+ if image_files:
314
+ num_cols = st.slider("Number of columns", 1, 5, 3)
315
+ cols = st.columns(num_cols)
316
+ for idx, image_file in enumerate(image_files):
317
+ with cols[idx % num_cols]:
318
+ img = Image.open(image_file)
319
+ st.image(img, use_container_width=True)
320
+
321
+ # Add GPT vision analysis option
322
+ if st.button(f"Analyze {os.path.basename(image_file)}"):
323
+ analysis = process_image(image_file,
324
+ "Describe this image in detail and identify key elements.")
325
+ st.markdown(analysis)
326
+
327
+ with tabs[1]:
328
+ audio_files = glob.glob("*.mp3") + glob.glob("*.wav")
329
+ for audio_file in audio_files:
330
+ with st.expander(f"🎡 {os.path.basename(audio_file)}"):
331
+ st.markdown(get_media_html(audio_file, "audio"), unsafe_allow_html=True)
332
+ if st.button(f"Transcribe {os.path.basename(audio_file)}"):
333
+ with open(audio_file, "rb") as f:
334
+ transcription = process_audio(f)
335
+ st.write(transcription)
336
+
337
+ with tabs[2]:
338
+ video_files = glob.glob("*.mp4")
339
+ for video_file in video_files:
340
+ with st.expander(f"πŸŽ₯ {os.path.basename(video_file)}"):
341
+ st.markdown(get_media_html(video_file, "video"), unsafe_allow_html=True)
342
+ if st.button(f"Analyze {os.path.basename(video_file)}"):
343
+ analysis = process_video_with_gpt(video_file,
344
+ "Describe what's happening in this video.")
345
+ st.markdown(analysis)
346
+
347
+ with tabs[3]:
348
+ for collection_name, bikes in bike_collections.items():
349
+ st.subheader(collection_name)
350
+ cols = st.columns(len(bikes))
351
+
352
+ for idx, (bike_name, details) in enumerate(bikes.items()):
353
+ with cols[idx]:
354
+ st.markdown(f"""
355
+ <div class='bike-card'>
356
+ <h3>{details['emoji']} {bike_name}</h3>
357
+ <p>{details['prompt']}</p>
358
+ </div>
359
+ """, unsafe_allow_html=True)
360
+
361
+ if st.button(f"Generate {bike_name} Scene"):
362
+ prompt = details['prompt']
363
+ # Here you could integrate with image generation API
364
+ st.write(f"Generated scene description for {bike_name}:")
365
+ st.write(prompt)
366
+
367
+ def get_media_html(media_path, media_type="video", width="100%"):
368
+ """Generate HTML for media player."""
369
+ media_data = base64.b64encode(open(media_path, 'rb').read()).decode()
370
+ if media_type == "video":
371
+ return f'''
372
+ <video width="{width}" controls autoplay muted loop>
373
+ <source src="data:video/mp4;base64,{media_data}" type="video/mp4">
374
+ Your browser does not support the video tag.
375
+ </video>
376
+ '''
377
+ else: # audio
378
+ return f'''
379
+ <audio controls style="width: {width};">
380
+ <source src="data:audio/mpeg;base64,{media_data}" type="audio/mpeg">
381
+ Your browser does not support the audio element.
382
+ </audio>
383
+ '''
384
+
385
  def main():
386
  st.sidebar.markdown("### 🚲BikeAIπŸ† Claude and GPT Multi-Agent Research AI")
387