<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kerisik | Recipe Manager]]></title><description><![CDATA[Kerisik | Recipe Manager]]></description><link>https://kerisik.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/60493dce258b6d5f4339f174/7a8d46ca-c620-445c-b859-537f11112219.png</url><title>Kerisik | Recipe Manager</title><link>https://kerisik.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 02:36:54 GMT</lastBuildDate><atom:link href="https://kerisik.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How we extract recipes from videos?]]></title><description><![CDATA[We’ve received a lot of questions about how we built this, so we decided to share it with you. The use case is quite strong and goes beyond just recipe extraction. If you find this article helpful, fe]]></description><link>https://kerisik.hashnode.dev/how-we-extract-recipes-from-videos</link><guid isPermaLink="true">https://kerisik.hashnode.dev/how-we-extract-recipes-from-videos</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[Hafizuddin Sharif Umar Sharif]]></dc:creator><pubDate>Fri, 27 Feb 2026 04:06:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/60493dce258b6d5f4339f174/d8b3bf97-5b09-4575-ab9f-2c063afd2dfb.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<img src="https://cdn.hashnode.com/uploads/covers/60493dce258b6d5f4339f174/2e79f43c-9a37-403c-926a-e39d117dfe69.png" alt="" style="display:block;margin:0 auto" />

<p>We’ve received a lot of questions about how we built this, so we decided to share it with you. The use case is quite strong and goes beyond just recipe extraction. If you find this article helpful, feel free to share it with your fellow developers!</p>
<h1>What you need first</h1>
<img src="https://cdn.hashnode.com/uploads/covers/60493dce258b6d5f4339f174/5fbd018a-b70c-4215-8263-5d24369a185b.png" alt="" style="display:block;margin:0 auto" />

<p>What makes our extraction work comes down to two main components:</p>
<ol>
<li><p><strong>Scraper</strong>: First, we need to get the data. By data, we mean raw content—whether it’s website content (e.g., HTML) or videos (from YouTube, TikTok, Instagram, etc.). You can either build your own scraper or use third-party services like <a href="https://apify.com">Apify</a>.</p>
</li>
<li><p><strong>LLM Model</strong>: Once you have the data, you’ll need an LLM to extract the recipe content, remove unnecessary parts, and output everything in a structured format (e.g., JSON).</p>
</li>
</ol>
<p>So first, decide whether you want to build these components yourself or use existing third-party providers. Once you have both in place, you’re ready to move to the next step.</p>
<h1>Building the extraction module</h1>
<h2>Level 1: Generic Website</h2>
<img src="https://cdn.hashnode.com/uploads/covers/60493dce258b6d5f4339f174/259851f8-8526-416d-b525-85b4f119bbb7.png" alt="" style="display:block;margin:0 auto" />

<ol>
<li><p>When a user inputs a URL from the client, it invokes a Supabase serverless function. This function sends the request to our server (FastAPI), which then fetches the data using our scraper (e.g., <a href="https://www.firecrawl.dev">Firecrawl</a>).</p>
</li>
<li><p>Once the scraper returns the result, we send the HTML content to our LLM model (e.g., Gemini).</p>
</li>
<li><p>After processing, the LLM returns the structured output. We parse it on our server and finally send it back to the client.</p>
</li>
</ol>
<h3>Some caveats:</h3>
<ol>
<li>Some websites block web scrapers.</li>
</ol>
<hr />
<h2>Level 2: Video (with audio)</h2>
<img src="https://cdn.hashnode.com/uploads/covers/60493dce258b6d5f4339f174/4a8892e4-62d6-48f7-b83d-176cfc558d92.png" alt="" style="display:block;margin:0 auto" />

<ol>
<li><p>This is more or less the same as Level 1, except we have additional steps.</p>
</li>
<li><p>When a user submits a URL, it goes through Supabase to our server. To fetch the video content (whether from TikTok or another platform), we use Apify as our scraper.</p>
</li>
<li><p>Apify usually returns a lot of data, but what matters most to us are the <code>audio_url</code> or <code>video_url</code>, and the post <code>description</code>.</p>
</li>
<li><p>On our server, we first download the audio from the <code>audio_url</code> (or extract audio from the <code>video_url</code>). We then send the audio to our LLM model for transcription.</p>
</li>
<li><p>Once we obtain the transcription, we combine it with the post <code>description</code> and send both to the LLM again—this time to extract the recipe.</p>
</li>
<li><p>After receiving the structured output (in JSON format), we process it on our server and send it back to the client.</p>
</li>
</ol>
<h3>Some caveat(s):</h3>
<ol>
<li><p>This only works for videos that contain verbal explanations of the steps and ingredients. If the video only has background music and no spoken content, nothing can be extracted.</p>
</li>
<li><p>Why don’t we just send the entire video to the LLM? Because transcribing video directly consumes a LOT of tokens—and honestly, that gets expensive. That’s why we extract and send only the audio instead.</p>
</li>
</ol>
<hr />
<h2>Level 3: Video (without audio?)</h2>
<p>At the moment, this is still in development. I'm trying to find the most efficient and cost-effective way to tackle this problem. Will update once we found a solution for this =)</p>
<hr />
<h1>Legal Considerations</h1>
<ol>
<li>This process can be sensitive since you are using someone else’s content. If you plan to sell or redistribute the extracted content, you may run into legal issues without the owner’s permission.</li>
</ol>
<hr />
<h1>Closing</h1>
<p>Now you should have a clearer idea of how to build your own video content extractor. Don’t limit this approach to recipe extraction—I can see many other potential use cases for this module.</p>
<p>Hope this article helps. Have fun building! 🚀</p>
]]></content:encoded></item></channel></rss>