Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| from bs4 import BeautifulSoup | |
| from transformers import pipeline | |
| # Load summarization pipeline | |
| summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6") | |
| def scrape_website(url): | |
| """Extracts text from a website with error handling""" | |
| try: | |
| headers = {'User-Agent': 'Mozilla/5.0'} | |
| response = requests.get(url, headers=headers, timeout=10) | |
| response.raise_for_status() | |
| soup = BeautifulSoup(response.text, "html.parser") | |
| text_elements = soup.find_all(['p', 'article', 'main', 'section']) | |
| text = " ".join([e.get_text(strip=True, separator=' ') for e in text_elements]) | |
| return text.strip() if text.strip() else "No content found" | |
| except Exception as e: | |
| return f"Scraping Error: {str(e)}" | |
| def summarize_website(url): | |
| """Handles the full summarization pipeline""" | |
| try: | |
| extracted_text = scrape_website(url) | |
| if "Error" in extracted_text: | |
| return f"β {extracted_text}" | |
| if len(extracted_text.split()) < 50: | |
| return "β οΈ Error: Insufficient content for summarization (minimum 50 words required)" | |
| max_input_length = 1000 | |
| truncated_text = extracted_text[:max_input_length] | |
| summary = summarizer( | |
| truncated_text, | |
| max_length=200, | |
| min_length=50, | |
| do_sample=False, | |
| truncation=True | |
| ) | |
| return f"## π Summary\n\n{summary[0]['summary_text']}" | |
| except Exception as e: | |
| return f"β Summarization Error: {str(e)}" | |
| # Custom CSS for mobile optimization | |
| css = """ | |
| @media screen and (max-width: 600px) { | |
| .container { | |
| padding: 10px !important; | |
| } | |
| .input-box textarea { | |
| font-size: 16px !important; | |
| } | |
| } | |
| """ | |
| # Mobile-optimized interface with Blocks API | |
| with gr.Blocks(theme=gr.themes.Soft(), css=css, title="Website Summarizer") as app: | |
| gr.Markdown("# π AI Website Summarizer") | |
| gr.Markdown("Paste any website URL below to get an instant AI-powered summary!") | |
| with gr.Row(): | |
| url_input = gr.Textbox( | |
| label="Website URL", | |
| placeholder="Enter full URL (https://...)", | |
| lines=1, | |
| max_lines=1, | |
| elem_id="input-box" | |
| ) | |
| with gr.Row(): | |
| submit_btn = gr.Button("Generate Summary π", variant="primary") | |
| clear_btn = gr.Button("Clear π") | |
| output = gr.Markdown() | |
| # Example section | |
| gr.Examples( | |
| examples=[ | |
| ["https://en.wikipedia.org/wiki/Large_language_model"], | |
| ["https://www.bbc.com/news/technology-66510295"] | |
| ], | |
| inputs=url_input, | |
| label="Try these examples:", | |
| examples_per_page=2 | |
| ) | |
| # Event handlers | |
| submit_btn.click( | |
| fn=summarize_website, | |
| inputs=url_input, | |
| outputs=output, | |
| api_name="summarize" | |
| ) | |
| clear_btn.click( | |
| fn=lambda: ("", ""), | |
| inputs=None, | |
| outputs=[url_input, output], | |
| queue=False | |
| ) | |
| # Mobile-friendly configuration | |
| app.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| favicon_path="https://www.svgrepo.com/show/355037/huggingface.svg" | |
| ) |