Spaces:
Runtime error
Runtime error
import streamlit as st | |
import requests | |
import cloudinary | |
import cloudinary.uploader | |
from PIL import Image | |
import io | |
from google_auth_oauthlib.flow import InstalledAppFlow | |
from googleapiclient.discovery import build | |
import os | |
# Configure Cloudinary with your credentials | |
cloudinary.config( | |
cloud_name="dvuowbmrz", | |
api_key="177664162661619", | |
api_secret="qVMYel17N_C5QUUUuBIuatB5tq0" | |
) | |
# | |
# # Set up OAuth2 client details | |
# CLIENT_SECRET_FILE = 'client_secret.json' | |
# SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] # Adjust scopes as needed | |
# | |
# # Set up Streamlit app | |
# #st.title("Google Authentication Demo") | |
# | |
# # Check if the user is authenticated | |
# if 'credentials' not in st.session_state: | |
# #st.write("WELCOME") | |
# flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES) | |
# credentials = flow.run_local_server(port=8501, authorization_prompt_message='') | |
# | |
# # Save credentials to a file for future use (optional) | |
# with open('token.json', 'w') as token_file: | |
# token_file.write(credentials.to_json()) | |
# | |
# st.session_state.credentials = credentials | |
# st.success("Authentication successful. You can now use the app.") | |
# | |
# # Use authenticated credentials to interact with Google API | |
# credentials = st.session_state.credentials | |
# service = build('drive', 'v3', credentials=credentials) | |
# | |
# # Fetch user's name from Google API | |
# try: | |
# user_info = service.about().get(fields="user").execute() | |
# user_name = user_info["user"]["displayName"] | |
# #st.header("Google Profile Information") | |
# st.markdown(f"<p style='font-size: 24px;'><strong>Userame: {user_name.upper()}</strong></p>", unsafe_allow_html=True) | |
# except Exception as e: | |
# st.error(f"Error fetching user profile: {str(e)}") | |
# | |
# # Your app's functionality goes here | |
# # # Display Google Drive contents | |
# # st.header("Google Drive Contents") | |
# # results = service.files().list(pageSize=10).execute() | |
# # files = results.get('files', []) | |
# # if not files: | |
# # st.write('No files found in Google Drive.') | |
# # else: | |
# # st.write('Files in Google Drive:') | |
# # for file in files: | |
# # st.write(f"- {file['name']} ({file['mimeType']})") | |
# | |
# # Logout button | |
# if st.button("Logout"): | |
# del st.session_state.credentials | |
# os.remove("token_dir/token.json") # Remove the token file | |
# | |
# Set up Hugging Face API endpoint | |
API_URL = "https://api-inference.huggingface.co/models/CompVis/stable-diffusion-v1-4" | |
headers = {"Authorization": "Bearer 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"} | |
def query_model_with_image(image_description): | |
payload = { | |
"inputs": image_description | |
} | |
response = requests.post(API_URL, headers=headers, json=payload) | |
image_bytes = response.content | |
image = Image.open(io.BytesIO(image_bytes)) | |
return image | |
def upload_to_cloudinary(image, prompt_text): | |
image_data = io.BytesIO() | |
image.save(image_data, format="JPEG") | |
image_data.seek(0) | |
upload_result = cloudinary.uploader.upload( | |
image_data, | |
folder="compvis_app", | |
public_id=prompt_text | |
) | |
return upload_result["secure_url"] | |
def fetch_latest_images_from_cloudinary(num_images=9): | |
# Use the Cloudinary Admin API to list resources | |
url = f"https://api.cloudinary.com/v1_1/{cloudinary.config().cloud_name}/resources/image" | |
params = { | |
"max_results": num_images, | |
"type": "upload" | |
} | |
response = requests.get(url, params=params, auth=(cloudinary.config().api_key, cloudinary.config().api_secret)) | |
if response.status_code == 200: | |
images = response.json()["resources"] | |
else: | |
images = [] | |
return images | |
# Streamlit app | |
st.markdown("""<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">""", unsafe_allow_html=True) | |
st.title("Text to Image Generator") | |
image_description = st.text_input("Enter the image description") | |
if st.button("Generate Image"): | |
processed_image = query_model_with_image(image_description) | |
st.image(processed_image, use_column_width=True, output_format="JPEG") # Use use_column_width=True | |
st.session_state.processed_image = processed_image | |
st.session_state.image_description = image_description | |
st.write("Image generated.") | |
if st.button("Upload"): | |
if 'processed_image' in st.session_state: | |
uploaded_url = upload_to_cloudinary(st.session_state.processed_image, st.session_state.image_description) | |
st.write("Image uploaded to Cloudinary. Prompt Text:", st.session_state.image_description) | |
st.write("Image URL on Cloudinary:", uploaded_url) | |
else: | |
st.write("Generate an image first before uploading.") | |
# Fetch and display the latest images from Cloudinary | |
st.header("Latest Images created") | |
# Use the 'fetch_latest_images_from_cloudinary' function to get the latest images | |
latest_images = fetch_latest_images_from_cloudinary() | |
# Define the number of columns in the grid | |
num_columns = 3 # You can adjust this number as needed | |
# Calculate the width for each column | |
column_width = f"calc(33.33% - {10}px)" # Adjust the width and margin as needed | |
# Add CSS styling for the grid and rounded images | |
st.markdown( | |
f""" | |
<style> | |
.responsive-grid {{ | |
display: flex; | |
flex-wrap: wrap; | |
justify-content: space-between; | |
}} | |
.responsive-grid-item {{ | |
width: {column_width}; | |
margin: 10px; | |
box-sizing: border-box; | |
text-align: center; | |
position: relative; | |
}} | |
.image-caption {{ | |
font-weight: bold; | |
}} | |
.rounded-image {{ | |
border-radius: 15px; # Adjust the radius as needed for more or less roundness | |
overflow: hidden; | |
}} | |
.download-button {{ | |
background-color: black; # Set button color to black | |
color: white; | |
padding: 5px 10px; | |
border-radius: 5px; | |
text-decoration: none; | |
display: inline-block; | |
position: absolute; | |
top: 10px; # Adjust top value for vertical positioning | |
right: 10px; # Adjust right value for horizontal positioning | |
}} | |
</style> | |
""", | |
unsafe_allow_html=True, | |
) | |
# Create the responsive grid layout | |
st.markdown('<div class="responsive-grid">', unsafe_allow_html=True) | |
for i, image in enumerate(latest_images): | |
image_url = image.get('secure_url', '') # Get the image URL | |
public_id = image.get('public_id', '') # Get the full public_id | |
# Extract just the filename (without the folder) | |
filename = public_id.split('/')[-1] | |
# Add some spacing around the image and its name | |
st.markdown(f'<div class="responsive-grid-item">', unsafe_allow_html=True) | |
st.markdown(f'<p class="image-caption">{filename}</p>', unsafe_allow_html=True) | |
# Add rounded corners to the image using HTML | |
st.markdown(f'<img src="{image_url}" class="rounded-image" width="{int(1.25 * 300)}">', unsafe_allow_html=True) | |
# Add an arrow icon instead of "Download" button with black color | |
download_link = f'<a href="{image_url}" class="download-button" download="{filename}">↓</a>' | |
st.markdown(download_link, unsafe_allow_html=True) | |
st.write("") # Add empty spaces for separation | |
st.markdown('</div>', unsafe_allow_html=True) | |
# Close the responsive grid layout | |
st.markdown('</div>', unsafe_allow_html=True) |