<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: text-to-video</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/text-to-video.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-07-23T19:08:32+00:00</updated><author><name>Simon Willison</name></author><entry><title>Instagram Reel: Veo 3 paid preview</title><link href="https://simonwillison.net/2025/Jul/23/instagram-reel-veo-3-paid-preview/#atom-tag" rel="alternate"/><published>2025-07-23T19:08:32+00:00</published><updated>2025-07-23T19:08:32+00:00</updated><id>https://simonwillison.net/2025/Jul/23/instagram-reel-veo-3-paid-preview/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.instagram.com/googlefordevs/reel/DMblrKYuTHH/"&gt;Instagram Reel: Veo 3 paid preview&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
@googlefordevs on Instagram published this reel featuring Christina Warren with prompting tips for the new Veo 3 paid preview (&lt;a href="https://static.simonwillison.net/static/2025/googlefordevs-veo3.mp4"&gt;mp4 copy here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img alt="It's a pelican riding a bicycle in front of the Golden Gate Bridge, wearing a blue hat. Overlaid text says Specify the environment or setting where your scene takes place." src="https://static.simonwillison.net/static/2025/veo-3-pelican.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;(Christine checked first if I minded them using &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/"&gt;that concept&lt;/a&gt;. I did not!)


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gemini"&gt;gemini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-video"&gt;text-to-video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video-models"&gt;video-models&lt;/a&gt;&lt;/p&gt;



</summary><category term="google"/><category term="ai"/><category term="generative-ai"/><category term="gemini"/><category term="pelican-riding-a-bicycle"/><category term="text-to-video"/><category term="video-models"/></entry><entry><title>Veo 2</title><link href="https://simonwillison.net/2024/Dec/16/veo-2/#atom-tag" rel="alternate"/><published>2024-12-16T23:31:59+00:00</published><updated>2024-12-16T23:31:59+00:00</updated><id>https://simonwillison.net/2024/Dec/16/veo-2/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://deepmind.google/technologies/veo/veo-2/"&gt;Veo 2&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Google's text-to-video model, now available via waitlisted preview. I got through the waitlist and tried the same prompt I &lt;a href="https://simonwillison.net/2024/Dec/9/sora/"&gt;ran against OpenAI's Sora&lt;/a&gt; last week:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;A pelican riding a bicycle along a coastal path overlooking a harbor&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It generated these four videos:&lt;/p&gt;
&lt;div style="max-width: 100%;"&gt;
    &lt;video 
        controls 
        preload="none"
        aria-label="The Veo 2 interface. The prompt is on the left, four videos are on the right. Two of the videos have the pelican riding a bicycle, in one the pelican is perched on a stationary bicycle and in one the pelican is just running along the road. The quality of all four is very high, though in one the pelican is wearing a weird looking pelican bicycle helmet."
        poster="https://static.simonwillison.net/static/2024/pelicans-on-bicycles-veo2.jpg" loop
        style="width: 100%; height: auto;"&gt;
        &lt;source src="https://static.simonwillison.net/static/2024/pelicans-on-bicycles-veo2.mp4" type="video/mp4"&gt;
    &lt;/video&gt;
&lt;/div&gt;

&lt;p&gt;Here's &lt;a href="https://static.simonwillison.net/static/2024/pelicans-on-bicycles-veo2.mp4"&gt;the larger video&lt;/a&gt;.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://news.ycombinator.com/item?id=42432914"&gt;Hacker News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-video"&gt;text-to-video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video-models"&gt;video-models&lt;/a&gt;&lt;/p&gt;



