Spaces:
Running
Running
import streamlit as st | |
import requests | |
import speech_recognition as sr | |
import pandas as pd | |
import altair as alt | |
from PIL import Image | |
from io import BytesIO | |
# Ensure set_page_config is the first Streamlit command | |
st.set_page_config(page_title="Google Search App", layout="wide") | |
# Function to perform Google Search | |
def google_search(api_key, cse_id, query, num_results=10): | |
url = "https://www.googleapis.com/customsearch/v1" | |
params = {'key': api_key, 'cx': cse_id, 'q': query, 'num': num_results} | |
response = requests.get(url, params=params) | |
return response.json() | |
# Initialize search history and data storage for analytics | |
if 'search_history' not in st.session_state: | |
st.session_state.search_history = [] | |
if 'search_data' not in st.session_state: | |
st.session_state.search_data = pd.DataFrame(columns=["Query", "Source", "Timestamp"]) | |
def main(): | |
st.title("Enhanced Google Search Application") | |
# User inputs for API key, CSE ID, and search query | |
api_key = st.secrets["GOOGLE_API_KEY"] # Use Streamlit secrets for security | |
cse_id = st.secrets["CSE_ID"] | |
query = st.text_input("Enter your search query", "", key='query_input') | |
# Voice search feature | |
if st.button("Use Voice Search"): | |
recognizer = sr.Recognizer() | |
with sr.Microphone() as source: | |
st.write("Listening...") | |
audio = recognizer.listen(source) | |
try: | |
query = recognizer.recognize_google(audio) | |
st.write(f"You said: {query}") | |
if api_key and cse_id and query: | |
results = google_search(api_key, cse_id, query) | |
update_search_history(query, "Voice") | |
display_results(results) | |
except sr.UnknownValueError: | |
st.error("Could not understand audio.") | |
except sr.RequestError: | |
st.error("Could not request results from Google.") | |
# Trigger search when clicking the search button | |
if st.button("Search") and query: | |
if api_key and cse_id: | |
results = google_search(api_key, cse_id, query) | |
update_search_history(query, "Text") | |
display_results(results) | |
else: | |
st.error("Please enter API Key, CSE ID, and a search query.") | |
# Show search history | |
if st.button("Show Search History"): | |
if st.session_state.search_history: | |
st.write("Search History:") | |
for h in st.session_state.search_history: | |
st.write(h) | |
else: | |
st.write("No search history found.") | |
# Clear search history | |
if st.button("Clear Search History"): | |
st.session_state.search_history.clear() | |
st.session_state.search_data = pd.DataFrame(columns=["Query", "Source", "Timestamp"]) | |
st.success("Search history cleared.") | |
# Interactive Analytics Dashboard | |
st.subheader("Search Analytics") | |
if not st.session_state.search_data.empty: | |
search_trends = alt.Chart(st.session_state.search_data).mark_line().encode( | |
x='Timestamp:T', | |
y='count():Q', | |
color='Source:N', | |
tooltip=['Query:N', 'count():Q', 'Source:N'] | |
).properties(width=600, height=300) | |
st.altair_chart(search_trends, use_container_width=True) | |
# Most popular queries | |
st.write("**Top Search Queries**") | |
top_queries = ( | |
st.session_state.search_data['Query'] | |
.value_counts() | |
.head(5) | |
.reset_index() | |
.rename(columns={'index': 'Query', 'Query': 'Count'}) | |
) | |
st.write(top_queries) | |
def display_results(results): | |
if results and 'items' in results: | |
for i, item in enumerate(results['items']): | |
st.write(f"**{i + 1}. {item['title']}**") | |
st.write(f"[Link]({item['link']})") | |
st.write(f"{item['snippet']}\n") | |
# Display image if available | |
if 'pagemap' in item and 'cse_image' in item['pagemap']: | |
image_data = item['pagemap']['cse_image'][0] | |
image_url = image_data.get('src') | |
if image_url: | |
try: | |
response = requests.get(image_url) | |
img = Image.open(BytesIO(response.content)) | |
st.image(img, width=100) | |
except Exception: | |
st.write("**Image could not be loaded.**") | |
else: | |
st.write("**Image source not available.**") | |
else: | |
st.write("No image available for this result.") | |
else: | |
st.write("No results found.") | |
def update_search_history(query, source): | |
st.session_state.search_history.append(query) | |
new_data = pd.DataFrame({ | |
"Query": [query], | |
"Source": [source], | |
"Timestamp": [pd.Timestamp.now()] | |
}) | |
st.session_state.search_data = pd.concat([st.session_state.search_data, new_data], ignore_index=True) | |
if __name__ == "__main__": | |
main() | |