Spaces:
Running
Running
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import time | |
import random | |
import os | |
import hashlib | |
import json | |
from datetime import datetime | |
def load_famous_quotes(): | |
famous_quotes = [ | |
{"Number": 1, "Quote Topic": "Imagination", "Quote": "The true sign of intelligence is not knowledge but imagination. β Albert Einstein"}, | |
{"Number": 2, "Quote Topic": "Perseverance", "Quote": "I have not failed. I've just found 10,000 ways that won't work. β Thomas Edison"}, | |
{"Number": 3, "Quote Topic": "Innovation", "Quote": "Innovation distinguishes between a leader and a follower. β Steve Jobs"}, | |
{"Number": 4, "Quote Topic": "Research", "Quote": "Research is what I'm doing when I don't know what I'm doing. β Wernher von Braun"}, | |
{"Number": 5, "Quote Topic": "Possibility", "Quote": "The only way to discover the limits of the possible is to go beyond them into the impossible. β Arthur C. Clarke"}, | |
{"Number": 6, "Quote Topic": "Success", "Quote": "Success is a science; if you have the conditions, you get the result. β Oscar Wilde"}, | |
{"Number": 7, "Quote Topic": "Expertise", "Quote": "An expert is a person who has made all the mistakes that can be made in a very narrow field. β Niels Bohr"}, | |
{"Number": 8, "Quote Topic": "Curiosity", "Quote": "The important thing is to not stop questioning. Curiosity has its own reason for existing. β Albert Einstein"}, | |
{"Number": 9, "Quote Topic": "Future", "Quote": "The best way to predict the future is to invent it. β Alan Kay"}, | |
{"Number": 10, "Quote Topic": "Progress", "Quote": "If I have seen further it is by standing on the shoulders of Giants. β Isaac Newton"}, | |
{"Number": 11, "Quote Topic": "Logic and Imagination", "Quote": "Logic will get you from A to B. Imagination will take you everywhere. β Albert Einstein"}, | |
{"Number": 12, "Quote Topic": "Imagination", "Quote": "Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world. β Albert Einstein"}, | |
{"Number": 13, "Quote Topic": "Science", "Quote": "Science is a way of thinking much more than it is a body of knowledge. β Carl Sagan"}, | |
{"Number": 14, "Quote Topic": "Problem Solving", "Quote": "We cannot solve our problems with the same thinking we used when we created them. β Albert Einstein"}, | |
{"Number": 15, "Quote Topic": "Experimentation", "Quote": "The true method of knowledge is experiment. β William Blake"}, | |
{"Number": 16, "Quote Topic": "Questions", "Quote": "The scientist is not a person who gives the right answers, he's one who asks the right questions. β Claude Levi-Strauss"}, | |
{"Number": 17, "Quote Topic": "Possibility", "Quote": "It's kind of fun to do the impossible. β Walt Disney"}, | |
{"Number": 18, "Quote Topic": "Technology", "Quote": "Any sufficiently advanced technology is indistinguishable from magic. β Arthur C. Clarke"}, | |
{"Number": 19, "Quote Topic": "Creativity", "Quote": "Creativity is intelligence having fun. β Albert Einstein"}, | |
{"Number": 20, "Quote Topic": "Invention", "Quote": "To invent, you need a good imagination and a pile of junk. β Thomas Edison"} | |
] | |
return pd.DataFrame(famous_quotes) | |
# Predefined custom quotes | |
custom_quotes = [ | |
{"Number": 1, "Quote Topic": "Stages of Life π±", "Quote": "Every age unfolds a new lesson. Life's chapters evolve, each teaching us anew."}, | |
{"Number": 2, "Quote Topic": "Stages of Life π±", "Quote": "From infancy to twilight, our journey is painted in growth. Every stage shines with its own wisdom."}, | |
# ... (rest of the custom quotes) | |
{"Number": 99, "Quote Topic": "Love β€οΈ", "Quote": "Love is the universal language, transcending boundaries and touching souls."}, | |
{"Number": 100, "Quote Topic": "Love β€οΈ", "Quote": "Through love, we find connection, unity, and the essence of existence."} | |
] | |
# Function to display a quote | |
def display_quote(quote): | |
st.markdown(f"### {quote['Number']}. {quote['Quote Topic']}") | |
st.markdown(quote['Quote']) | |
# Function to generate a short user hash | |
def generate_user_hash(): | |
if 'user_hash' not in st.session_state: | |
session_id = str(random.getrandbits(128)) | |
hash_object = hashlib.md5(session_id.encode()) | |
st.session_state['user_hash'] = hash_object.hexdigest()[:8] | |
return st.session_state['user_hash'] | |
# Function to load vote history from file | |
def load_vote_history(): | |
try: | |
with open('vote_history.json', 'r') as f: | |
return json.load(f) | |
except FileNotFoundError: | |
return {'images': {}, 'users': {}} | |
# Function to save vote history to file | |
def save_vote_history(history): | |
with open('vote_history.json', 'w') as f: | |
json.dump(history, f) | |
# Function to update vote history in Markdown file | |
def update_history_md(image_name, user_hash): | |
with open('history.md', 'a') as f: | |
f.write(f"- {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - User {user_hash} voted for {image_name}\n") | |
# Function to display images | |
def display_images(image_dir): | |
col1, col2 = st.columns(2) | |
valid_extensions = ('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp') | |
images = [f for f in os.listdir(image_dir) if f.lower().endswith(valid_extensions)] | |
if len(images) < 2: | |
st.error("Not enough images in the directory.") | |
return | |
image1, image2 = random.sample(images, 2) | |
with col1: | |
st.image(os.path.join(image_dir, image1)) | |
if st.button(f"Upvote {image1}", key=f"upvote_{image1}"): | |
handle_vote(image1) | |
with col2: | |
st.image(os.path.join(image_dir, image2)) | |
if st.button(f"Upvote {image2}", key=f"upvote_{image2}"): | |
handle_vote(image2) | |
# Function to handle voting | |
def handle_vote(image_name): | |
user_hash = generate_user_hash() | |
vote_history = load_vote_history() | |
if image_name not in vote_history['images']: | |
vote_history['images'][image_name] = {'votes': 0, 'users': {}} | |
if user_hash not in vote_history['users']: | |
vote_history['users'][user_hash] = 0 | |
vote_history['images'][image_name]['votes'] += 1 | |
if user_hash not in vote_history['images'][image_name]['users']: | |
vote_history['images'][image_name]['users'][user_hash] = 0 | |
vote_history['images'][image_name]['users'][user_hash] += 1 | |
vote_history['users'][user_hash] += 1 | |
save_vote_history(vote_history) | |
update_history_md(image_name, user_hash) | |
st.success(f"Upvoted {image_name}! Total votes: {vote_history['images'][image_name]['votes']}") | |
# Reset the timer when a vote is cast | |
st.session_state.last_interaction = time.time() | |
# Function to show vote history and user stats in sidebar | |
def show_vote_history(): | |
st.sidebar.title("Vote History") | |
vote_history = load_vote_history() | |
# Sort users by total votes | |
sorted_users = sorted(vote_history['users'].items(), key=lambda x: x[1], reverse=True) | |
st.sidebar.subheader("User Vote Totals") | |
for user_hash, votes in sorted_users: | |
st.sidebar.write(f"User {user_hash}: {votes} votes") | |
# Sort images by vote count | |
sorted_images = sorted(vote_history['images'].items(), key=lambda x: x[1]['votes'], reverse=True) | |
st.sidebar.subheader("Image Vote Totals") | |
for i, (image_name, data) in enumerate(sorted_images): | |
votes = data['votes'] | |
st.sidebar.write(f"{image_name}: {votes} votes") | |
# Display top 3 images | |
if i < 3: | |
st.sidebar.image(os.path.join('.', image_name), caption=f"#{i+1}: {image_name}", width=150) | |
# Main function | |
def main(): | |
st.title("π Super Quote Generator with Image Voting") | |
st.write("Welcome to the Super Quote Generator! Enjoy famous and custom quotes with advanced features.") | |
# Initialize session states | |
if 'auto_repeat' not in st.session_state: | |
st.session_state.auto_repeat = "On" | |
if 'current_index' not in st.session_state: | |
st.session_state.current_index = 0 | |
if 'quotes_list' not in st.session_state: | |
st.session_state.quotes_list = 'Famous Quotes' | |
if 'quotes_data' not in st.session_state: | |
st.session_state.quotes_data = pd.DataFrame() | |
if 'last_interaction' not in st.session_state: | |
st.session_state.last_interaction = time.time() | |
# Sidebar configuration | |
with st.sidebar: | |
st.header("Settings") | |
# Data source selection | |
st.session_state.quotes_list = st.radio("Select Quote Source:", ['Famous Quotes', 'Custom Quotes']) | |
# AutoRepeat toggle | |
st.session_state.auto_repeat = st.radio("π AutoRepeat", ["On", "Off"], horizontal=True) | |
st.markdown("---") | |
st.write("Famous quotes provided by the app.") | |
# Display user hash | |
st.subheader("Your User ID") | |
st.write(generate_user_hash()) | |
# Show vote history | |
show_vote_history() | |
# Load quotes data | |
if st.session_state.quotes_list == 'Famous Quotes': | |
st.session_state.quotes_data = load_famous_quotes() | |
else: | |
st.session_state.quotes_data = pd.DataFrame(custom_quotes) | |
# Ensure current_index is within bounds | |
if len(st.session_state.quotes_data) > 0: | |
st.session_state.current_index = st.session_state.current_index % len(st.session_state.quotes_data) | |
else: | |
st.session_state.current_index = 0 | |
# Display images for voting | |
image_dir = '.' # Current directory where the app is running | |
display_images(image_dir) | |
# Display the current quote | |
st.subheader("Quote of the Moment") | |
if len(st.session_state.quotes_data) > 0: | |
current_quote = st.session_state.quotes_data.iloc[st.session_state.current_index] | |
display_quote(current_quote) | |
else: | |
st.write("No quotes available.") | |
# Timer logic | |
if st.session_state.auto_repeat == "On": | |
timer_placeholder = st.empty() | |
time_left = 10 - (time.time() - st.session_state.last_interaction) | |
if time_left <= 0: | |
# Alternate between the two quotes lists | |
if st.session_state.quotes_list == 'Famous Quotes': | |
st.session_state.quotes_list = 'Custom Quotes' | |
else: | |
st.session_state.quotes_list = 'Famous Quotes' | |
# Load the new quotes data | |
if st.session_state.quotes_list == 'Famous Quotes': | |
st.session_state.quotes_data = load_famous_quotes() | |
else: | |
st.session_state.quotes_data = pd.DataFrame(custom_quotes) | |
# Select a new random quote | |
if len(st.session_state.quotes_data) > 0: | |
st.session_state.current_index = random.randint(0, len(st.session_state.quotes_data) - 1) | |
else: | |
st.session_state.current_index = 0 | |
st.session_state.last_interaction = time.time() | |
st.rerun() | |
else: | |
timer_placeholder.text(f"Time left: {int(time_left)} seconds") | |
else: | |
st.session_state.last_interaction = time.time() | |
# Manual refresh button | |
if st.button("Refresh Now"): | |
# Alternate between the two quotes lists | |
if st.session_state.quotes_list == 'Famous Quotes': | |
st.session_state.quotes_list = 'Custom Quotes' | |
else: | |
st.session_state.quotes_list = 'Famous Quotes' | |
# Load the new quotes data | |
if st.session_state.quotes_list == 'Famous Quotes': | |
st.session_state.quotes_data = load_famous_quotes() | |
else: | |
st.session_state.quotes_data = pd.DataFrame(custom_quotes) | |
# Select a new random quote | |
if len(st.session_state.quotes_data) > 0: | |
st.session_state.current_index = random.randint(0, len(st.session_state.quotes_data) - 1) | |
else: | |
st.session_state.current_index = 0 | |
st.session_state.last_interaction = time.time() | |
st.rerun() | |
if __name__ == "__main__": | |
main() |