</summary><category term="google"/><category term="ai"/><category term="generative-ai"/><category term="pelican-riding-a-bicycle"/><category term="text-to-video"/><category term="video-models"/></entry><entry><title>Sora</title><link href="https://simonwillison.net/2024/Dec/9/sora/#atom-tag" rel="alternate"/><published>2024-12-09T18:35:36+00:00</published><updated>2024-12-09T18:35:36+00:00</updated><id>https://simonwillison.net/2024/Dec/9/sora/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://sora.com/"&gt;Sora&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
OpenAI's released their long-threatened &lt;a href="https://openai.com/index/sora-is-here/"&gt;Sora&lt;/a&gt; text-to-video model this morning, available in most non-European countries to subscribers to ChatGPT Plus ($20/month) or Pro ($200/month).&lt;/p&gt;
&lt;p&gt;Here's what I got for the very first test prompt I ran through it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;A pelican riding a bicycle along a coastal path overlooking a harbor&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="max-width: 100%;"&gt;
    &lt;video 
        controls 
        preload="none"
        aria-label="It's a white pelican riding a slightly chunky red bicycle, which inexplicably morphs to flip backwards half way through the clip. It's on a coastal path with boats in the background."
        poster="https://static.simonwillison.net/static/2024/pelican-bicycle-sora.jpg"
        style="width: 100%; height: auto;"&gt;
        &lt;source src="https://static.simonwillison.net/static/2024/pelican-bicycle-sora.mp4" type="video/mp4"&gt;
    &lt;/video&gt;
&lt;/div&gt;

&lt;p&gt;The Pelican inexplicably morphs to cycle in the opposite direction half way through, but I don't see that as a particularly significant issue: Sora is built entirely around the idea of directly manipulating and editing and remixing the clips it generates, so the goal isn't to have it produce usable videos from a single prompt.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://www.youtube.com/watch?v=2jKVx2vyZOY"&gt;Sora–12 Days of OpenAI: Day 3&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/video"&gt;video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openai"&gt;openai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/pelican-riding-a-bicycle"&gt;pelican-riding-a-bicycle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-video"&gt;text-to-video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video-models"&gt;video-models&lt;/a&gt;&lt;/p&gt;



</summary><category term="video"/><category term="ai"/><category term="openai"/><category term="generative-ai"/><category term="pelican-riding-a-bicycle"/><category term="text-to-video"/><category term="video-models"/></entry><entry><title>Google Research: Lumiere</title><link href="https://simonwillison.net/2024/Jan/24/google-research-lumiere/#atom-tag" rel="alternate"/><published>2024-01-24T19:58:37+00:00</published><updated>2024-01-24T19:58:37+00:00</updated><id>https://simonwillison.net/2024/Jan/24/google-research-lumiere/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://lumiere-video.github.io/"&gt;Google Research: Lumiere&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The latest in text-to-video from Google Research, described as “a text-to-video diffusion model designed for synthesizing videos that portray realistic, diverse and coherent motion”.&lt;/p&gt;

&lt;p&gt;Most existing text-to-video models generate keyframes and then use other models to fill in the gaps, which frequently leads to a lack of coherency. Lumiere “generates the full temporal duration of the video at once”, which avoids this problem.&lt;/p&gt;

&lt;p&gt;Disappointingly but unsurprisingly the paper doesn’t go into much detail on the training data, beyond stating “We train our T2V model on a dataset containing 30M videos along with their text caption. The videos are 80 frames long at 16 fps (5 seconds)”.&lt;/p&gt;

&lt;p&gt;The examples of “stylized generation” which combine a text prompt with a single reference image for style are particularly impressive.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/video"&gt;video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-video"&gt;text-to-video&lt;/a&gt;&lt;/p&gt;



