<?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>Forem: Shah Pourazadi</title>
    <description>The latest articles on Forem by Shah Pourazadi (@shah_pourazadi_5da55a8db5).</description>
    <link>https://forem.com/shah_pourazadi_5da55a8db5</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3446190%2F4511c68c-eb8b-400a-81df-87f3b030ef87.png</url>
      <title>Forem: Shah Pourazadi</title>
      <link>https://forem.com/shah_pourazadi_5da55a8db5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shah_pourazadi_5da55a8db5"/>
    <language>en</language>
    <item>
      <title>IdeaBot — a YouTube-driven Viral Topic Generator.</title>
      <dc:creator>Shah Pourazadi</dc:creator>
      <pubDate>Mon, 01 Sep 2025 02:33:45 +0000</pubDate>
      <link>https://forem.com/shah_pourazadi_5da55a8db5/ideabot-a-youtube-driven-viral-topic-generator-14bn</link>
      <guid>https://forem.com/shah_pourazadi_5da55a8db5/ideabot-a-youtube-driven-viral-topic-generator-14bn</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/brightdata-n8n-2025-08-13"&gt;AI Agents Challenge powered by n8n and Bright Data&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;IdeaBot — a YouTube-driven Viral Topic Generator.&lt;br&gt;
Give it any topic (e.g., “AI &amp;amp; Automation”) and it will:&lt;/p&gt;

&lt;p&gt;1) Find trending YouTube results; &lt;br&gt;
2) pull transcripts and top comments; &lt;br&gt;
3) analyze patterns; &lt;br&gt;
4) generate suggested titles, short-form ideas, mini-scripts (3–5 lines), and social post drafts.&lt;/p&gt;

&lt;p&gt;Problem it solves: creators waste time guessing what will resonate. IdeaBot grounds ideation in what audiences are already engaging with (comments) and what’s working now (recent videos), then turns that signal into publish-ready prompts and snippets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Public Chat (n8n Chat Trigger): &lt;a href="https://flow.wemakeflow.com/webhook/ac48b635-40d1-4c83-aa5a-fbf2cb5ba546/chat" rel="noopener noreferrer"&gt;https://flow.wemakeflow.com/webhook/ac48b635-40d1-4c83-aa5a-fbf2cb5ba546/chat&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n Workflow
&lt;/h3&gt;

&lt;p&gt;Workflow JSON (Gist): &lt;a href="https://gist.github.com/azadishahab/677424d5a84f570ebbf2fb83544119b6" rel="noopener noreferrer"&gt;https://gist.github.com/azadishahab/677424d5a84f570ebbf2fb83544119b6&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Agent &amp;amp; Model Setup&lt;/strong&gt;&lt;br&gt;
Chat entrypoint: When chat message received.&lt;/p&gt;

&lt;p&gt;Models: Google Gemini Chat Model nodes power the agents.&lt;/p&gt;

&lt;p&gt;Google Gemini Chat Model1 → explicitly set to models/gemini-2.5-flash-lite (drives the URL-builder agent).&lt;/p&gt;

&lt;p&gt;Google Gemini Chat Model → default Gemini chat model (drives parsing/summarization/repurposing agents).&lt;/p&gt;

&lt;p&gt;Agents (system instructions):&lt;/p&gt;

&lt;p&gt;AI Agent1 – SERP URL Builder. Generates a Google video search URL:&lt;br&gt;
&lt;a href="https://www.google.com/search?q=" rel="noopener noreferrer"&gt;https://www.google.com/search?q=&lt;/a&gt;&amp;amp;tbm=vid&amp;amp;gl=&lt;br&gt;
–  comes from the user prompt;  is 2-letter country (defaults to us if not specified).&lt;br&gt;
– Output contract: URL only (no extra text).&lt;/p&gt;

&lt;p&gt;AI Agent2 – SERP Result Parser. Input: raw SERP payload. Task: extract YouTube video URLs and return them as an array.&lt;/p&gt;

&lt;p&gt;AI Agent – Transcript Summarizer. Input: video metadata/transcripts. Task: summarize each transcript into key notes for downstream repurposing.&lt;/p&gt;

&lt;p&gt;AI Agent3 – Content Repurposer. Input: transcript summaries + high-signal comments. Task: generate new, original ideas (publish-ready JSON in the final responders).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bright Data usage (nodes &amp;amp; flow)&lt;/strong&gt;&lt;br&gt;
Search (SERP):&lt;/p&gt;

