Time_Album / src /streamlit_app.py
alibidaran's picture
Update src/streamlit_app.py
fd8bbec verified
import streamlit as st
import requests
from PIL import Image
import base64
import io
from books import *
from streamlit_lottie import st_lottie, st_lottie_spinner
import json
import time
import streamlit.components.v1 as st1
from database_center import db_transaction
import os
from cloudhands import CloudHandsPayment
import uuid
os.environ["STREAMLIT_CONFIG_DIR"] = os.path.join(os.getcwd(), ".streamlit")
payment_key=os.getenv('Payment_Key')
def load_local_lottie(path):
with open(path, 'r') as file:
return json.load(file)
def complete_payment():
if st.session_state.token :
chPay=st.session_state.chPay
try:
result = chPay.charge(
charge=0.5,
event_name="Sample cloudhands charge",
)
st.success(f"You payment is succeeded")
st.session_state.transaction_id=result.transaction_id
db_transaction.add({
'id':str(uuid.uuid4()),
'app':'app_title',
'transaction-id':result.transaction_id,
'price':0.5
})
except Exception as e:
st.error(f"Charge failed: {e}")
else:
st.error('Please generate your Tokens.')
@st.dialog("Payment link")
def pay():
chPay = st.session_state.chPay
# Step 1: Show auth link only once
auth_url = chPay.get_authorization_url()
st.link_button("Authenticate", url=auth_url)
# Step 2: User pastes the code
code = st.text_input("Place your code")
if st.button("Exchange Code"):
try:
token = chPay.exchange_code_for_token(code)
st.session_state.token = token
st.success("Code exchanged successfully! Token stored.")
except Exception as e:
st.error(f"Failed: {e}")
# βœ… Only initialize the state if not already set
if "loading_state" not in st.session_state:
st.session_state.loading_state = True
if "chPay" not in st.session_state:
st.session_state.chPay = CloudHandsPayment(
author_key=payment_key
)
if "token" not in st.session_state:
st.session_state.token = None
# βœ… Show loading animation only once at first load
if st.session_state.loading_state:
with st_lottie_spinner(load_local_lottie('./src/Abstract Painting Loader.json'), key='hello'):
time.sleep(5)
st.session_state.loading_state = False
st.title("Old Book Image Generator")
st.sidebar.write("Please make your authenication token to use the model.")
authenication=st.sidebar.button('Authenicate')
if authenication:
pay()
caption = st.text_input("Enter an image caption:", "")
image_subject=st.pills("Select the subject of the image:", ["Narratives", "People", "Animals", "Buildings & monuments","Landscapes & places","Humor",""],selection_mode="single", default="People")
image_format=st.pills("Select the image format:", ["Landscape (wider)", "Portrait (taller)"], selection_mode="single", default="Portrait (taller)")
timeline=st.slider("Select the timeline:", 1800, 2000, 1803, step=1)
books=st.selectbox("Select a book title:",books, index=0)
book_title = books[books.index(books)]
if st.button("Generate Image") and caption:
with st_lottie_spinner(load_local_lottie('./src/Circle brush.json'), key='loading'):
# Example: Using Replicate's Stable Diffusion API (replace with your own API key and endpoint)
payload = {
"image_description": caption,
"subject": image_subject,
"image_format": image_format,
"timeline": timeline,
"book_title": book_title
}
# Send POST request to your API
response = requests.post("https://8000-01k0vweebewdafymj6xwarn56n.cloudspaces.litng.ai/predict", json=payload)
# Check if request was successful
if response.status_code == 200:
complete_payment()
if st.session_state.transaction_id:
result = response.json()
# Decode the base64 image
image_data = base64.b64decode(result['output'])
# Convert to PIL image
image = Image.open(io.BytesIO(image_data))
st.image(image, caption=caption)
else:
st.error("Image generation failed.")