<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdullah Baig</title>
    <description>The latest articles on DEV Community by Abdullah Baig (@abdullah_baig_23110610acf).</description>
    <link>https://dev.to/abdullah_baig_23110610acf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1889299%2F3fda1297-20bb-4fbd-b5d8-249289e042ab.jpg</url>
      <title>DEV Community: Abdullah Baig</title>
      <link>https://dev.to/abdullah_baig_23110610acf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdullah_baig_23110610acf"/>
    <language>en</language>
    <item>
      <title>The Remote Control Wasn’t Fast Enough</title>
      <dc:creator>Abdullah Baig</dc:creator>
      <pubDate>Wed, 09 Sep 2026 17:00:00 +0000</pubDate>
      <link>https://dev.to/abdullah_baig_23110610acf/the-remote-control-wasnt-fast-enough-5996</link>
      <guid>https://dev.to/abdullah_baig_23110610acf/the-remote-control-wasnt-fast-enough-5996</guid>
      <description>&lt;p&gt;You sit down for a family movie. The popcorn is ready. Two characters start looking at each other with suspiciously good lighting.&lt;/p&gt;

&lt;p&gt;Suddenly, you’re reaching for the remote like you’re defusing a bomb.&lt;/p&gt;

&lt;p&gt;Naturally, the engineering response is to build an application that removes kissing, sex, and intimate scenes. Your children can continue believing babies arrive through a logistics provider with excellent last-mile delivery.&lt;/p&gt;

&lt;p&gt;The interesting part is that we can search a video using an ordinary description, like &lt;strong&gt;“two people kissing,”&lt;/strong&gt; without training a dedicated kissing detector.&lt;/p&gt;

&lt;p&gt;That’s called &lt;em&gt;open-vocabulary search&lt;/em&gt;. Your search terms don’t have to come from a fixed menu of labels.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Give the movie something searchable
&lt;/h2&gt;

&lt;p&gt;We’ll use &lt;strong&gt;&lt;code&gt;jinaai/jina-embeddings-v5-omni-nano&lt;/code&gt;&lt;/strong&gt;, the multimodal member of Jina’s v5 family. It represents text and video in a shared vector space, letting us compare a written description with a clip. Use the Omni model here; the text-only version cannot watch your movie. &lt;a href="https://huggingface.co/jinaai/jina-embeddings-v5-omni-nano" rel="noopener noreferrer"&gt;Jina’s model card&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow is small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Divide the timeline into short windows.&lt;/li&gt;
&lt;li&gt;Embed sampled frames from each window.&lt;/li&gt;
&lt;li&gt;Compare them with descriptions of the scenes we want to find.&lt;/li&gt;
&lt;li&gt;Review matching timestamps.&lt;/li&gt;
&lt;li&gt;Export a copy with selected intervals removed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are time windows, not detected cinematic scenes. We’ll start with two seconds per window and four sampled frames per second. Brief events can still slip between samples, so this is a prototype, not a parental guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install the pieces
&lt;/h2&gt;

&lt;p&gt;Start with a short local MP4 before processing an entire film.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"torch&amp;gt;=2.5"&lt;/span&gt; &lt;span class="s2"&gt;"transformers&amp;gt;=5,&amp;lt;6"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  sentence-transformers pillow numpy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"moviepy&amp;gt;=2,&amp;lt;3"&lt;/span&gt; imageio-ffmpeg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A CUDA GPU is useful for testing. If you don’t have one, you can use a &lt;a href="https://docs.runpod.io/pods/overview" rel="noopener noreferrer"&gt;Runpod GPU Pod with its PyTorch template&lt;/a&gt;. This post hasn’t been sponsored by them. Apparently, protecting fictional children from fictional romance does not qualify for a marketing budget.&lt;/p&gt;

&lt;p&gt;The model requires &lt;code&gt;trust_remote_code=True&lt;/code&gt;, which runs code from its repository. Review that code and pin a reviewed revision when turning this into a maintained application.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Find the suspicious affection
&lt;/h2&gt;

&lt;p&gt;We’ll search with several descriptions. A kissing query alone may miss a sex scene without kissing, while a broad query about intimacy might enthusiastically flag an innocent hug.&lt;/p&gt;

&lt;p&gt;Save this as &lt;code&gt;find_scenes.py&lt;/code&gt;, alongside &lt;code&gt;movie.mp4&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;moviepy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VideoFileClip&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentence_transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SentenceTransformer&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SentenceTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;jinaai/jina-embeddings-v5-omni-nano&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;trust_remote_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cuda&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default_task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retrieval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;modality&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;descriptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Two people kissing on the lips&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A sex scene between adults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adults undressing each other romantically&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adults touching and embracing intimately in bed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;descriptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;normalize_embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;convert_to_numpy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;VideoFileClip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;movie.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;preview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resized&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;astype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;normalize_embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;convert_to_numpy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;
        &lt;span class="n"&gt;best&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;best&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;match&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;descriptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;best&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;remove&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Preserve chronological embeddings for future searches.
