# Turn a YouTube video into newsletter notes with cited quotes

> Get a summary, key points and pull quotes from a YouTube talk, interview or podcast, each quote linked to its moment, and a script that drafts the section.

Updated 2026-10-06. HTML: /blog/video-to-newsletter-notes

If you write about talks, interviews or podcasts, the slow part is finding what to quote. The `summary` preset does the first pass: a short summary, the key points, the most quotable lines and the people in it, with a link to the moment behind every quote.

You still choose what goes in. You just don't scrub through the video to find it.

## Run it

Paste a link into the [playground](/playground) and choose `summary`, or call the API:

```python
# pip install cleanscript-ai
from cleanscript_ai import CleanScript

client = CleanScript()
result = client.extract("https://www.youtube.com/watch?v=UF8uR6Z6KLc", preset="summary")
```

`result.data` has `summary`, `key_points`, `quotes` and `people`. For Steve Jobs' [2005 Stanford Commencement Address](https://www.youtube.com/watch?v=UF8uR6Z6KLc), the summary begins:

> In his Stanford commencement address, Steve Jobs recounts three stories from his life: dropping out of college and later seeing how calligraphy influenced the Macintosh, being fired from Apple and finding renewed creative purpose, and confronting a cancer diagnosis that led him to reflect on mortality.

The quotes:

```json
"quotes": [
  "Again, you can't connect the dots looking forward; you can only connect them looking backwards.",
  "Your time is limited, so don't waste it living someone else's life.",
  "Stay Hungry. Stay Foolish."
]
```

And the citation for the second:

```json
"quotes[1]": [{
  "quote": "Your time is limited, so don't waste it living someone else's life.",
  "source": "speech",
  "start": 752.15,
  "end": 757.29,
  "url": "https://youtu.be/UF8uR6Z6KLc?t=752"
}]
```

The link opens the video at 12:32.

## Draft the section

This prints a newsletter section with the summary, three key points and the quotes with timestamp links:

```python
def stamp(seconds):
    m, s = divmod(int(seconds), 60)
    return f"{m}:{s:02}"

post, data = result.post, result.data
lines = [f"## {post.title}", f"By {post.author.name}", "", data["summary"] or "", "", "**Key points**", ""]
lines += [f"- {point}" for point in data["key_points"][:3]]
lines += ["", "**Worth quoting**", ""]
for i in range(len(data["quotes"])):
    cite = result.citations[f"quotes[{i}]"][0]
    lines.append(f"> {cite.quote}\n> [{stamp(cite.start)}]({cite.url})\n")

print("\n".join(lines))
```

The last two quotes come out as:

```text
> Your time is limited, so don't waste it living someone else's life.
> [12:32](https://youtu.be/UF8uR6Z6KLc?t=752)

> Stay Hungry. Stay Foolish.
> [14:28](https://youtu.be/UF8uR6Z6KLc?t=868)
```

## Before you send

- **Quote only the citations.** Each `citations["quotes[i]"]` quote is the speaker's words, checked against the post. The summary and key points are paraphrase, so keep them out of quotation marks.
- **Check the summary against the video.** It's a fair first draft, in the model's words. Your take should be in yours.
- **Click the links** for anything you quote.
- **Credit the creator** and link the video: `post` has the author and URL.

## Your own format

If your newsletter has fixed parts, such as "the one idea", "the number to remember" and "what to try", describe them as fields in your own schema. See [extract fields from a video](/blog/json-schema-fields-from-video).

For another language, pass `language`: values are written in it, and quotes stay in the words that were spoken.
