import gradio as gr from newsletter import generate_newsletter from mcp_client import DEFAULT_TOPICS from email_client import send_email_via_mcp import os import requests # 🔄 Load subscribers from your Django server on PythonAnywhere def get_subscribers_from_django(): try: res = requests.get("https://davebohnert.pythonanywhere.com/daveblog/api/subscribers/") res.raise_for_status() data = res.json() return data.get("emails", []) except Exception as e: print("❌ Error fetching subscribers from Django:", e) return [] # 🧠 Prepare newsletter content def prepare_inputs(topic_input, region, hours): if topic_input.strip(): topics = [t.strip() for t in topic_input.split(",") if t.strip()] else: topics = DEFAULT_TOPICS markdown_text, md_path, pdf_path = generate_newsletter(topics, region, hours) md_path = os.path.relpath(md_path, start=os.getcwd()) pdf_path = os.path.relpath(pdf_path, start=os.getcwd()) return markdown_text, md_path, pdf_path # ✉️ Send newsletter via email with fallback to subscriber list def send_newsletter_email(markdown_text, subject, recipient, sender_email=None, smtp_password=None): if recipient.strip(): bcc_list = [r.strip() for r in recipient.split(",") if r.strip()] else: bcc_list = get_subscribers_from_django() if not bcc_list: raise ValueError("No recipients provided and no fallback subscribers found.") smtp_login = sender_email or os.getenv("DEFAULT_SENDER_EMAIL", "dave.bohnert77@gmail.com") visible_sender = f"DataDave Newsletter <{smtp_login}>" # ✅ Only a display name smtp_password = smtp_password or os.getenv("DEFAULT_SMTP_PASSWORD", "jqgi udjp bgxx gynk") smtp_host = os.getenv("SMTP_HOST", "smtp.gmail.com") smtp_port = int(os.getenv("SMTP_PORT", "587")) subject = subject or "📰 AI Newsletter" return send_email_via_mcp( markdown_content=markdown_text, subject=subject, recipient=bcc_list, sender_email=visible_sender, smtp_login=smtp_login, smtp_password=smtp_password, smtp_host=smtp_host, smtp_port=smtp_port, ) # 🌐 Gradio UI with gr.Blocks() as demo: gr.Markdown("## 🗞️ EU AI Regulation Weekly") with gr.Row(): topic_input = gr.Textbox( label="Topics (comma-separated)", value="", placeholder="e.g. AI, GDPR, AI Act, AI regulation, DORA, NIS2..." ) region = gr.Textbox(label="Region", value="Europe") hours = gr.Number(label="Lookback Hours", value=168) with gr.Row(): preview = gr.Textbox(label="Newsletter Preview", lines=30) md_file = gr.File(label="📄 Download Markdown") pdf_file = gr.File(label="🖨️ Download PDF", file_types=[".pdf"], interactive=True) with gr.Row(): recipient_email = gr.Textbox( label="📩 Recipient Email(s)", placeholder="Leave empty to send to all subscribers" ) sender_email = gr.Textbox(label="📤 Sender Email", placeholder="your.email@gmail.com") smtp_password = gr.Textbox(label="🔐 SMTP Password", type="password") subject = gr.Textbox(label="📝 Subject", value="📰 Your AI Newsletter") btn = gr.Button("📬 Generate Newsletter") btn.click( fn=prepare_inputs, inputs=[topic_input, region, hours], outputs=[preview, md_file, pdf_file], preprocess=False ) send_btn = gr.Button("✉️ Send Newsletter via Email (BCC)") send_btn.click( fn=send_newsletter_email, inputs=[preview, subject, recipient_email, sender_email, smtp_password], outputs=[] ) #demo.launch() if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 7860))) print("✅ App has started on port", os.environ.get("PORT", 7860))