&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;embeddings.npy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windows.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jina documents both in-memory video frames and separate &lt;code&gt;encode_query()&lt;/code&gt; / &lt;code&gt;encode_document()&lt;/code&gt; methods for retrieval. Normalizing the vectors makes their dot product a cosine similarity score. &lt;a href="https://huggingface.co/jinaai/jina-embeddings-v5-omni-nano#via-sentence-transformers" rel="noopener noreferrer"&gt;Input formats and retrieval usage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python find_scenes.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;review.csv&lt;/code&gt;. Each row includes its strongest matching description. Watch the highest-ranked intervals, change &lt;code&gt;remove&lt;/code&gt; to &lt;code&gt;yes&lt;/code&gt; for the ones you want cut, and adjust their start and end times as needed. Timestamps are in seconds.&lt;/p&gt;

&lt;p&gt;A similarity score is &lt;strong&gt;not a probability that a scene contains kissing or sex&lt;/strong&gt;. Close conversation might rank highly. An actual intimate scene might rank lower. There’s no universal threshold where responsible parenting begins.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;match&lt;/code&gt; column is also just the closest search description, not a confirmed label. Every window gets a match, including the establishing shot of a completely innocent mountain.&lt;/p&gt;

&lt;p&gt;You can reuse the saved embeddings for different descriptions without processing the movie again.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Perform the extremely modest director’s cut
&lt;/h2&gt;

&lt;p&gt;Save this as &lt;code&gt;cut_scenes.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;moviepy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VideoFileClip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;concatenate_videoclips&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cuts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;remove&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;VideoFileClip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;movie.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cuts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isfinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isfinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;
        &lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid interval: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;merged&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subclipped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subclipped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Every frame was selected. Bold edit.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;concatenate_videoclips&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_videofile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;movie_edited.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;codec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;libx264&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;audio_codec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python cut_scenes.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This merges overlapping cuts and joins the remaining video &lt;strong&gt;with its corresponding audio&lt;/strong&gt;. MoviePy re-encodes the result; the source file stays intact. This minimal export uses the loaded video and audio, and does not preserve every subtitle or alternate audio track. &lt;a href="https://zulko.github.io/moviepy/user_guide/compositing.html" rel="noopener noreferrer"&gt;MoviePy’s editing documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model calls follow Jina’s documented interface; detection accuracy has not been tested here on a movie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intimacy is annoyingly contextual
&lt;/h2&gt;

&lt;p&gt;A kiss, a hug, and a sex scene are different things. Even “intimate” can describe anything from a quiet conversation to a scene that sends you searching for the remote under three cushions.&lt;/p&gt;

&lt;p&gt;Use descriptions that match what you actually want removed. Review a few seconds before and after each result, then extend the cut to cover the full moment. Otherwise, you might remove the kiss while leaving the entire buildup and a rather confusing aftermath.&lt;/p&gt;

&lt;p&gt;There’s another limitation: Jina’s video input reads frames, &lt;strong&gt;not the soundtrack automatically&lt;/strong&gt;. Suggestive dialogue or off-screen sexual activity may require separate audio analysis or timestamped transcription. The example here searches visible content. &lt;a href="https://huggingface.co/jinaai/jina-embeddings-v5-omni-nano#accepted-video-inputs" rel="noopener noreferrer"&gt;Jina’s video-input documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For better coverage, try overlapping windows and denser frame sampling, then measure what the system misses on clips you have reviewed yourself. More sampling costs more processing. It also remains cheaper than discovering your filter’s limitations during family movie night.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the family library becomes infrastructure
&lt;/h2&gt;

&lt;p&gt;For one movie, a NumPy array is enough. For many videos, I’d store vectors with &lt;code&gt;video_id&lt;/code&gt;, start time, end time, and model version in &lt;a href="https://qdrant.tech/documentation/manage-data/points/" rel="noopener noreferrer"&gt;Qdrant&lt;/a&gt; or &lt;a href="https://www.elastic.co/docs/solutions/search/vector/dense-vector" rel="noopener noreferrer"&gt;Elasticsearch&lt;/a&gt;. That gives us indexed similarity search and metadata filtering across the collection.&lt;/p&gt;

&lt;p&gt;Before making this a commercial application, note that the model’s published license is &lt;strong&gt;CC BY-NC 4.0&lt;/strong&gt;; Jina directs commercial users to contact them. &lt;a href="https://huggingface.co/jinaai/jina-embeddings-v5-omni-nano#license" rel="noopener noreferrer"&gt;Model license&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful capability is simple: describe a moment, retrieve likely matches, and turn timestamps into edits. Your search vocabulary can change without training another detector. Deciding what belongs in the final cut is still your job.&lt;/p&gt;