</summary><category term="google"/><category term="video"/><category term="ai"/><category term="generative-ai"/><category term="text-to-video"/></entry><entry><title>Exploring 10m scraped Shutterstock videos used to train Meta's Make-A-Video text-to-video model</title><link href="https://simonwillison.net/2022/Sep/29/webvid/#atom-tag" rel="alternate"/><published>2022-09-29T19:31:24+00:00</published><updated>2022-09-29T19:31:24+00:00</updated><id>https://simonwillison.net/2022/Sep/29/webvid/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;a href="https://makeavideo.studio/"&gt;Make-A-Video&lt;/a&gt; is a new "state-of-the-art AI system that generates videos from text" from Meta AI. It looks incredible - it really is DALL-E / Stable Diffusion for video. And it appears to have been trained on 10m video preview clips scraped from Shutterstock.&lt;/p&gt;
&lt;p&gt;I built a new search engine to explore those ten million clips:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://webvid.datasette.io/webvid/videos"&gt;https://webvid.datasette.io/webvid/videos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2022/webvid-datasette.jpg" alt="A search for mars rocks returns 33 videos, each shown with a video player" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;This is similar to &lt;a href="https://simonwillison.net/2022/Sep/5/laion-aesthetics-weeknotes/"&gt;the system I built with Andy Baio&lt;/a&gt; a few weeks ago to explore the LAION data used to train Stable Diffusion.&lt;/p&gt;
&lt;h4&gt;Make-A-Video training data&lt;/h4&gt;
&lt;p&gt;Meta AI's &lt;a href="https://makeavideo.studio/Make-A-Video.pdf"&gt;paper describing the model&lt;/a&gt; includes this section about the training data:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Datasets.&lt;/strong&gt; To train the image models, we use a 2.3B subset of the dataset from (Schuhmann et al.) where the text is English. We filter out sample pairs with NSFW images 2, toxic words in the text, or images with a watermark probability larger than 0.5.&lt;/p&gt;
&lt;p&gt;We use WebVid-10M (Bain et al., 2021) and a 10M subset from HD-VILA-100M (Xue et al., 2022) 3 to train our video generation models. Note that only the videos (no aligned text) are used.&lt;/p&gt;
&lt;p&gt;The decoder Dt and the interpolation model is trained on WebVid-10M. SRt l is trained on both WebVid-10M and HD-VILA-10M. While prior work (Hong et al., 2022; Ho et al., 2022) have collected private text-video pairs for T2V generation, we use only public datasets (and no paired text for videos). We conduct automatic evaluation on UCF-101 (Soomro et al., 2012) and MSR-VTT (Xu et al., 2016) in a zero-shot setting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That 2.3B subset of images is the same LAION data &lt;a href="https://simonwillison.net/2022/Sep/5/laion-aesthetics-weeknotes/"&gt;I explored previously&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/microsoft/XPretrain/tree/main/hd-vila-100m"&gt;HD-VILA-100M&lt;/a&gt; was collected by Microsoft Research Asia - &lt;a href="https://twitter.com/waxpancake/status/1575564723546103808"&gt;Andy Baio notes&lt;/a&gt; that these were scraped from YouTube.&lt;/p&gt;
&lt;p&gt;I decided to take a look at the &lt;a href="https://m-bain.github.io/webvid-dataset/"&gt;WebVid-10M&lt;/a&gt; data.&lt;/p&gt;
&lt;h4&gt;WebVid-10M&lt;/h4&gt;
&lt;p&gt;The &lt;a href="https://m-bain.github.io/webvid-dataset/"&gt;WebVid-10M site&lt;/a&gt; describes the data like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WebVid-10M is a large-scale dataset of short videos with textual descriptions sourced from the web. The videos are diverse and rich in their content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="https://www.arxiv-vanity.com/papers/2104.00650/"&gt;accompanying paper&lt;/a&gt; provides a little bit more detail:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We scrape the web for a new dataset of videos with textual description annotations, called WebVid-2M. Our dataset consists of 2.5M video-text pairs, which is an order of magnitude larger than existing video captioning datasets (see Table 1).&lt;/p&gt;
&lt;p&gt;The data was scraped from the web following a similar procedure to Google Conceptual Captions [55] (CC3M). We note that more than 10% of CC3M images are in fact thumbnails from videos, which motivates us to use such video sources to scrape a total of 2.5M text-video pairs. The use of data collected for this study is authorised via the &lt;a href="https://www.gov.uk/guidance/exceptions-to-copyright/"&gt;Intellectual Property Office’s Exceptions to Copyright for Non-Commercial Research and Private Study&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm presuming that Web-10M is a larger version of the WebVid-2M dataset described in the paper.&lt;/p&gt;
&lt;p&gt;Most importantly though, the website includes a link to a 2.7GB CSV file - &lt;code&gt;results_10M_train.csv&lt;/code&gt; - containing the full WebVid-10M dataset. The CSV file looks like this:&lt;/p&gt;
&lt;pre lang="csv"&gt;&lt;code&gt;videoid,contentUrl,duration,page_dir,name
21179416,https://ak.picdn.net/shutterstock/videos/21179416/preview/stock-footage-aerial-shot-winter-forest.mp4,PT00H00M11S,006001_006050,Aerial shot winter forest
5629184,https://ak.picdn.net/shutterstock/videos/5629184/preview/stock-footage-senior-couple-looking-through-binoculars-on-sailboat-together-shot-on-red-epic-for-high-quality-k.mp4,PT00H00M29S,071501_071550,"Senior couple looking through binoculars on sailboat together. shot on red epic for high quality 4k, uhd, ultra hd resolution."
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I &lt;a href="https://til.simonwillison.net/sqlite/import-csv"&gt;loaded it into SQLite&lt;/a&gt; and started digging around.&lt;/p&gt;
&lt;h4&gt;It's all from Shutterstock!&lt;/h4&gt;
&lt;p&gt;The big surprise for me when I started exploring the data was this: every single one of the 10,727,582 videos linked in the Datasette started with the same URL prefix:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://ak.picdn.net/shutterstock/videos/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;They're all from Shutterstock. The paper talks about "scraping the web", but it turns out there was only one scraped website involved.&lt;/p&gt;
&lt;p&gt;Here's that first row from the CSV file on Shutterstock itself:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.shutterstock.com/video/clip-21179416-aerial-shot-winter-forest"&gt;https://www.shutterstock.com/video/clip-21179416-aerial-shot-winter-forest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As far as I can tell, the training set used here isn't even full Shutterstock videos: it's the free, watermarked preview clips that Shutterstock makes available.&lt;/p&gt;
&lt;p&gt;I guess Shutterstock have really high quality captions for their videos, perfect for training a model on.&lt;/p&gt;
&lt;h4&gt;Implementation notes&lt;/h4&gt;
&lt;p&gt;My &lt;a href="https://github.com/simonw/webvid-datasette"&gt;simonw/webvid-datasette&lt;/a&gt; repository contains the code I used to build the Datasette instance.&lt;/p&gt;
&lt;p&gt;I built a SQLite database with full-text search enabled using &lt;a href="https://sqlite-utils.datasette.io/"&gt;sqlite-utils&lt;/a&gt;. I deployed it directly to Fly by building a Docker image that bundled the 2.5G SQLite database, taking advantage of the &lt;a href="https://simonwillison.net/2021/Jul/28/baked-data/"&gt;Baked Data architectural pattern&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The most interesting custom piece of implementation is the plugin I wrote to add a video player to each result. Here's the &lt;a href="https://github.com/simonw/webvid-datasette/blob/8b8b56b9a8fa4913520fe11c11f45920f6737a86/plugins/render_cell.py"&gt;implementation of that plugin&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;datasette&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;hookimpl&lt;/span&gt;
&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;markupsafe&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;Markup&lt;/span&gt;

