Spaces:
Running
Running
| import base64 | |
| from pathlib import Path | |
| import streamlit as st | |
| from dotenv import load_dotenv | |
| from app_pages.script_library import render_script_library | |
| from app_pages.video_analyser import render_video_analyser_page | |
| from app_pages.image_analyser import render_image_analyser_page | |
| from app_pages.image_analyser_library import render_image_analysis_library | |
| from app_pages.video_hashid_generation import render_video_hashid | |
| from app_pages.video_text_generation import render_video_to_text | |
| from app_pages.video_translator import render_video_translator | |
| from app_pages.video_caption import render_video_caption | |
| from authen.authentication import login_gate, logout | |
| from app_pages.text_image_generation import render_multimodel_ad_generator | |
| from app_pages.image_generation import render_bulk_image_generator | |
| from app_pages.video_library import render_video_library | |
| from app_pages.image_generation_library import render_image_variations_library | |
| from app_pages.text_image_generation_library import render_text_image_library | |
| from app_pages.script_generator import generator_page | |
| load_dotenv() | |
| st.set_page_config(page_title="Gen AI + AI Library", page_icon="✨", layout="wide") | |
| # ---------- Auth ---------- | |
| uid = login_gate() | |
| with st.sidebar: | |
| st.markdown(f"**Signed in as:** `{uid}`") | |
| if st.button("Log out", key="btn_logout",width='content'): | |
| logout() | |
| st.rerun() | |
| st.markdown( | |
| """ | |
| <style> | |
| .private-mode-banner { | |
| padding: 0.75rem 1rem; | |
| margin-top: 0.5rem; | |
| border-radius: 0.85rem; | |
| background: linear-gradient(125deg, rgba(91, 33, 182, 0.85), rgba(132, 94, 247, 0.55)); | |
| border: 1px solid rgba(132, 94, 247, 0.35); | |
| color: #fff; | |
| font-weight: 500; | |
| box-shadow: 0 10px 24px rgba(82, 46, 173, 0.28); | |
| animation: privateBannerSlide 0.55s ease forwards, privateBannerFade 3.3s ease 1.75s forwards; | |
| } | |
| .private-mode-banner-content { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 0.85rem; | |
| } | |
| .private-mode-banner-copy { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.15rem; | |
| } | |
| .private-mode-icon { | |
| width: 64px; | |
| min-width: 48px; | |
| max-width: 20%; | |
| filter: drop-shadow(0 6px 16px rgba(16, 13, 61, 0.45)); | |
| opacity: 0.95; | |
| } | |
| .private-mode-banner small { | |
| display: block; | |
| opacity: 0.85; | |
| font-weight: 400; | |
| margin-top: 0.25rem; | |
| letter-spacing: 0.01em; | |
| } | |
| @media (max-width: 320px) { | |
| .private-mode-icon { | |
| display: none; | |
| } | |
| } | |
| @keyframes privateBannerSlide { | |
| 0% { transform: translateY(-12px); opacity: 0; } | |
| 60% { transform: translateY(2px); opacity: 1; } | |
| 100% { transform: translateY(0); opacity: 1; } | |
| } | |
| @keyframes privateBannerFade { | |
| to { opacity: 0; } | |
| } | |
| @keyframes privateToggleGlow { | |
| 0% { box-shadow: 0 0 0 rgba(132, 94, 247, 0.0); } | |
| 40% { box-shadow: 0 0 24px rgba(132, 94, 247, 0.55); } | |
| 100% { box-shadow: 0 0 0 rgba(132, 94, 247, 0.0); } | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| prev_private_mode = st.session_state.get("_private_mode_prev", st.session_state.get("private_mode_enabled", False)) | |
| banner_slot = st.empty() | |
| private_mode_default = st.session_state.get("private_mode_enabled", False) | |
| private_mode = st.toggle( | |
| "Private mode", | |
| value=private_mode_default, | |
| key="private_mode_enabled", | |
| help="Skip saving prompts, jobs, and generated media to shared libraries." | |
| ) | |
| just_enabled_private_mode = private_mode and not prev_private_mode | |
| just_disabled_private_mode = (not private_mode) and prev_private_mode | |
| if just_enabled_private_mode: | |
| st.markdown( | |
| """ | |
| <style> | |
| div[data-testid="stSidebar"] div[data-testid="stToggle"] label { | |
| animation: privateToggleGlow 2.45s ease-out 0s 1; | |
| border-radius: 0.5rem; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| icon_data_url = "" | |
| try: | |
| icon_path = Path(__file__).resolve().parent / "assets" / "private-mode.png" | |
| icon_data_url = "data:image/png;base64," + base64.b64encode(icon_path.read_bytes()).decode("utf-8") | |
| except Exception: | |
| icon_data_url = "" | |
| icon_html = f'<img src="{icon_data_url}" alt="Private mode icon" class="private-mode-icon" />' if icon_data_url else "" | |
| banner_slot.markdown( | |
| f""" | |
| <div class="private-mode-banner"> | |
| <div class="private-mode-banner-content"> | |
| {icon_html} | |
| <div class="private-mode-banner-copy"> | |
| Private mode is live for this session. | |
| <small>We'll keep new generations off shared storage until you disable it.</small> | |
| </div> | |
| </div> | |
| </div> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| elif just_disabled_private_mode: | |
| banner_slot.empty() | |
| st.session_state["_private_mode_prev"] = private_mode | |
| if private_mode: | |
| st.caption("Private mode keeps this session's generations ephemeral—nothing is stored in the AI Library or external storage.") | |
| section = st.radio(" ", ["Gen AI", "AI Library"], index=0, horizontal=True, key="main_section") | |
| # ---------------------------- Gen AI --------------------------------- | |
| def render_genai(): | |
| _, main = st.columns([0.1, 1], gap="small") | |
| with main: | |
| mod_tabs = st.tabs(["Image Gen","Image Analyser","Video Analyser", "Script Generator", "Video Hashid Gen", "Video to Text","Video Translator","Generate Caption"]) | |
| # -------- Image Generation -------- | |
| with mod_tabs[0]: | |
| sub = st.tabs(["Text", "Img"]) | |
| with sub[0]: | |
| render_multimodel_ad_generator() | |
| with sub[1]: | |
| render_bulk_image_generator(uid=uid) | |
| with mod_tabs[1]: | |
| render_image_analyser_page(uid=uid) | |
| # -------- Video Analyser -------- | |
| with mod_tabs[2]: | |
| render_video_analyser_page(uid=uid) | |
| # -------- Script Generator -------- | |
| with mod_tabs[3]: | |
| generator_page(uid=uid) | |
| #-------- Video Hashid Generation -------- | |
| with mod_tabs[4]: | |
| render_video_hashid(uid=uid) | |
| #-------- Video to Text Generation -------- | |
| with mod_tabs[5]: | |
| render_video_to_text(uid=uid) | |
| #-------- Video Translator -------- | |
| with mod_tabs[6]: | |
| render_video_translator(uid=uid) | |
| #-------- Video caption -------- | |
| with mod_tabs[7]: | |
| render_video_caption(uid=uid) | |
| # ---------------------------- AI Library --------------------------------- | |
| def render_ai_library(): | |
| _, main = st.columns([0.1, 1], gap="small") | |
| with main: | |
| st.subheader("Library") | |
| lib_tabs = st.tabs(["Image","Analysed Image","Analysed Video", "Generated Scripts"]) | |
| # ---------- Image Tab ---------- | |
| with lib_tabs[0]: | |
| sub = st.tabs(["New generated", "Variations"]) | |
| with sub[0]: | |
| render_text_image_library(uid=uid) | |
| with sub[1]: | |
| render_image_variations_library(uid=uid) | |
| with lib_tabs[1]: | |
| render_image_analysis_library(uid=uid) | |
| # ---------- Video Library Tab ---------- | |
| with lib_tabs[2]: | |
| render_video_library(uid=uid) | |
| # ---------- Generated Scripts Tab ---------- | |
| with lib_tabs[3]: | |
| render_script_library(uid=uid) | |
| if section == "Gen AI": | |
| render_genai() | |
| else: | |
| render_ai_library() |