&lt;p&gt;Would you like me to cover the version that handles many videos with Qdrant or Elasticsearch? Say so in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>OpenAI Says It Cracked Navier-Stokes. It Took Roughly 10,000 AI Agents.</title>
      <dc:creator>Abdullah Baig</dc:creator>
      <pubDate>Wed, 09 Sep 2026 14:16:55 +0000</pubDate>
      <link>https://dev.to/abdullah_baig_23110610acf/openai-says-it-cracked-navier-stokes-it-took-roughly-10000-ai-agents-1h46</link>
      <guid>https://dev.to/abdullah_baig_23110610acf/openai-says-it-cracked-navier-stokes-it-took-roughly-10000-ai-agents-1h46</guid>
      <description>&lt;p&gt;OpenAI has announced a proposed solution to the &lt;strong&gt;Navier-Stokes existence and smoothness problem&lt;/strong&gt;, one of the seven Millennium Prize Problems.&lt;/p&gt;

&lt;p&gt;As a mechanical engineer, that is a strange sentence to read. These equations are fundamental to how we understand fluid motion. Now an AI lab says its system has resolved a question about them that has remained open for roughly 90 years.&lt;/p&gt;

&lt;p&gt;The announcement was published on &lt;strong&gt;September 8&lt;/strong&gt;. OpenAI released a mathematical writeup and a formalization in Lean, although the claim still needs independent scrutiny. &lt;a href="https://openai.com/index/navier-stokes-solution/" rel="noopener noreferrer"&gt;Read the announcement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does “solving Navier-Stokes” mean?
&lt;/h2&gt;

&lt;p&gt;The equations describe how fluids move. Engineers already use them to study airflow, water flow, and other physical systems.&lt;/p&gt;

&lt;p&gt;The Millennium Problem asks a more fundamental question: &lt;strong&gt;under the specified conditions, do smooth three-dimensional fluid flows remain smooth, or can they break down?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenAI claims an initially smooth fluid at rest can develop a singularity under a smooth external force. In its construction, velocity grows without bound in finite time, while the fluid’s energy remains finite. The claim concerns the mathematical model, not real water suddenly moving infinitely fast. &lt;a href="https://openai.com/index/navier-stokes-solution/#the-result" rel="noopener noreferrer"&gt;OpenAI’s description of the result&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The external force does not automatically disqualify the result. Clay’s official formulation explicitly includes breakdown cases with smooth forcing. OpenAI says its proof establishes alternatives &lt;strong&gt;C and D&lt;/strong&gt;. &lt;a href="https://www.claymath.org/wp-content/uploads/2022/06/navierstokes.pdf" rel="noopener noreferrer"&gt;Clay’s official problem statement&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How the agents approached it
&lt;/h2&gt;

&lt;p&gt;OpenAI used an unreleased internal model that it describes as significantly more capable than GPT-6 Astra.&lt;/p&gt;

&lt;p&gt;The effort initially covered several mathematical problems. After agents produced an earlier result on the &lt;strong&gt;unforced Euler equations&lt;/strong&gt;, researchers concentrated resources on Navier-Stokes and shared intermediate findings between groups.&lt;/p&gt;

&lt;p&gt;Euler equations remove viscosity. “Unforced” means no external force is applied. Those are separate distinctions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part of the effort&lt;/th&gt;
&lt;th&gt;OpenAI’s reported figure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent agents in the successful group&lt;/td&gt;
&lt;td&gt;Roughly &lt;strong&gt;10,000&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time from the first agents launching to resolution&lt;/td&gt;
&lt;td&gt;About &lt;strong&gt;88 hours&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional Lean formalization and verification using GPT-6 Astra&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17 hours&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens used for the Navier-Stokes effort&lt;/td&gt;
&lt;td&gt;Approximately &lt;strong&gt;130 billion&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These figures describe a coordinated research effort with human steering and substantial compute. &lt;a href="https://openai.com/index/navier-stokes-solution/#how-we-found-the-proof" rel="noopener noreferrer"&gt;How OpenAI says it found the proof&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Lean verification establishes
&lt;/h2&gt;

&lt;p&gt;Lean is a programming language and theorem prover. Its checking system can verify that a formal proof follows from the definitions and assumptions it uses.&lt;/p&gt;

&lt;p&gt;That matters because the output includes something others can check beyond a written explanation. OpenAI has published the &lt;a href="https://github.com/openai/NavierStokesAndEuler" rel="noopener noreferrer"&gt;formalization on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, a checked proof still needs to express the intended mathematical problem correctly. Its assumptions and dependencies also require examination. Formal verification and independent mathematical review address different parts of establishing a result. &lt;a href="https://lean-lang.org/doc/reference/latest/ValidatingProofs/" rel="noopener noreferrer"&gt;Lean’s verification guide&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What remains unsettled?
&lt;/h2&gt;