&lt;span class="pl-v"&gt;TEMPLATE&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;"""&lt;/span&gt;
&lt;span class="pl-s"&gt;&amp;lt;video controls width="400" preload="none" poster="{poster}"&amp;gt;&lt;/span&gt;
&lt;span class="pl-s"&gt;  &amp;lt;source src="{url}" type="video/mp4"&amp;gt;&lt;/span&gt;
&lt;span class="pl-s"&gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;span class="pl-s"&gt;&amp;lt;p&amp;gt;{filename}&amp;lt;br&amp;gt;On &amp;lt;a href="https://www.shutterstock.com/video/clip-{id}"&amp;gt;Shutterstock&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="pl-s"&gt;"""&lt;/span&gt;.&lt;span class="pl-en"&gt;strip&lt;/span&gt;()
&lt;span class="pl-v"&gt;VIDEO_URL&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;"https://ak.picdn.net/shutterstock/videos/{id}/preview/{filename}"&lt;/span&gt;
&lt;span class="pl-v"&gt;POSTER_URL&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;"https://ak.picdn.net/shutterstock/videos/{id}/thumb/1.jpg?ip=x480"&lt;/span&gt;


&lt;span class="pl-en"&gt;@&lt;span class="pl-s1"&gt;hookimpl&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;render_cell&lt;/span&gt;(&lt;span class="pl-s1"&gt;row&lt;/span&gt;, &lt;span class="pl-s1"&gt;column&lt;/span&gt;, &lt;span class="pl-s1"&gt;value&lt;/span&gt;):
    &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-s1"&gt;column&lt;/span&gt; &lt;span class="pl-c1"&gt;!=&lt;/span&gt; &lt;span class="pl-s"&gt;"filename"&lt;/span&gt;:
        &lt;span class="pl-k"&gt;return&lt;/span&gt;
    &lt;span class="pl-s1"&gt;id&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;row&lt;/span&gt;[&lt;span class="pl-s"&gt;"id"&lt;/span&gt;]
    &lt;span class="pl-s1"&gt;url&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-v"&gt;VIDEO_URL&lt;/span&gt;.&lt;span class="pl-en"&gt;format&lt;/span&gt;(&lt;span class="pl-s1"&gt;id&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;id&lt;/span&gt;, &lt;span class="pl-s1"&gt;filename&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt;)
    &lt;span class="pl-s1"&gt;poster&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-v"&gt;POSTER_URL&lt;/span&gt;.&lt;span class="pl-en"&gt;format&lt;/span&gt;(&lt;span class="pl-s1"&gt;id&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;id&lt;/span&gt;)
    &lt;span class="pl-k"&gt;return&lt;/span&gt; &lt;span class="pl-v"&gt;Markup&lt;/span&gt;(&lt;span class="pl-v"&gt;TEMPLATE&lt;/span&gt;.&lt;span class="pl-en"&gt;format&lt;/span&gt;(&lt;span class="pl-s1"&gt;url&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;url&lt;/span&gt;, &lt;span class="pl-s1"&gt;poster&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;poster&lt;/span&gt;, &lt;span class="pl-s1"&gt;filename&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;value&lt;/span&gt;, &lt;span class="pl-s1"&gt;id&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;&lt;span class="pl-s1"&gt;id&lt;/span&gt;))&lt;/pre&gt;
&lt;p&gt;I'm using the new &lt;code&gt;render_cell(row)&lt;/code&gt; argument added &lt;a href="https://docs.datasette.io/en/stable/changelog.html#v0-62"&gt;in Datasette 0.62&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The plugin outputs a &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element with &lt;code&gt;preload="none"&lt;/code&gt; to avoid the browser downloading the video until the user clicks play (see &lt;a href="https://til.simonwillison.net/html/video-preload-none"&gt;this TIL&lt;/a&gt;). I set the &lt;code&gt;poster&lt;/code&gt; attribute to a thumbnail image from Shutterstock.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ethics"&gt;ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/facebook"&gt;facebook&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/machine-learning"&gt;machine-learning&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/datasette"&gt;datasette&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/training-data"&gt;training-data&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-video"&gt;text-to-video&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ethics"/><category term="facebook"/><category term="machine-learning"/><category term="projects"/><category term="ai"/><category term="datasette"/><category term="generative-ai"/><category term="training-data"/><category term="text-to-video"/><category term="ai-ethics"/></entry></feed>