Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,6 +7,11 @@ import json
|
|
| 7 |
import os
|
| 8 |
import pandas as pd
|
| 9 |
import pytz
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
import random
|
| 11 |
import re
|
| 12 |
import shutil
|
|
@@ -20,10 +25,21 @@ from azure.cosmos import CosmosClient, exceptions
|
|
| 20 |
from datetime import datetime
|
| 21 |
from git import Repo
|
| 22 |
from github import Github
|
|
|
|
| 23 |
from gradio_client import Client
|
| 24 |
from urllib.parse import quote
|
| 25 |
|
| 26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
# 🎭 App Configuration - Because every app needs a good costume!
|
| 28 |
Site_Name = '🐙GitCosmos🌌 - AI Azure Cosmos DB and Github Agent'
|
| 29 |
title = "🐙GitCosmos🌌 - AI Azure Cosmos DB and Github Agent"
|
|
@@ -228,6 +244,7 @@ def save_to_cosmos_db(container, query, response1, response2):
|
|
| 228 |
|
| 229 |
|
| 230 |
def save_to_cosmos_db_old(container, query, response1, response2):
|
|
|
|
| 231 |
try:
|
| 232 |
if container:
|
| 233 |
record = {
|
|
@@ -557,6 +574,9 @@ def load_file_content(file_path):
|
|
| 557 |
try:
|
| 558 |
with open(file_path, 'r', encoding='utf-8') as file:
|
| 559 |
return file.read()
|
|
|
|
|
|
|
|
|
|
| 560 |
except Exception as e:
|
| 561 |
st.error(f"Error loading file: {str(e)}")
|
| 562 |
return None
|
|
@@ -743,6 +763,11 @@ def update_file_management_section():
|
|
| 743 |
|
| 744 |
with col2:
|
| 745 |
st.markdown(get_download_link(file), unsafe_allow_html=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 746 |
|
| 747 |
with col3:
|
| 748 |
if st.button("📂", key=f"edit_{file}"):
|
|
@@ -772,8 +797,233 @@ def update_file_management_section():
|
|
| 772 |
display_file_editor(st.session_state.current_file)
|
| 773 |
|
| 774 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 775 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 776 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 777 |
# 🎭 Main function - "All the world's a stage, and all the code merely players" -Shakespeare, probably
|
| 778 |
def main():
|
| 779 |
st.markdown("### 🐙Git🌌Cosmos💫 - Azure Cosmos DB and Github Agent")
|
|
@@ -1036,56 +1286,6 @@ def main():
|
|
| 1036 |
except Exception as e:
|
| 1037 |
st.error(f"Error processing deletion: {str(e)}")
|
| 1038 |
|
| 1039 |
-
elif selected_view == 'Show as Code Editor - Old':
|
| 1040 |
-
Label = '#### 💻 Code editor view'
|
| 1041 |
-
st.markdown(Label)
|
| 1042 |
-
total_docs = len(documents)
|
| 1043 |
-
doc = documents[st.session_state.current_index]
|
| 1044 |
-
# st.markdown(f"#### Document ID: {doc.get('id', '')}")
|
| 1045 |
-
doc_str = st.text_area("Edit Document",
|
| 1046 |
-
value=json.dumps(doc, indent=2),
|
| 1047 |
-
height=300,
|
| 1048 |
-
key=f'code_editor_{st.session_state.current_index}')
|
| 1049 |
-
|
| 1050 |
-
col_prev, col_next = st.columns([1, 1])
|
| 1051 |
-
with col_prev:
|
| 1052 |
-
if st.button("⬅️ Previous", key='prev_code'):
|
| 1053 |
-
if st.session_state.current_index > 0:
|
| 1054 |
-
st.session_state.current_index -= 1
|
| 1055 |
-
st.rerun()
|
| 1056 |
-
with col_next:
|
| 1057 |
-
if st.button("➡️ Next", key='next_code'):
|
| 1058 |
-
if st.session_state.current_index < total_docs - 1:
|
| 1059 |
-
st.session_state.current_index += 1
|
| 1060 |
-
st.rerun()
|
| 1061 |
-
|
| 1062 |
-
col_save, col_delete = st.columns([1, 1])
|
| 1063 |
-
with col_save:
|
| 1064 |
-
if st.button("💾 Save Changes", key=f'save_button_{st.session_state.current_index}'):
|
| 1065 |
-
try:
|
| 1066 |
-
updated_doc = json.loads(doc_str)
|
| 1067 |
-
response = container.upsert_item(body=updated_doc)
|
| 1068 |
-
if response:
|
| 1069 |
-
st.success(f"Document {updated_doc['id']} saved successfully.")
|
| 1070 |
-
st.session_state.selected_document_id = updated_doc['id']
|
| 1071 |
-
st.rerun()
|
| 1072 |
-
except Exception as e:
|
| 1073 |
-
st.error(f"Error saving document: {str(e)}")
|
| 1074 |
-
|
| 1075 |
-
with col_delete:
|
| 1076 |
-
if st.button("🗑️ Delete", key=f'delete_button_{st.session_state.current_index}'):
|
| 1077 |
-
try:
|
| 1078 |
-
current_doc = json.loads(doc_str)
|
| 1079 |
-
# Direct deletion using container method with id and partition key
|
| 1080 |
-
delete = container.delete_item(current_doc["id"], current_doc["id"])
|
| 1081 |
-
if delete:
|
| 1082 |
-
st.success(f"Document {current_doc['id']} deleted successfully.")
|
| 1083 |
-
if st.session_state.current_index > 0:
|
| 1084 |
-
st.session_state.current_index -= 1
|
| 1085 |
-
st.rerun()
|
| 1086 |
-
except Exception as e:
|
| 1087 |
-
st.error(f"Error deleting document: {str(e)}")
|
| 1088 |
-
|
| 1089 |
|
| 1090 |
|
| 1091 |
|
|
@@ -1113,6 +1313,12 @@ def main():
|
|
| 1113 |
|
| 1114 |
# Save and AI operations columns
|
| 1115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1116 |
if st.button("🤖 Run AI", key=f'run_with_ai_button_{idx}'):
|
| 1117 |
# Your existing AI processing code here
|
| 1118 |
values_with_space = []
|
|
@@ -1146,7 +1352,48 @@ def main():
|
|
| 1146 |
except Exception as e:
|
| 1147 |
st.error(f"Error saving document: {str(e)}")
|
| 1148 |
|
| 1149 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1150 |
|
| 1151 |
|
| 1152 |
|
|
@@ -1377,6 +1624,15 @@ def main():
|
|
| 1377 |
st.text_area("Claude replied 🤖:", chat["claude"], height=200, disabled=True)
|
| 1378 |
st.markdown("---")
|
| 1379 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1380 |
|
| 1381 |
# 📝 File editor - "Edit with care, save with flair"
|
| 1382 |
if hasattr(st.session_state, 'current_file'):
|
|
@@ -1413,5 +1669,6 @@ def main():
|
|
| 1413 |
st.session_state.current_index = 0
|
| 1414 |
st.rerun()
|
| 1415 |
|
|
|
|
| 1416 |
if __name__ == "__main__":
|
| 1417 |
main()
|
|
|
|
| 7 |
import os
|
| 8 |
import pandas as pd
|
| 9 |
import pytz
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
|
| 15 |
import random
|
| 16 |
import re
|
| 17 |
import shutil
|
|
|
|
| 25 |
from datetime import datetime
|
| 26 |
from git import Repo
|
| 27 |
from github import Github
|
| 28 |
+
|
| 29 |
from gradio_client import Client
|
| 30 |
from urllib.parse import quote
|
| 31 |
|
| 32 |
|
| 33 |
+
# Add these imports at the top of your file
|
| 34 |
+
from gradio_client import Client, handle_file
|
| 35 |
+
import tempfile
|
| 36 |
+
from PIL import Image
|
| 37 |
+
import io
|
| 38 |
+
import requests
|
| 39 |
+
import numpy as np
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
|
| 43 |
# 🎭 App Configuration - Because every app needs a good costume!
|
| 44 |
Site_Name = '🐙GitCosmos🌌 - AI Azure Cosmos DB and Github Agent'
|
| 45 |
title = "🐙GitCosmos🌌 - AI Azure Cosmos DB and Github Agent"
|
|
|
|
| 244 |
|
| 245 |
|
| 246 |
def save_to_cosmos_db_old(container, query, response1, response2):
|
| 247 |
+
|
| 248 |
try:
|
| 249 |
if container:
|
| 250 |
record = {
|
|
|
|
| 574 |
try:
|
| 575 |
with open(file_path, 'r', encoding='utf-8') as file:
|
| 576 |
return file.read()
|
| 577 |
+
|
| 578 |
+
|
| 579 |
+
|
| 580 |
except Exception as e:
|
| 581 |
st.error(f"Error loading file: {str(e)}")
|
| 582 |
return None
|
|
|
|
| 763 |
|
| 764 |
with col2:
|
| 765 |
st.markdown(get_download_link(file), unsafe_allow_html=True)
|
| 766 |
+
|
| 767 |
+
|
| 768 |
+
|
| 769 |
+
|
| 770 |
+
|
| 771 |
|
| 772 |
with col3:
|
| 773 |
if st.button("📂", key=f"edit_{file}"):
|
|
|
|
| 797 |
display_file_editor(st.session_state.current_file)
|
| 798 |
|
| 799 |
|
| 800 |
+
# Function to create HTML for autoplaying and looping video (for the full cinematic effect 🎥)
|
| 801 |
+
def get_video_html(video_path, width="100%"):
|
| 802 |
+
video_url = f"data:video/mp4;base64,{base64.b64encode(open(video_path, 'rb').read()).decode()}"
|
| 803 |
+
return f'''
|
| 804 |
+
<video width="{width}" controls autoplay muted loop>
|
| 805 |
+
<source src="{video_url}" type="video/mp4">
|
| 806 |
+
Your browser does not support the video tag.
|
| 807 |
+
</video>
|
| 808 |
+
'''
|
| 809 |
+
|
| 810 |
+
|
| 811 |
+
|
| 812 |
+
|
| 813 |
+
# *********
|
| 814 |
+
def validate_and_preprocess_image(file_data, target_size=(576, 1024)):
|
| 815 |
+
"""Validate and preprocess image for video generation with improved BytesIO handling"""
|
| 816 |
+
try:
|
| 817 |
+
st.write("Starting image preprocessing...")
|
| 818 |
+
|
| 819 |
+
# Handle different input types
|
| 820 |
+
if isinstance(file_data, bytes):
|
| 821 |
+
st.write("Processing bytes input")
|
| 822 |
+
img = Image.open(io.BytesIO(file_data))
|
| 823 |
+
elif hasattr(file_data, 'read'):
|
| 824 |
+
st.write("Processing file-like object")
|
| 825 |
+
# Reset file pointer if possible
|
| 826 |
+
if hasattr(file_data, 'seek'):
|
| 827 |
+
file_data.seek(0)
|
| 828 |
+
img = Image.open(file_data)
|
| 829 |
+
elif isinstance(file_data, Image.Image):
|
| 830 |
+
st.write("Processing PIL Image input")
|
| 831 |
+
img = file_data
|
| 832 |
+
else:
|
| 833 |
+
raise ValueError(f"Unsupported input type: {type(file_data)}")
|
| 834 |
+
|
| 835 |
+
st.write(f"Successfully loaded image: {img.format}, size={img.size}, mode={img.mode}")
|
| 836 |
+
|
| 837 |
+
# Convert to RGB if necessary
|
| 838 |
+
if img.mode != 'RGB':
|
| 839 |
+
st.write(f"Converting image from {img.mode} to RGB")
|
| 840 |
+
img = img.convert('RGB')
|
| 841 |
+
|
| 842 |
+
# Calculate aspect ratio
|
| 843 |
+
aspect_ratio = img.size[0] / img.size[1]
|
| 844 |
+
st.write(f"Original aspect ratio: {aspect_ratio:.2f}")
|
| 845 |
+
|
| 846 |
+
# Determine target dimensions maintaining aspect ratio
|
| 847 |
+
if aspect_ratio > target_size[0]/target_size[1]: # Wider than target
|
| 848 |
+
new_width = target_size[0]
|
| 849 |
+
new_height = int(new_width / aspect_ratio)
|
| 850 |
+
else: # Taller than target
|
| 851 |
+
new_height = target_size[1]
|
| 852 |
+
new_width = int(new_height * aspect_ratio)
|
| 853 |
+
|
| 854 |
+
# Ensure dimensions are even numbers
|
| 855 |
+
new_width = (new_width // 2) * 2
|
| 856 |
+
new_height = (new_height // 2) * 2
|
| 857 |
+
|
| 858 |
+
st.write(f"Resizing to: {new_width}x{new_height}")
|
| 859 |
+
|
| 860 |
+
# Resize image using high-quality downsampling
|
| 861 |
+
resized_img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
| 862 |
+
|
| 863 |
+
# Create white background image of target size
|
| 864 |
+
final_img = Image.new('RGB', target_size, (255, 255, 255))
|
| 865 |
+
|
| 866 |
+
# Calculate position to paste resized image (center)
|
| 867 |
+
paste_x = (target_size[0] - new_width) // 2
|
| 868 |
+
paste_y = (target_size[1] - new_height) // 2
|
| 869 |
+
|
| 870 |
+
# Paste resized image onto white background
|
| 871 |
+
final_img.paste(resized_img, (paste_x, paste_y))
|
| 872 |
+
|
| 873 |
+
st.write(f"Final image size: {final_img.size}")
|
| 874 |
+
return final_img
|
| 875 |
+
|
| 876 |
+
except Exception as e:
|
| 877 |
+
st.error(f"Error in image preprocessing: {str(e)}\nType of input: {type(file_data)}")
|
| 878 |
+
return None
|
| 879 |
+
|
| 880 |
+
def add_video_generation_ui(container):
|
| 881 |
+
"""Enhanced video generation UI with improved file handling"""
|
| 882 |
+
st.markdown("### 🎥 Video Generation")
|
| 883 |
+
|
| 884 |
+
col1, col2 = st.columns([2, 1])
|
| 885 |
+
|
| 886 |
+
with col1:
|
| 887 |
+
uploaded_file = st.file_uploader(
|
| 888 |
+
"Upload Image for Video Generation 🖼️",
|
| 889 |
+
type=['png', 'jpg', 'jpeg'],
|
| 890 |
+
help="Upload a clear, well-lit image. Recommended size: 576x1024 pixels."
|
| 891 |
+
)
|
| 892 |
+
|
| 893 |
+
with col2:
|
| 894 |
+
st.markdown("#### Generation Parameters")
|
| 895 |
+
motion_bucket_id = st.slider(
|
| 896 |
+
"Motion Intensity 🌊",
|
| 897 |
+
min_value=1,
|
| 898 |
+
max_value=255,
|
| 899 |
+
value=127,
|
| 900 |
+
help="Lower values create subtle movement, higher values create more dramatic motion"
|
| 901 |
+
)
|
| 902 |
+
fps_id = st.slider(
|
| 903 |
+
"Frames per Second 🎬",
|
| 904 |
+
min_value=1,
|
| 905 |
+
max_value=30,
|
| 906 |
+
value=6,
|
| 907 |
+
help="Higher values create smoother but potentially less stable videos"
|
| 908 |
+
)
|
| 909 |
+
|
| 910 |
+
with st.expander("Advanced Options"):
|
| 911 |
+
use_custom_seed = st.checkbox("Use Custom Seed")
|
| 912 |
+
if use_custom_seed:
|
| 913 |
+
seed = st.number_input("Seed Value", value=int(time.time() * 1000))
|
| 914 |
+
else:
|
| 915 |
+
seed = None
|
| 916 |
|
| 917 |
+
if uploaded_file is not None:
|
| 918 |
+
try:
|
| 919 |
+
# Read file data
|
| 920 |
+
file_data = uploaded_file.read()
|
| 921 |
+
|
| 922 |
+
# Preview original image
|
| 923 |
+
preview_col1, preview_col2 = st.columns(2)
|
| 924 |
+
with preview_col1:
|
| 925 |
+
st.write("Original Image:")
|
| 926 |
+
original_img = Image.open(io.BytesIO(file_data))
|
| 927 |
+
st.image(original_img, caption="Original", use_column_width=True)
|
| 928 |
+
|
| 929 |
+
# Preview preprocessed image
|
| 930 |
+
with preview_col2:
|
| 931 |
+
# Create a new BytesIO object with the file data
|
| 932 |
+
preprocessed = validate_and_preprocess_image(io.BytesIO(file_data))
|
| 933 |
+
if preprocessed:
|
| 934 |
+
st.write("Preprocessed Image:")
|
| 935 |
+
st.image(preprocessed, caption="Preprocessed", use_column_width=True)
|
| 936 |
+
else:
|
| 937 |
+
st.error("Failed to preprocess image")
|
| 938 |
+
return
|
| 939 |
+
|
| 940 |
+
if st.button("🎥 Generate Video", help="Start video generation process"):
|
| 941 |
+
with st.spinner("Processing your video... This may take a few minutes 🎬"):
|
| 942 |
+
# Save preprocessed image to temporary file
|
| 943 |
+
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as temp_file:
|
| 944 |
+
preprocessed.save(temp_file.name, format='PNG')
|
| 945 |
+
st.write(f"Saved preprocessed image to temporary file: {temp_file.name}")
|
| 946 |
+
|
| 947 |
+
try:
|
| 948 |
+
# Initialize the Gradio client
|
| 949 |
+
client = Client(
|
| 950 |
+
"awacke1/stable-video-diffusion",
|
| 951 |
+
hf_token=os.environ.get("HUGGINGFACE_TOKEN")
|
| 952 |
+
)
|
| 953 |
+
|
| 954 |
+
# Generate video
|
| 955 |
+
result = client.predict(
|
| 956 |
+
image=temp_file.name,
|
| 957 |
+
seed=seed if seed is not None else int(time.time() * 1000),
|
| 958 |
+
randomize_seed=seed is None,
|
| 959 |
+
motion_bucket_id=motion_bucket_id,
|
| 960 |
+
fps_id=fps_id,
|
| 961 |
+
api_name="/video"
|
| 962 |
+
)
|
| 963 |
+
|
| 964 |
+
if result and isinstance(result, tuple) and len(result) >= 1:
|
| 965 |
+
video_path = result[0].get('video') if isinstance(result[0], dict) else None
|
| 966 |
+
if video_path and os.path.exists(video_path):
|
| 967 |
+
# Save video locally
|
| 968 |
+
video_filename = f"generated_video_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
|
| 969 |
+
shutil.copy(video_path, video_filename)
|
| 970 |
+
|
| 971 |
+
st.success(f"""
|
| 972 |
+
Video generated successfully! 🎉
|
| 973 |
+
- Seed: {seed if seed is not None else 'Random'}
|
| 974 |
+
- Motion Intensity: {motion_bucket_id}
|
| 975 |
+
- FPS: {fps_id}
|
| 976 |
+
""")
|
| 977 |
+
|
| 978 |
+
st.video(video_filename)
|
| 979 |
+
|
| 980 |
+
# Save to Cosmos DB
|
| 981 |
+
if container:
|
| 982 |
+
video_record = {
|
| 983 |
+
"id": generate_unique_id(),
|
| 984 |
+
"type": "generated_video",
|
| 985 |
+
"filename": video_filename,
|
| 986 |
+
"seed": seed if seed is not None else "random",
|
| 987 |
+
"motion_bucket_id": motion_bucket_id,
|
| 988 |
+
"fps_id": fps_id,
|
| 989 |
+
"timestamp": datetime.now().isoformat()
|
| 990 |
+
}
|
| 991 |
+
success, message = insert_record(container, video_record)
|
| 992 |
+
if success:
|
| 993 |
+
st.success("Video record saved to database!")
|
| 994 |
+
else:
|
| 995 |
+
st.error(f"Error saving video record: {message}")
|
| 996 |
+
else:
|
| 997 |
+
st.error("Failed to generate video: Invalid result format")
|
| 998 |
+
else:
|
| 999 |
+
st.error("Failed to generate video: No result returned")
|
| 1000 |
+
|
| 1001 |
+
except Exception as e:
|
| 1002 |
+
st.error(f"Error generating video: {str(e)}")
|
| 1003 |
+
finally:
|
| 1004 |
+
# Cleanup temporary file
|
| 1005 |
+
try:
|
| 1006 |
+
os.unlink(temp_file.name)
|
| 1007 |
+
st.write("Cleaned up temporary file")
|
| 1008 |
+
except Exception as e:
|
| 1009 |
+
st.warning(f"Error cleaning up temporary file: {str(e)}")
|
| 1010 |
|
| 1011 |
+
except Exception as e:
|
| 1012 |
+
st.error(f"Error processing uploaded file: {str(e)}")
|
| 1013 |
+
|
| 1014 |
+
|
| 1015 |
+
# ******************************************
|
| 1016 |
+
|
| 1017 |
+
# Function to create HTML for audio player (when life needs a soundtrack 🎶)
|
| 1018 |
+
def get_audio_html(audio_path, width="100%"):
|
| 1019 |
+
audio_url = f"data:audio/mpeg;base64,{base64.b64encode(open(audio_path, 'rb').read()).decode()}"
|
| 1020 |
+
return f'''
|
| 1021 |
+
<audio controls style="width: {width};">
|
| 1022 |
+
<source src="{audio_url}" type="audio/mpeg">
|
| 1023 |
+
Your browser does not support the audio element.
|
| 1024 |
+
</audio>
|
| 1025 |
+
'''
|
| 1026 |
+
|
| 1027 |
# 🎭 Main function - "All the world's a stage, and all the code merely players" -Shakespeare, probably
|
| 1028 |
def main():
|
| 1029 |
st.markdown("### 🐙Git🌌Cosmos💫 - Azure Cosmos DB and Github Agent")
|
|
|
|
| 1286 |
except Exception as e:
|
| 1287 |
st.error(f"Error processing deletion: {str(e)}")
|
| 1288 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1289 |
|
| 1290 |
|
| 1291 |
|
|
|
|
| 1313 |
|
| 1314 |
# Save and AI operations columns
|
| 1315 |
|
| 1316 |
+
|
| 1317 |
+
# Video Generator call - the video generation UI for container:
|
| 1318 |
+
add_video_generation_ui(container)
|
| 1319 |
+
|
| 1320 |
+
|
| 1321 |
+
|
| 1322 |
if st.button("🤖 Run AI", key=f'run_with_ai_button_{idx}'):
|
| 1323 |
# Your existing AI processing code here
|
| 1324 |
values_with_space = []
|
|
|
|
| 1352 |
except Exception as e:
|
| 1353 |
st.error(f"Error saving document: {str(e)}")
|
| 1354 |
|
| 1355 |
+
|
| 1356 |
+
# File Editor (When you need to tweak things ✏️)
|
| 1357 |
+
if hasattr(st.session_state, 'current_file'):
|
| 1358 |
+
st.subheader(f"Editing: {st.session_state.current_file} 🛠")
|
| 1359 |
+
new_content = st.text_area("File Content ✏️:", st.session_state.file_content, height=300)
|
| 1360 |
+
if st.button("Save Changes 💾"):
|
| 1361 |
+
with open(st.session_state.current_file, 'w', encoding='utf-8') as file:
|
| 1362 |
+
file.write(new_content)
|
| 1363 |
+
st.success("File updated successfully! 🎉")
|
| 1364 |
+
|
| 1365 |
+
# Image Gallery (For your viewing pleasure 📸)
|
| 1366 |
+
st.subheader("Image Gallery 🖼")
|
| 1367 |
+
image_files = glob.glob("*.png") + glob.glob("*.jpg") + glob.glob("*.jpeg")
|
| 1368 |
+
image_cols = st.slider("Gallery Columns 🖼", min_value=1, max_value=15, value=5)
|
| 1369 |
+
cols = st.columns(image_cols)
|
| 1370 |
+
for idx, image_file in enumerate(image_files):
|
| 1371 |
+
with cols[idx % image_cols]:
|
| 1372 |
+
img = Image.open(image_file)
|
| 1373 |
+
#st.image(img, caption=image_file, use_column_width=True)
|
| 1374 |
+
st.image(img, use_column_width=True)
|
| 1375 |
+
display_glossary_entity(os.path.splitext(image_file)[0])
|
| 1376 |
+
|
| 1377 |
+
# Video Gallery (Let’s roll the tapes 🎬)
|
| 1378 |
+
st.subheader("Video Gallery 🎥")
|
| 1379 |
+
video_files = glob.glob("*.mp4")
|
| 1380 |
+
video_cols = st.slider("Gallery Columns 🎬", min_value=1, max_value=5, value=3)
|
| 1381 |
+
cols = st.columns(video_cols)
|
| 1382 |
+
for idx, video_file in enumerate(video_files):
|
| 1383 |
+
with cols[idx % video_cols]:
|
| 1384 |
+
st.markdown(get_video_html(video_file, width="100%"), unsafe_allow_html=True)
|
| 1385 |
+
display_glossary_entity(os.path.splitext(video_file)[0])
|
| 1386 |
+
|
| 1387 |
+
# Audio Gallery (Tunes for the mood 🎶)
|
| 1388 |
+
st.subheader("Audio Gallery 🎧")
|
| 1389 |
+
audio_files = glob.glob("*.mp3") + glob.glob("*.wav")
|
| 1390 |
+
audio_cols = st.slider("Gallery Columns 🎶", min_value=1, max_value=15, value=5)
|
| 1391 |
+
cols = st.columns(audio_cols)
|
| 1392 |
+
for idx, audio_file in enumerate(audio_files):
|
| 1393 |
+
with cols[idx % audio_cols]:
|
| 1394 |
+
st.markdown(get_audio_html(audio_file, width="100%"), unsafe_allow_html=True)
|
| 1395 |
+
display_glossary_entity(os.path.splitext(audio_file)[0])
|
| 1396 |
+
|
| 1397 |
|
| 1398 |
|
| 1399 |
|
|
|
|
| 1624 |
st.text_area("Claude replied 🤖:", chat["claude"], height=200, disabled=True)
|
| 1625 |
st.markdown("---")
|
| 1626 |
|
| 1627 |
+
|
| 1628 |
+
|
| 1629 |
+
|
| 1630 |
+
|
| 1631 |
+
|
| 1632 |
+
|
| 1633 |
+
|
| 1634 |
+
|
| 1635 |
+
|
| 1636 |
|
| 1637 |
# 📝 File editor - "Edit with care, save with flair"
|
| 1638 |
if hasattr(st.session_state, 'current_file'):
|
|
|
|
| 1669 |
st.session_state.current_index = 0
|
| 1670 |
st.rerun()
|
| 1671 |
|
| 1672 |
+
|
| 1673 |
if __name__ == "__main__":
|
| 1674 |
main()
|