&lt;p&gt;The announcement should still be described as a &lt;strong&gt;claimed resolution&lt;/strong&gt;, rather than an independently accepted result.&lt;/p&gt;

&lt;p&gt;There are also questions about credit and provenance. OpenAI discusses concurrent work by Levent Alpöge and Tristan Buckmaster, acknowledges their priority on forced Euler, and says it cannot rule out a contribution to model improvement from de-identified product usage. The correctness of a proof would not, by itself, settle those questions. &lt;a href="https://openai.com/index/navier-stokes-solution/#concurrent-work" rel="noopener noreferrer"&gt;OpenAI’s account&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenAI also says it does &lt;strong&gt;not intend to claim the Millennium Prize&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is worth watching
&lt;/h2&gt;

&lt;p&gt;If the result holds, its significance extends beyond fluid mechanics. It would be evidence that a coordinated AI system can contribute to resolving a major open problem and produce a formal artifact for others to examine.&lt;/p&gt;

&lt;p&gt;For developers, the interesting combination is sustained exploration, shared intermediate results, and a separate checking process. How much of that can become practical at smaller budgets remains an open question.&lt;/p&gt;

&lt;p&gt;For now, there is a substantial mathematical claim on the table, a published proof to investigate, and a research process worth understanding. That is already plenty to take in.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mathematics</category>
      <category>openai</category>
      <category>science</category>
    </item>
    <item>
      <title>The ideas we never got around to testing</title>
      <dc:creator>Abdullah Baig</dc:creator>
      <pubDate>Wed, 09 Sep 2026 13:09:56 +0000</pubDate>
      <link>https://dev.to/abdullah_baig_23110610acf/the-ideas-we-never-got-around-to-testing-3aek</link>
      <guid>https://dev.to/abdullah_baig_23110610acf/the-ideas-we-never-got-around-to-testing-3aek</guid>
      <description>&lt;p&gt;Every engineering team has ideas that quietly become assumptions because nobody has time to test them. A different retrieval strategy might improve accuracy. A smaller model might be sufficient. An architectural decision made six months ago might no longer make sense. Eventually, “we haven’t checked” hardens into “this is how it works.”&lt;/p&gt;

&lt;p&gt;AI’s growing ability to carry out research could make those assumptions cheaper to question.&lt;/p&gt;

&lt;p&gt;On September 6, OpenAI reported reaching its internal milestone of an automated research intern: a system capable of performing well-defined research tasks under human direction, including work that would take a skilled researcher several days. This is the company’s own assessment, rather than independent proof of general research ability. But it identifies a consequential capability: delegating an investigation whose answer you do not already know. &lt;a href="https://openai.com/index/research-acceleration-view-inside-openai/" rel="noopener noreferrer"&gt;OpenAI’s research report&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The practical opening is a smaller commitment between having a hypothesis and obtaining evidence.&lt;/p&gt;

&lt;p&gt;Consider a founder wondering whether an expensive model is necessary for their product. A useful investigation would assemble representative examples, compare alternatives, inspect failures, and establish where the cheaper option breaks down. Each step is familiar engineering work. Together, they can be substantial enough to keep the question on the backlog.&lt;/p&gt;

&lt;p&gt;An agent that can carry much of that investigation makes a previously uneconomical question worth asking. The novelty is in how much exploratory work can now be delegated before the human has resolved the uncertainty.&lt;/p&gt;

&lt;p&gt;There are limits. OpenAI reports that more than half of successful tasks estimated at four to eight human hours involved at least one intervention. It also cautions that increased experimentation coincided with increased compute, so the results do not isolate the contribution of agents. &lt;a href="https://openai.com/index/research-acceleration-view-inside-openai/" rel="noopener noreferrer"&gt;Methods and findings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even within those limits, the implication for builders is substantial. A small team may be able to examine more alternatives before committing to one. Engineers could revisit decisions whose original justification was simply that there was no time to investigate further.&lt;/p&gt;

&lt;p&gt;But cheaper experimentation places more responsibility on the question itself. An agent can compare models against a benchmark that misses the customer’s actual problem. It can execute a rigorous experiment around an assumption nobody thought to challenge. More evidence only helps when it bears on the decision being made.&lt;/p&gt;

&lt;p&gt;That makes this development slightly uncomfortable. Limited capacity has always supplied a reasonable explanation for leaving things unexamined. As that constraint loosens, we may discover how often we were protecting a familiar answer.&lt;/p&gt;

&lt;p&gt;The first useful application of an automated researcher may be an experiment we have been postponing because we suspect it could change our minds.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>software</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