&lt;p&gt;Node: Access and extract data from a specific URL (Bright Data Verified).&lt;/p&gt;

&lt;p&gt;serp_api1, country: us (default), url: {{$json.output}} (the URL built by AI Agent1).&lt;/p&gt;

&lt;p&gt;Responds via Respond to Chat (“Done searching Google…”) to keep the chat user informed.&lt;/p&gt;

&lt;p&gt;Video transcripts &amp;amp; metadata (YouTube – Video Posts dataset):&lt;/p&gt;

&lt;p&gt;Node: Extract structured data from a single URL2 → dataset “Youtube - Videos posts” (dataset_id: e.g., gd_lk56epmy2i5g7lzu0k).&lt;/p&gt;

&lt;p&gt;Input URLs: {{ $('Respond to Chat1').item.json.output.toJsonString() }} (the array of video URLs extracted earlier).&lt;/p&gt;

&lt;p&gt;Sort by views (desc) then likes (desc) → Limit to 2 top videos.&lt;/p&gt;

&lt;p&gt;Code node wraps those into { output: [{ url: ... }] } for consistent downstream shape.&lt;/p&gt;

&lt;p&gt;YouTube comments (Comment Collector dataset) with polling:&lt;/p&gt;

&lt;p&gt;Node: Extract structured data from a single URL1 → dataset “Youtube - Comments” (dataset_id: e.g., gd_lk9q0ew71spt1mxywf).&lt;/p&gt;

&lt;p&gt;Snapshot polling loop: Edit Fields1 (capture snapshot_id) → Download the snapshot content → If status == "running" → Wait 6s → loop back to Download until done.&lt;/p&gt;

&lt;p&gt;Filter1: keep only comments with likes &amp;gt; 60 (noise reduction).&lt;/p&gt;

&lt;p&gt;Aggregate: consolidate high-signal comment_text for analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data shaping &amp;amp; analysis pipeline&lt;/strong&gt;&lt;br&gt;
SERP URL Builder (AI Agent1) → Bright Data SERP fetch → AI Agent2 extracts an array of YouTube URLs → Respond to Chat1 acknowledges URL collection.&lt;/p&gt;

&lt;p&gt;Video Posts dataset (transcripts/metadata) → Sort → Limit (2) → Code packaging → Respond to Chat3 (status update) → Comments dataset (with polling) → Filter1 (likes&amp;gt;60) → Aggregate (comment texts).&lt;/p&gt;

&lt;p&gt;Summarization branch: the Limit node also feeds AI Agent (Summarizer) to create concise transcript summaries.&lt;/p&gt;

&lt;p&gt;Merge:&lt;/p&gt;

&lt;p&gt;Aggregate1 collects summarizer outputs;&lt;/p&gt;

&lt;p&gt;Aggregate (comments) merges via Merge → Aggregate2 (aggregateAllItemData) to a single payload.&lt;/p&gt;

&lt;p&gt;Content generation: AI Agent3 (Repurposer) transforms summaries + comments into the final JSON ideas package.&lt;/p&gt;

&lt;p&gt;Final reply: Respond to Chat2 returns the JSON object to the user.&lt;/p&gt;

&lt;p&gt;Prompting &amp;amp; contracts (highlights from node configs)&lt;/p&gt;

&lt;p&gt;URL Builder (Agent1): strict instruction to output only the correctly-formed SERP URL with tbm=vid and default gl=us.&lt;/p&gt;

&lt;p&gt;Parser (Agent2): extract YouTube URLs array from SERP results (no prose).&lt;/p&gt;

&lt;p&gt;Summarizer: “Summarize the video transcription, keep all important notes … used for content repurpose.”&lt;/p&gt;

&lt;p&gt;Repurposer (Agent3): “You are the Content Repurposer Agent… generate fresh, original content ideas based on video summaries + top comments.”&lt;/p&gt;

&lt;p&gt;Final schema: returned by Respond to Chat as a JSON payload (titles, short-form ideas, mini-scripts, post drafts).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory / conversation behavior&lt;/strong&gt;&lt;br&gt;
Workflow uses Chat Trigger (public) with responseNodes mode and several Respond to Chat status messages.&lt;/p&gt;

&lt;p&gt;There is no dedicated memory node in this export; each run is effectively stateless (refinements re-enter the flow). You can add an n8n Chat Memory Manager / Window Buffer Memory later if you want multi-turn refinement without re-scraping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notable safeguards &amp;amp; heuristics&lt;/strong&gt;&lt;br&gt;
Comment quality gate: likes &amp;gt; 60 to boost signal.&lt;/p&gt;

&lt;p&gt;Top-video cap: Limit 2 (fast, token-efficient).&lt;/p&gt;

&lt;p&gt;Polling loop: waits for Bright Data comment snapshots to complete before analysis.&lt;/p&gt;

&lt;p&gt;Code shaping: wraps arrays into { output: [...] } so downstream Bright Data nodes accept uniform input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bright Data Verified Node
&lt;/h3&gt;

&lt;p&gt;How it’s used end-to-end:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SERP (video) fetch&lt;/strong&gt;&lt;br&gt;
Node: Access and extract data from a specific URL&lt;/p&gt;

&lt;p&gt;serp_api1; gl defaults to us; URL pattern &lt;a href="https://www.google.com/search?q=" rel="noopener noreferrer"&gt;https://www.google.com/search?q=&lt;/a&gt;&amp;amp;tbm=vid&amp;amp;gl= generated upstream.&lt;/p&gt;

&lt;p&gt;Output is handed to AI Agent to extract YouTube links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video Post (transcripts &amp;amp; metadata)&lt;/strong&gt;&lt;br&gt;
Node: Extract structured data from a single URL&lt;/p&gt;

&lt;p&gt;Dataset: e.g., gd_lk56epmy2i5g7lzu0k (“Youtube - Videos posts”)&lt;/p&gt;

&lt;p&gt;Flow: Sort (views, likes) → Limit top 2..5 → Code to produce {output:[{url:...}]} for downstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment Collector&lt;/strong&gt;&lt;br&gt;
Node: Extract structured data from a single URL&lt;/p&gt;

&lt;p&gt;Dataset: e.g., gd_lk9q0ew71spt1mxywf (“Youtube - Comments”)&lt;/p&gt;

&lt;p&gt;Snapshot poll: Edit Fields → Wait → Download snapshot content → If (status=="running") loop back → else continue.&lt;/p&gt;

&lt;p&gt;Quality: Filter (e.g., likes &amp;gt; 60) → Aggregate to merge comment text for analysis.&lt;/p&gt;

&lt;p&gt;This pairing (SERP → Video Post → Comment Collector) yields fresh, structured inputs resilient to blocking, enabling reliable analysis and ideation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Process:&lt;/strong&gt;&lt;br&gt;
Started from a clear target: ideas tied to real audience demand.&lt;/p&gt;

&lt;p&gt;Built a prompt→URL Builder so users can stay free-form while the system enforces SERP correctness (tbm=vid, gl default).&lt;/p&gt;

&lt;p&gt;Split data collection into videos (transcripts) and comments, then layered agents: summarize, pattern-find, repurpose, respond.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges &amp;amp; Solutions:&lt;/strong&gt;&lt;br&gt;
SERP parsing reliability: Solved by chaining a Bright Data SERP fetch with an LLM Structured Output Parser to normalize video URLs.&lt;/p&gt;

&lt;p&gt;Snapshot polling for comments: Implemented a Wait + If loop to poll until snapshot completion, then filtered by likes for signal.&lt;/p&gt;

&lt;p&gt;Token/length limits: Summarizer truncates transcripts; comments are filtered before aggregation.&lt;/p&gt;

&lt;p&gt;Keeping outputs actionable: A dedicated Repurposer prompt that forces new ideas to be inspired by (not copied from) summaries + comments, then formats to a strict JSON schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;br&gt;
Enforcing tool contracts (I/O shapes per agent) makes multi-agent flows robust.&lt;/p&gt;

&lt;p&gt;Bright Data’s datasets + polling patterns are a clean fit for n8n; pairing them with lightweight LLM parsing yields dependable, real-time pipelines.&lt;/p&gt;

&lt;p&gt;A small amount of structure (sorting by views/likes, comment like-thresholds) dramatically improves idea quality and virality potential.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>n8nbrightdatachallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
