Skip to main content

The Problem

Publishing regular video content — daily news roundups, weekly company updates, recurring educational series — is unsustainable without a production team. But consistency is what builds an audience.

How It Works

Schedule triggers → Aggregate content → LLM writes script → Video Agent renders → Auto-distribute
A fully automated pipeline that runs on a schedule, collects fresh content from your sources, generates a video, and delivers it to your audience — no human in the loop.

Build It

1

Set up content aggregation

Pull content from whatever sources feed your broadcast.
import requests
from datetime import datetime

def aggregate_content():
    stories = []

    # RSS feeds
    import feedparser
    feed = feedparser.parse("https://news.ycombinator.com/rss")
    for entry in feed.entries[:5]:
        stories.append({
            "title": entry.title,
            "summary": entry.get("summary", ""),
            "source": "Hacker News",
            "url": entry.link,
        })

    # APIs (example: your internal metrics)
    metrics = requests.get("https://api.yourapp.com/weekly-stats").json()
    stories.append({
        "title": f"This week: {metrics['new_users']} new users, {metrics['revenue']} revenue",
        "summary": f"Growth of {metrics['growth_pct']}% week over week",
        "source": "Internal",
    })

    return stories

stories = aggregate_content()
2

Generate a video script with an LLM

import anthropic

client = anthropic.Anthropic()

story_text = "\n".join(
    f"- {s['title']} ({s['source']}): {s['summary']}"
    for s in stories
)

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1500,
    messages=[{
        "role": "user",
        "content": f"""Create a HeyGen Video Agent prompt for a 60-second
news/update video.

Date: {datetime.now().strftime('%B %d, %Y')}

Stories to cover:
{story_text}

Structure:
- Intro (5s): "Here's your [daily/weekly] update for [date]"
- Stories (45s): Cover the top 3 stories with text overlays for key stats
- Sign-off (10s): "That's your update. See you [tomorrow/next week]."

Tone: Authoritative but approachable. Clean, news-desk style background.
Keep pacing brisk — one story every 15 seconds."""
    }],
)
video_prompt = message.content[0].text
3

Generate the video

resp = requests.post(
    "https://api.heygen.com/v3/video-agents",
    headers={
        "X-Api-Key": HEYGEN_API_KEY,
        "Content-Type": "application/json",
    },
    json={"prompt": video_prompt},
)
video_id = resp.json()["data"]["video_id"]

# Poll until complete
import time
while True:
    status = requests.get(
        f"https://api.heygen.com/v3/videos/{video_id}",
        headers={"X-Api-Key": HEYGEN_API_KEY},
    ).json()["data"]

    if status["status"] == "completed":
        video_url = status["video_url"]
        break
    elif status["status"] == "failed":
        raise Exception(f"Video failed: {status.get('failure_message')}")

    time.sleep(15)
4

Distribute automatically

Deliver the video to your audience wherever they are.
# Telegram
import telegram
bot = telegram.Bot(token=TELEGRAM_TOKEN)
bot.send_video(chat_id=CHANNEL_ID, video=video_url, caption="Daily Update")

# Slack
requests.post(SLACK_WEBHOOK, json={
    "text": f"Daily update is ready: {video_url}",
})

# Email (via your ESP)
send_email(
    to=subscriber_list,
    subject=f"Your Daily Update — {datetime.now().strftime('%B %d')}",
    html=f'<a href="{video_url}"><img src="{thumbnail_url}"></a>',
)
5

Schedule it

Run the pipeline on a schedule using cron, GitHub Actions, or a cloud function.
# .github/workflows/daily-broadcast.yml
name: Daily Video Broadcast
on:
  schedule:
    - cron: '0 17 * * 1-5'  # 5 PM UTC, weekdays
jobs:
  broadcast:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install -r requirements.txt
      - run: python broadcast.py
        env:
          HEYGEN_API_KEY: ${{ secrets.HEYGEN_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}

Real-World Example

STUDIO 47, a German broadcaster, reported these results after adopting HeyGen for automated video production (via HeyGen customer stories):
  • Significantly faster content creation
  • 24/7 production capability
  • Substantial cost reduction vs traditional production
  • Expanded into multilingual content that wasn’t feasible before

Resilient Delivery

Build fallbacks for when things go wrong:
def deliver(video_url, caption):
    try:
        # Try primary: send video by URL
        bot.send_video(chat_id=CHANNEL_ID, video=video_url, caption=caption)
    except Exception:
        try:
            # Fallback: download and upload as file
            video_data = requests.get(video_url).content
            bot.send_video(chat_id=CHANNEL_ID, video=video_data, caption=caption)
        except Exception:
            # Last resort: send text with link
            bot.send_message(chat_id=CHANNEL_ID, text=f"{caption}\n\n{video_url}")

Broadcast Types

TypeScheduleContent sourceDuration
Daily newsEvery morningRSS, APIs, web scrape45–60s
Weekly roundupMonday morningInternal metrics + industry news90s
Product changelogEach releaseGit commits, release notes30–45s
Company all-handsWeekly/monthlyMeeting notes, updates60–90s
Social digestDailyTrending topics in your niche30s

Variations

  • Multi-language: Generate once, translate for regional audiences
  • Different avatars per topic: Use different presenters for different content categories
  • Audience segmentation: Generate different versions for different subscriber segments

Next Steps

Content Repurposing

Repurpose existing content instead of aggregating new content.

Docs to Video

Trigger video generation from code changes instead of a schedule.