News / app.py
Dave67350's picture
Create app.py
35663f6 verified
Raw
History Blame Contribute Delete
3.98 kB
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))