ContentAnalyzer / app.py
MHamdan's picture
Update app.py
8e8a46c verified
raw
history blame
3.81 kB
import gradio as gr
import time
import requests
import os
def read_file(file_obj):
"""Reads text from a .txt file only (no PDF/docx)."""
if file_obj is None:
return ""
file_ext = os.path.splitext(file_obj.name)[1].lower()
if file_ext != ".txt":
return f"Unsupported file type: {file_ext}"
try:
return file_obj.read().decode("utf-8")
except Exception as e:
return f"Error reading file: {str(e)}"
def fetch_url(url: str):
"""Fetch text from URL."""
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.text[:1000] # just show first 1000 chars
except Exception as e:
return f"Error fetching URL: {str(e)}"
def process_input(choice, text_val, url_val, file_val):
"""
Minimal process function that:
1. Shows a progress bar for 4 steps (with time.sleep to visualize).
2. Reads content from the chosen input type.
3. Returns that content to the output.
"""
with gr.Progress() as p:
# STEP 1: "Reading input" placeholder
p(0, total=4, desc="Reading input")
time.sleep(1)
# Actually read the content now
if choice == "Text":
content = text_val or "No text provided"
elif choice == "URL":
content = fetch_url(url_val or "")
else: # "File"
content = read_file(file_val)
# STEP 2: Some dummy step
p(1, total=4, desc="Doing something else")
time.sleep(1)
# STEP 3: Another dummy step
p(2, total=4, desc="Almost done...")
time.sleep(1)
# STEP 4: Final step
p(3, total=4, desc="Finalizing")
time.sleep(1)
# Return the content to show in the output
return content
def create_interface():
with gr.Blocks(title="Minimal Progress Bar Demo") as demo:
gr.Markdown("# Minimal Progress Bar Demo")
gr.Markdown(
"Select an input type, provide some data, then click **Analyze**. "
"A progress bar will appear with four steps."
)
# 1) Dropdown to select input
input_choice = gr.Dropdown(
choices=["Text", "URL", "File"],
value="Text",
label="Select Input Type"
)
# 2) Containers for each input
with gr.Column(visible=True) as text_col:
text_input = gr.Textbox(
label="Enter Text",
placeholder="Paste text here...",
lines=3
)
with gr.Column(visible=False) as url_col:
url_input = gr.Textbox(
label="Enter URL",
placeholder="https://example.com"
)
with gr.Column(visible=False) as file_col:
file_input = gr.File(
label="Upload a .txt File Only",
file_types=[".txt"]
)
# Toggle visibility function
def show_inputs(choice):
return {
text_col: choice == "Text",
url_col: choice == "URL",
file_col: choice == "File"
}
input_choice.change(
fn=show_inputs,
inputs=[input_choice],
outputs=[text_col, url_col, file_col]
)
analyze_btn = gr.Button("Analyze", variant="primary")
# 3) Output
output_box = gr.Textbox(
label="Output",
lines=6
)
# Link the button to the process function
analyze_btn.click(
fn=process_input,
inputs=[input_choice, text_input, url_input, file_input],
outputs=[output_box],
show_progress=True
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch()