<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>YouTubeAPI on To the Moon</title><link>https://junstellar.github.io/tags/youtubeapi/</link><description>Recent content in YouTubeAPI on To the Moon</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Sun, 12 Jul 2026 10:30:00 +0900</lastBuildDate><atom:link href="https://junstellar.github.io/tags/youtubeapi/index.xml" rel="self" type="application/rss+xml"/><item><title>유튜브 AI 트렌드를 매일 밤 자동으로 받아보기 — YouTube API + Gemini + 클로드 3단 폴백</title><link>https://junstellar.github.io/p/youtube-ai-trend-report-automation/</link><pubDate>Sun, 12 Jul 2026 10:30:00 +0900</pubDate><guid>https://junstellar.github.io/p/youtube-ai-trend-report-automation/</guid><description>&lt;p&gt;AI 소식은 유튜브에 제일 먼저 올라오는데, 매번 손으로 검색해서 훑는 건 시간 낭비다. 그래서 만들었다 — &lt;strong&gt;매일 밤 11시에 자동으로 돌아서, 아침에 일어나면 어제 하루치 AI 트렌드 리포트가 마크다운으로 놓여 있는&lt;/strong&gt; 파이프라인. 파이썬으로 직접 구축하면서 배운 것들을 정리한다.&lt;/p&gt;
&lt;h2 id="전체-그림"&gt;전체 그림
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;매일 밤 11시 (Windows 작업 스케줄러)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YouTube Data API → 최근 24시간 Claude·ChatGPT·Gemini 영상 검색
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;필터링 (AI 모델 이름 없는 영상 제거 + 차단 키워드)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;조회수 상위 N개 분석 — 3단 폴백
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ① Gemini가 영상 URL을 직접 시청 (기본)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ② 토큰 소진 시 → claude -p (자막+메타데이터 분석)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ③ 그래도 안 되면 → Gemini 텍스트 분석
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;로컬 마크다운 리포트 저장 (reports/trend-날짜.md)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;역할 분담이 핵심이다. &lt;strong&gt;&amp;ldquo;검색·발견&amp;quot;은 YouTube API가, &amp;ldquo;내용 분석&amp;quot;은 AI가&lt;/strong&gt; 맡는다. 검색 키워드는 3대 모델(Claude/ChatGPT/Gemini)을 뉴스·새 기능·활용법 앵글로 조합한 9개다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;KEYWORDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ChatGPT 업데이트&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Claude 업데이트&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gemini 새 기능&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;OpenAI 발표&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ChatGPT new feature&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Claude AI update&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gemini update&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ChatGPT 활용법&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Claude Code&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="가장-중요한-깨달음-gemini는-유튜브-url을-직접-먹는다"&gt;가장 중요한 깨달음: Gemini는 유튜브 URL을 직접 먹는다
&lt;/h2&gt;&lt;p&gt;처음엔 &amp;ldquo;영상 자막(CC)을 다운로드해서 분석해야 하나?&amp;ldquo;라고 생각했다. 그런데 여기 함정이 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YouTube 공식 API의 자막 다운로드는 &amp;ldquo;내 채널 영상&amp;quot;만 된다.&lt;/strong&gt; 남의 영상 자막은 공식 API로 못 가져온다.&lt;/li&gt;
&lt;li&gt;그래서 보통 &lt;code&gt;youtube-transcript-api&lt;/code&gt; 같은 비공식 라이브러리를 쓰는데, 유튜브가 막으면 깨진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;그런데 Gemini API는 유튜브 URL 자체를 영상으로 그냥 받는다.&lt;/strong&gt; 자막을 내려받을 필요가 없다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gemini-2.5-flash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FileData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.youtube.com/watch?v=...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;이 영상 핵심 3줄 요약 + 다룬 AI 키워드 뽑아줘&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;이 한 방으로 &amp;ldquo;자막 다운로드&amp;rdquo; 단계가 통째로 사라졌다. 구조가 훨씬 단순해졌다.&lt;/p&gt;
&lt;h2 id="검색-노이즈-잡기-조회수순보다-관련도순"&gt;검색 노이즈 잡기: 조회수순보다 관련도순
&lt;/h2&gt;&lt;p&gt;처음엔 &lt;code&gt;order=viewCount&lt;/code&gt;(조회수순)로 검색했더니, &amp;ldquo;Gemini&amp;quot;라는 단어에 &lt;strong&gt;인도 텔루구 TV 채널 &amp;ldquo;Sun Gemini&amp;rdquo;&lt;/strong&gt;, 아랍어 음식 챌린지 같은 게 조회수 높다고 딸려왔다.&lt;/p&gt;
&lt;p&gt;해결책 두 가지:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;order=relevance&lt;/code&gt;(관련도순)로 검색&lt;/strong&gt; → 대형 비(非)AI 채널이 밀려남. 그런 다음 그 결과들 안에서 조회수로 다시 정렬.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;필터 두 겹 추가&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;차단 키워드(BLOCK): 제목/설명에 &lt;code&gt;Promo&lt;/code&gt;, &lt;code&gt;Serial&lt;/code&gt;, &lt;code&gt;NASA&lt;/code&gt; 등이 있으면 버림&lt;/li&gt;
&lt;li&gt;필수 키워드(REQUIRE): 제목/설명에 &lt;code&gt;claude / chatgpt / gpt / gemini / 클로드 / 제미나이&lt;/code&gt; 중 하나도 없으면 버림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1) 차단어 있으면 스킵&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;BLOCK_WORDS&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2) AI 모델 이름 하나도 없으면 스킵&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;haystack&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;REQUIRE_ANY&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;특히 두 번째 필터가 강력했다. 기간을 24시간으로 좁히니 AI 영상이 적어서 &amp;ldquo;NASA Moon Base Update&amp;rdquo; 같은 게 조회수로 올라왔는데, &amp;ldquo;AI 모델 이름 없으면 제거&amp;rdquo; 필터 한 방에 정치·일반뉴스 노이즈가 싹 사라졌다.&lt;/p&gt;
&lt;h2 id="무료-티어의-벽-그리고-3단-폴백"&gt;무료 티어의 벽, 그리고 3단 폴백
&lt;/h2&gt;&lt;p&gt;Gemini 무료 티어는 &lt;strong&gt;분당 입력 25만 토큰&lt;/strong&gt; 제한이 있다. 그런데 영상은 텍스트와 달리 토큰을 엄청 먹는다(초당 약 100~300토큰). 영상 2개만 분석해도 &lt;code&gt;429 RESOURCE_EXHAUSTED&lt;/code&gt;가 터졌다.&lt;/p&gt;
&lt;p&gt;기본 대응은 이렇다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;저해상도 처리&lt;/strong&gt;로 토큰 절약: &lt;code&gt;media_resolution=&amp;quot;MEDIA_RESOLUTION_LOW&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;영상 사이 20초 대기&lt;/strong&gt;로 분당 한도 회피&lt;/li&gt;
&lt;li&gt;503 같은 일시 오류는 잠시 쉬고 재시도&lt;/li&gt;
&lt;li&gt;분석 개수(&lt;code&gt;TOP_N&lt;/code&gt;)를 무리하게 키우지 않기 (6~8개가 안전)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그래도 토큰이 소진되는 날이 있다. 그래서 &lt;strong&gt;분석 엔진을 3단 폴백으로&lt;/strong&gt; 만들었다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gemini 영상 시청&lt;/strong&gt; — 기본. 영상을 직접 보니 가장 깊다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;claude -p&lt;/code&gt; (헤드리스 클로드)&lt;/strong&gt; — Gemini 토큰이 떨어지면, 로컬에 설치된 Claude Code CLI를 파이프라인이 직접 호출한다. 영상 대신 제목·설명·자막(최대 8,000자)을 표준입력으로 넘겨 같은 형식으로 분석시킨다. CLI에 로그인만 되어 있으면 별도 API 키 없이 작동.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini 텍스트 분석&lt;/strong&gt; — 클로드마저 안 되면 같은 텍스트 뭉치를 Gemini에 넘긴다. 텍스트라 토큰을 거의 안 쓴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ① Gemini 영상 시청 → 429면 즉시 폴백&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quota_hit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gemini_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;quota_hit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;build_text_context&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="c1"&gt;# 제목+설명+자막&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;claude_headless&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;claude_exe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# ② claude -p&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gemini_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# ③ Gemini 텍스트&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;리포트에는 영상마다 어떤 엔진이 분석했는지(🎬 영상 시청 / 🤖 claude -p / 📝 텍스트) 표시되므로, 그날 토큰 사정이 어땠는지도 한눈에 보인다.&lt;/p&gt;
&lt;p&gt;교훈: &lt;strong&gt;영상 분석은 토큰이 비싸다.&lt;/strong&gt; &amp;ldquo;많이 보는 것&amp;quot;보다 &amp;ldquo;잘 추려서 몇 개만 깊게 보는 것&amp;quot;이 정답이고, 그마저 안 될 때를 대비한 값싼 차선책을 미리 깔아두면 파이프라인이 멈추지 않는다.&lt;/p&gt;
&lt;h2 id="자동-실행-windows-작업-스케줄러"&gt;자동 실행: Windows 작업 스케줄러
&lt;/h2&gt;&lt;p&gt;매일 밤 11시 실행은 PowerShell로 등록했다. PC가 꺼져 있었을 경우를 대비해 &lt;strong&gt;놓친 작업은 켜지면 바로 실행&lt;/strong&gt;(StartWhenAvailable) 옵션도 켰다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-ScheduledTaskAction&lt;/span&gt; &lt;span class="n"&gt;-Execute&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;run.bat&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-WorkingDirectory&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$trigger&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-ScheduledTaskTrigger&lt;/span&gt; &lt;span class="n"&gt;-Daily&lt;/span&gt; &lt;span class="n"&gt;-At&lt;/span&gt; &lt;span class="mf"&gt;23&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-ScheduledTaskSettingsSet&lt;/span&gt; &lt;span class="n"&gt;-StartWhenAvailable&lt;/span&gt; &lt;span class="n"&gt;-ExecutionTimeLimit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;New-TimeSpan&lt;/span&gt; &lt;span class="n"&gt;-Hours&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Register-ScheduledTask&lt;/span&gt; &lt;span class="n"&gt;-TaskName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;YouTubeTrendReport&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Action&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt; &lt;span class="n"&gt;-Trigger&lt;/span&gt; &lt;span class="nv"&gt;$trigger&lt;/span&gt; &lt;span class="n"&gt;-Settings&lt;/span&gt; &lt;span class="nv"&gt;$settings&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="열흘-돌려본-결과"&gt;열흘 돌려본 결과
&lt;/h2&gt;&lt;p&gt;리포트가 매일 꼬박꼬박 쌓이고 있다. 영상별로 3줄 요약·다룬 키워드·실용 팁 1개가 정리되어 나오는데, 가장 큰 효과는 &lt;strong&gt;&amp;ldquo;지금 무슨 키워드가 이슈인지&amp;quot;를 아침 5분 안에 파악할 수 있다&lt;/strong&gt;는 것. 새 모델 출시 같은 큰 뉴스가 터진 날은 리포트 상위가 온통 그 얘기로 채워지니, 유튜브를 직접 뒤지지 않아도 흐름을 놓치지 않는다.&lt;/p&gt;
&lt;p&gt;실제로 이 리포트 덕에 잡은 주제로 글도 하나 썼다 — 최근에 올린 &lt;a class="link" href="https://junstellar.github.io/p/qwen3-tts-local-korean-narration/" &gt;무료 로컬 TTS 트렌드 + Qwen3-TTS 구축기&lt;/a&gt;의 트렌드 조사가 바로 이 파이프라인의 확장판이다.&lt;/p&gt;
&lt;h2 id="배운-것-요약"&gt;배운 것 요약
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;영상 분석은 Gemini에 URL을 직접 던지면 된다.&lt;/strong&gt; 자막 다운로드는 옛날 방식.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검색은 관련도순 + 이중 필터&lt;/strong&gt;(차단어 + AI 모델명 필수)가 노이즈 제거의 핵심.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;무료 티어 토큰 한도&lt;/strong&gt;를 감안해 &amp;ldquo;적게, 깊게&amp;rdquo; 분석하고, &lt;code&gt;claude -p&lt;/code&gt; → 텍스트 분석으로 이어지는 &lt;strong&gt;3단 폴백&lt;/strong&gt;을 깔아 파이프라인이 멈추지 않게.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 키는 절대 코드/채팅에 넣지 말고 &lt;code&gt;.env&lt;/code&gt;에.&lt;/strong&gt; (git에서도 제외)&lt;/li&gt;
&lt;li&gt;자동화의 마지막 조각은 결국 &lt;strong&gt;스케줄러&lt;/strong&gt;다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;코드 전체(trend.py, config.py, 스케줄러 등록 안내)는 GitHub에 공개했다: &lt;strong&gt;&lt;a class="link" href="https://github.com/junstellar/youtube-ai-trend-report" target="_blank" rel="noopener"
 &gt;junstellar/youtube-ai-trend-report&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>