youtube-skillbox 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. youtube_skillbox-0.4.1/LICENSE +21 -0
  2. youtube_skillbox-0.4.1/MANIFEST.in +6 -0
  3. youtube_skillbox-0.4.1/PKG-INFO +384 -0
  4. youtube_skillbox-0.4.1/README.md +347 -0
  5. youtube_skillbox-0.4.1/THIRD_PARTY_LICENSES/youtube-agent-skill_LICENSE.txt +41 -0
  6. youtube_skillbox-0.4.1/setup.cfg +4 -0
  7. youtube_skillbox-0.4.1/setup.py +50 -0
  8. youtube_skillbox-0.4.1/skills/__init__.py +0 -0
  9. youtube_skillbox-0.4.1/skills/transcript/SKILL.md +103 -0
  10. youtube_skillbox-0.4.1/skills/transcript/__init__.py +0 -0
  11. youtube_skillbox-0.4.1/skills/transcript/scripts/gettranscript.py +241 -0
  12. youtube_skillbox-0.4.1/skills/youtube/SKILL.md +110 -0
  13. youtube_skillbox-0.4.1/skills/youtube/__init__.py +0 -0
  14. youtube_skillbox-0.4.1/skills/youtube/scripts/ytdata.py +2235 -0
  15. youtube_skillbox-0.4.1/skills/yt-audit/SKILL.md +64 -0
  16. youtube_skillbox-0.4.1/skills/yt-audit/__init__.py +0 -0
  17. youtube_skillbox-0.4.1/skills/yt-chapters/SKILL.md +50 -0
  18. youtube_skillbox-0.4.1/skills/yt-chapters/__init__.py +0 -0
  19. youtube_skillbox-0.4.1/skills/yt-chapters/chapters.py +75 -0
  20. youtube_skillbox-0.4.1/skills/yt-comment/SKILL.md +62 -0
  21. youtube_skillbox-0.4.1/skills/yt-comment/__init__.py +0 -0
  22. youtube_skillbox-0.4.1/skills/yt-edit/SKILL.md +50 -0
  23. youtube_skillbox-0.4.1/skills/yt-edit/__init__.py +0 -0
  24. youtube_skillbox-0.4.1/skills/yt-edit/deadair.py +86 -0
  25. youtube_skillbox-0.4.1/skills/yt-package/SKILL.md +60 -0
  26. youtube_skillbox-0.4.1/skills/yt-package/__init__.py +0 -0
  27. youtube_skillbox-0.4.1/skills/yt-package/scripts/__init__.py +0 -0
  28. youtube_skillbox-0.4.1/skills/yt-package/scripts/title.py +307 -0
  29. youtube_skillbox-0.4.1/skills/yt-package/title.py +81 -0
  30. youtube_skillbox-0.4.1/skills/yt-plan/SKILL.md +57 -0
  31. youtube_skillbox-0.4.1/skills/yt-plan/__init__.py +0 -0
  32. youtube_skillbox-0.4.1/skills/yt-retention/SKILL.md +54 -0
  33. youtube_skillbox-0.4.1/skills/yt-retention/__init__.py +0 -0
  34. youtube_skillbox-0.4.1/skills/yt-retention/retention.py +90 -0
  35. youtube_skillbox-0.4.1/skills/yt-retention/scripts/__init__.py +0 -0
  36. youtube_skillbox-0.4.1/skills/yt-retention/scripts/retention.py +322 -0
  37. youtube_skillbox-0.4.1/skills/yt-script/SKILL.md +69 -0
  38. youtube_skillbox-0.4.1/skills/yt-script/__init__.py +0 -0
  39. youtube_skillbox-0.4.1/skills/yt-script/hooks.json +268 -0
  40. youtube_skillbox-0.4.1/skills/yt-script/hookscore.py +129 -0
  41. youtube_skillbox-0.4.1/skills/yt-script/scripts/__init__.py +0 -0
  42. youtube_skillbox-0.4.1/skills/yt-script/scripts/hookscore.py +314 -0
  43. youtube_skillbox-0.4.1/skills/yt-seo/SKILL.md +132 -0
  44. youtube_skillbox-0.4.1/skills/yt-seo/__init__.py +0 -0
  45. youtube_skillbox-0.4.1/skills/yt-shorts/SKILL.md +47 -0
  46. youtube_skillbox-0.4.1/skills/yt-shorts/__init__.py +0 -0
  47. youtube_skillbox-0.4.1/skills/yt-viral/SKILL.md +62 -0
  48. youtube_skillbox-0.4.1/skills/yt-viral/__init__.py +0 -0
  49. youtube_skillbox-0.4.1/skills/yt-viral/scripts/__init__.py +0 -0
  50. youtube_skillbox-0.4.1/skills/yt-viral/scripts/viral.py +253 -0
  51. youtube_skillbox-0.4.1/skills/yt-viral/swipe.py +74 -0
  52. youtube_skillbox-0.4.1/skills/yt-workflow/SKILL.md +213 -0
  53. youtube_skillbox-0.4.1/skills/yt-workflow/__init__.py +0 -0
  54. youtube_skillbox-0.4.1/skills/yt-workflow/scripts/__init__.py +0 -0
  55. youtube_skillbox-0.4.1/tests/conftest.py +18 -0
  56. youtube_skillbox-0.4.1/tests/fix_missing_early.py +20 -0
  57. youtube_skillbox-0.4.1/tests/test_retention.py +350 -0
  58. youtube_skillbox-0.4.1/tests/test_title.py +163 -0
  59. youtube_skillbox-0.4.1/tests/test_viral.py +315 -0
  60. youtube_skillbox-0.4.1/tests/test_ytdata.py +219 -0
  61. youtube_skillbox-0.4.1/youtube_skillbox/__init__.py +3 -0
  62. youtube_skillbox-0.4.1/youtube_skillbox/cli.py +35 -0
  63. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/PKG-INFO +384 -0
  64. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/SOURCES.txt +67 -0
  65. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/dependency_links.txt +1 -0
  66. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/entry_points.txt +2 -0
  67. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/requires.txt +1 -0
  68. youtube_skillbox-0.4.1/youtube_skillbox.egg-info/top_level.txt +2 -0
  69. youtube_skillbox-0.4.1/ytdata.py +19 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 hackers-reality
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ include LICENSE
2
+ include README.md
3
+ recursive-include skills *
4
+ recursive-include tests *
5
+ recursive-include youtube_skillbox *
6
+ recursive-include THIRD_PARTY_LICENSES *
@@ -0,0 +1,384 @@
1
+ Metadata-Version: 2.4
2
+ Name: youtube-skillbox
3
+ Version: 0.4.1
4
+ Summary: Free YouTube research toolkit — search, keywords, competition, rank tracking, SEO scorecard, outliers, content gap, trends. No user-supplied YouTube Data API key required.
5
+ Home-page: https://github.com/hackers-reality/youtube-skillbox
6
+ Author: hackers-reality
7
+ Author-email: phulariarnav@gmail.com
8
+ Project-URL: Source, https://github.com/hackers-reality/youtube-skillbox
9
+ Project-URL: Issues, https://github.com/hackers-reality/youtube-skillbox/issues
10
+ Keywords: youtube seo keyword research rank tracking competition analysis
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Internet :: WWW/HTTP
20
+ Classifier: Topic :: Multimedia :: Video
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: yt-dlp>=2026.10.26
25
+ Dynamic: author
26
+ Dynamic: author-email
27
+ Dynamic: classifier
28
+ Dynamic: description
29
+ Dynamic: description-content-type
30
+ Dynamic: home-page
31
+ Dynamic: keywords
32
+ Dynamic: license-file
33
+ Dynamic: project-url
34
+ Dynamic: requires-dist
35
+ Dynamic: requires-python
36
+ Dynamic: summary
37
+
38
+ <div align="center">
39
+ <img src="assets/banner.svg" alt="YouTube Skillbox — 13 free YouTube skills for AI agents" width="100%">
40
+ </div>
41
+
42
+ <h1 align="center">YouTube Skillbox</h1>
43
+
44
+ <p align="center">
45
+ <b>13 free YouTube skills for AI agents — research, transcripts, and the full creator workflow.</b><br>
46
+ No user-supplied YouTube Data API key · no credits · no expiry — <b>$0 forever</b>
47
+ </p>
48
+
49
+ <p align="center">
50
+ <a href="#-table-of-contents">Table of Contents</a> ·
51
+ <a href="#-demo">Demo</a> ·
52
+ <a href="#-the-youtube-research-skill">Research</a> ·
53
+ <a href="#-the-transcript-skill">Transcripts</a> ·
54
+ <a href="#-when-yt-dlp-cant-do-it-we-build-it">Gap-fill engine</a> ·
55
+ <a href="#%EF%B8%8F-the-10-creator-skills">Creator tools</a> ·
56
+ <a href="#-install">Install</a> ·
57
+ <a href="#-have-your-agent-set-it-up-for-you">Agent prompt</a>
58
+ </p>
59
+
60
+ ---
61
+
62
+ ## ⚠️ Important Disclaimer
63
+
64
+ **This tool accesses public YouTube data for research purposes only.**
65
+
66
+ - Respect YouTube's [Terms of Service](https://www.youtube.com/t/terms) and [Community Guidelines](https://www.youtube.com/t/community_guidelines)
67
+ - Respect rate limits — add delays between bulk requests
68
+ - Not affiliated with YouTube or Google
69
+ - For research/educational use only
70
+
71
+ ---
72
+
73
+ ## 📺 Demo
74
+
75
+ Watch the agent in action — one prompt, *"why isn't this channel growing?"* OpenCode researches the videos, Shorts and transcripts, then surfaces the hooks, scripts and what to fix (why one Short hit 8K views while the rest couldn't pass 1K):
76
+
77
+ <div align="center">
78
+ <a href="https://www.youtube.com/watch?v=y9U_ZeJ713M" target="_blank">
79
+ <img src="assets/thumbnail.png" alt="YouTube Skillbox Demo" width="80%">
80
+ </a>
81
+ <br>
82
+ <sub>Click to watch on YouTube →</sub>
83
+ </div>
84
+
85
+ ---
86
+
87
+ ## 📋 Table of Contents
88
+
89
+ | Section | Description |
90
+ |---------|-------------|
91
+ | [📺 Demo](#-demo) | Video walkthrough of the agent using the skills |
92
+ | [What is this?](#what-is-this) | Overview of the two-layer architecture |
93
+ | [📺 The `youtube` research skill](#-the-youtube-research-skill) | 17 subcommands — search, keywords, compete, trends, track, scorecard, outliers, gap, channels, posts, shows |
94
+ | [📜 The `transcript` skill](#-the-transcript-skill) | Free transcripts via yt-dlp |
95
+ | [🛠 Gap-fill engine](#-when-yt-dlp-cant-do-it-we-build-it) | How we fill yt-dlp's gaps with raw scrapers |
96
+ | [✂️ The 10 creator skills](#%EF%B8%8F-the-10-creator-skills) | Scripts, SEO, chapters, Shorts, and more |
97
+ | [📦 Install](#-install) | Quick setup for any agent harness |
98
+ | [🤖 Have your agent set it up for you](#-have-your-agent-set-it-up-for-you) | Copy-paste prompt for any coding agent |
99
+ | [📝 Notes & limits](#-notes--limits) | Rate limits, pagination, edge cases |
100
+ | [⚖️ Responsible use](#%EF%B8%8F-responsible-use) | Personal vs commercial use, risk notes |
101
+ | [📄 License](#-license) | MIT License |
102
+ | [🙏 Credits](#-credits) | yt-dlp, upstream skill sources |
103
+
104
+ ---
105
+
106
+ ## What is this?
107
+
108
+ A drop-in set of **[SKILL.md](https://github.com/anthropics/skills) skills** for agent harnesses like **OpenCode** (works anywhere skills are discovered from a folder). Each skill in [`skills/`](skills/) is self-contained: a `SKILL.md` the agent reads, plus small Python tools it runs.
109
+
110
+ Two layers:
111
+
112
+ | Layer | Skills | Powered by |
113
+ | ----- | ------ | ---------- |
114
+ | **Data** (research) | `youtube`, `transcript` | `yt-dlp` + custom raw YouTube scrapers |
115
+ | **Creator workflow** | 10 × `yt-*` | local Python scripts, zero network deps for logic |
116
+
117
+ Everything is free. There is **no paid tier, no user-supplied YouTube Data API key, and no account** anywhere in the stack.
118
+
119
+ ---
120
+
121
+ ## 🔗 How the Skills Chain Together (The Pipeline)
122
+
123
+ The skills aren't isolated — they form an **7-phase analysis pipeline** that agents can run end-to-end:
124
+
125
+ ```mermaid
126
+ graph TD
127
+ A["User: Channel Analysis"] --> B["Phase 1: youtube"]
128
+ B --> C["Phase 2: transcript"]
129
+ C --> D["Phase 3: yt-script"]
130
+ D --> E["Phase 4: yt-package"]
131
+ E --> F["Phase 5: youtube (SEO/keywords)"]
132
+ F --> G["Phase 6: youtube (outliers/gaps)"]
133
+ G --> H["Phase 7: yt-retention*"]
134
+
135
+ B --> J["Data: sections, videos, home, profile"]
136
+ C --> K["Transcripts for top 3 videos"]
137
+ D --> L["Hook scores 0-100"]
138
+ E --> M["Title/thumbnail scores"]
139
+ F --> N["Keywords, competition, scorecards"]
140
+ G --> O["Outliers, competitor gaps"]
141
+ H --> P["ONE fix + 3 working + don't-do"]
142
+ ```
143
+
144
+ *Phase 7 (yt-retention) optional — requires YouTube Studio CSV export.
145
+
146
+ | Phase | Skill | Input | Output | Purpose |
147
+ |-------|-------|-------|--------|---------|
148
+ | 1 | `youtube` | @handle | Channel data (sections, videos, home, profile) | Data foundation |
149
+ | 2 | `transcript` | Top 3 video IDs | Full transcripts (JSON + timestamps) | Raw content |
150
+ | 3 | `yt-script` | Transcripts | Hook scores (0-100) per video | Retention hooks |
151
+ | 4 | `yt-package` | Titles + hook scores | Title/thumbnail scores + briefs | CTR optimization |
152
+ | 5 | `youtube` | Niche + target video | Keywords, competition, scorecards | Search visibility |
153
+ | 6 | `youtube` | Channel + niche | Outliers, competitor gaps | Growth levers |
154
+ | 7 | `yt-retention` | Studio CSV (optional) | Drop-off points, curves | Pacing fixes |
155
+
156
+ **Each skill declares its pipeline position in its SKILL.md** — agents read this to know what comes before/after.
157
+
158
+ **Final synthesis:** After running all phases, the agent synthesizes: **ONE biggest fix + 3 things working + what NOT to do.**
159
+
160
+ ---
161
+
162
+ ## 📺 The `youtube` research skill
163
+
164
+ Thirteen subcommands behind one script — `skills/youtube/scripts/ytdata.py`:
165
+
166
+ ```bash
167
+ python skills/youtube/scripts/ytdata.py search "query" --limit 10 # find videos on a topic
168
+ python skills/youtube/scripts/ytdata.py keywords "seed idea" --patterns # keyword ideas (2 engines), scored
169
+ python skills/youtube/scripts/ytdata.py track "keyword" --video <url> # where your video ranks (+ history)
170
+ python skills/youtube/scripts/ytdata.py profile "@handle" # About: subs, description, keywords
171
+ python skills/youtube/scripts/ytdata.py sections "@handle" # count EVERY tab at once
172
+ python skills/youtube/scripts/ytdata.py home "@handle" # home shelves + Featured Channels
173
+ python skills/youtube/scripts/ytdata.py channel "@handle" --tab shorts
174
+ python skills/youtube/scripts/ytdata.py latest "@handle" --limit 10
175
+ python skills/youtube/scripts/ytdata.py posts "@handle" --limit 30 # community posts, paginated
176
+ python skills/youtube/scripts/ytdata.py shows "@handle" # Shows tab (episode collections)
177
+ python skills/youtube/scripts/ytdata.py playlist "<playlist-url>"
178
+ python skills/youtube/scripts/ytdata.py info "<video-url-or-id>" # views, likes, tags, date
179
+ ```
180
+
181
+ `search`, `keywords`, `track` and `compete` take `--gl` / `--hl` (default `US` / `en`) to pin a
182
+ region and language, so a rank position means the same thing on every machine.
183
+ `keywords` merges two engines by default — YouTube's suggest plus DuckDuckGo's
184
+ (`--sources yt` or `--sources ddg` to use one).
185
+
186
+ Add `--json` to any command for structured output. Example:
187
+
188
+ ```
189
+ $ python skills/youtube/scripts/ytdata.py sections "@MrBeast"
190
+ Channel: https://www.youtube.com/@MrBeast
191
+ videos : 805
192
+ shorts : 205
193
+ streams : no tab
194
+ shows : 5
195
+ playlists: no tab
196
+ community: 20+ posts (use `posts` to read them)
197
+ ```
198
+
199
+ | Command | Returns |
200
+ | ------- | ------- |
201
+ | `search` | Videos matching a query — title, duration, views, channel, URL (`--gl` / `--hl` locale) |
202
+ | `keywords` | Keyword ideas from **YouTube suggest + DuckDuckGo** — a–z + pattern expansion, scored by cross-engine demand, `Y` = trending this year |
203
+ | `compete` | Competition score (0–100) for a keyword — views, authority, title density, entrenchment, velocity |
204
+ | `trends` | Historical trend for a seed keyword — score trajectory, velocity, sparklines (from `keywords` runs) |
205
+ | `track` | Where a video ranks for a keyword — with ↑↓ history across runs, kept per locale |
206
+ | `scorecard` | SEO checklist for a video — title/desc/tags/keyword fit, 0–100 score with actionable fixes |
207
+ | `outliers` | Videos overperforming their channel — views/subscriber ratio, finds breakout content |
208
+ | `gap` | Content gap analysis — my seed keywords vs competitor's profile keywords |
209
+ | `profile` | Channel About section — name, handle, subs, description, **all** keywords |
210
+ | `sections` | One-call counts of every tab: videos / shorts / streams / shows / playlists / posts |
211
+ | `home` | Home-tab shelves — featured video, Shorts, playlists, posts, **Featured Channels** (names + URLs) |
212
+ | `channel` | Channel uploads (`--tab videos \| shorts \| streams`) |
213
+ | `latest` | Most recent uploads, reverse-chronological |
214
+ | `posts` | Community posts — text, author, date, like count, URL. **Paginated** (~10/page) |
215
+ | `shows` | Shows tab — title, episode count, URL |
216
+ | `playlist` | Every video in a playlist |
217
+ | `info` | One video's exact stats — views, likes, subs, date, tags, categories, description |
218
+
219
+ ---
220
+
221
+ ## 📜 The `transcript` skill
222
+
223
+ Spoken text of any video, free via yt-dlp:
224
+
225
+ ```bash
226
+ python scripts/gettranscript.py "<url-or-id>" # clean text
227
+ python scripts/gettranscript.py "<url-or-id>" --format stamped # [MM:SS] per line
228
+ python scripts/gettranscript.py "<url-or-id>" --format json # segments + metadata
229
+ python scripts/gettranscript.py "<url-or-id>" --lang es,es-419 # language priority list
230
+ ```
231
+
232
+ Prefers human captions, falls back to auto-generated. The JSON form carries `start`/`duration` per cue — ready for chapters, quotes, or edit lists.
233
+
234
+ ---
235
+
236
+ ## 🛠 When yt-dlp can't do it, we build it
237
+
238
+ `yt-dlp` is the data engine for channels, playlists, metadata and transcripts — but it explicitly refuses a few things (returns `0 entries`, says `"no home tab"`, or quietly localizes results to your own IP). Rather than pay an API, each gap is filled with **a small pure-Python scraper** (`urllib` + JSON parsing of YouTube's own page data / Innertube endpoints):
239
+
240
+ | Gap | What yt-dlp does | Our fill |
241
+ | --- | ---------------- | -------- |
242
+ | **Community posts** | `/community` → `0 entries` (wontfix) | Raw `ytInitialData` scrape of `/posts` (with `/community` fallback) |
243
+ | **Post pagination** | — | **Innertube `browse` continuation POSTs** — the exact request infinite-scroll fires when you scroll. `--limit 30` reaches ~3 pages / months back |
244
+ | **Home sections** | `"This channel does not have a home tab"` | Home-tab shelf parser: featured video, Shorts, playlists, posts, and **Featured Channels** with URLs |
245
+ | **Shows tab** | `0 entries` (can't parse `gridShowRenderer`) | Direct renderer parser → title, episode count, show URL |
246
+ | **Tab counts** | one tab per invocation | `sections` probes every tab and merges yt-dlp + raw results |
247
+ | **Locale-pinned search** | search follows your IP — `gl` is silently set to whatever country you're in, and no flag exists to change it | Raw Innertube `search` POSTs with `client.gl` / `client.hl` pinned explicitly: same rank in New York and New Delhi. Works for `search`, `keywords`, `track`, `compete`, `trends`. |
248
+ | **Keyword competition score** | not available | Live SERP analysis: median views (log), verified %, title match density, median age, **velocity (views/day)** → 0–100 score + band (EASY/MEDIUM/HARD/SATURATED) + actionable advice |
249
+ | **Historical keyword trends** | not available | `keywords` auto-logs score snapshots to `~/.ytdata-trendlog.json`; `trends` shows sparklines, velocity (↑/↓/→), Δ over time |
250
+ | **Video SEO scorecard** | not available | `scorecard` audits title/desc/tags/chapters/freshness vs target keyword → 0–100 with weighted checks & fixes |
251
+ | **Channel outliers** | not available | `outliers` finds videos where views/subs ratio exceeds threshold — breakout content regardless of channel size |
252
+ | **Content gap analysis** | not available | `gap` compares your seed keywords vs competitor's profile keywords → unique/shared opportunities |
253
+
254
+ All of it is dependency-free Python — no API key, no credits, no tokens to manage.
255
+
256
+ ```
257
+ $ python scripts/ytdata.py home "@MKBHD" --limit 3
258
+ 1. [featured video] Macbook PROLED XDR Impressions: ... (1 item)
259
+ 2. [videos] Videos (12 items)
260
+ 3. [featured channels] 🔥 MKBHD Approved 🔥 (6 items)
261
+ - The Studio https://www.youtube.com/channel/UCG7J20...
262
+ - Auto Focus https://www.youtube.com/channel/UC2J-0g...
263
+ - WVFRM Podcast https://www.youtube.com/channel/UCEcrRX...
264
+ ```
265
+
266
+ ---
267
+
268
+ ## ✂️ The 10 creator skills
269
+
270
+ Local tools that turn raw transcripts/data into publishing artifacts:
271
+
272
+ | Skill | Does |
273
+ | ----- | ---- |
274
+ | `yt-script` | Full video script from a raw idea — 21 hook formulas, scored |
275
+ | `yt-package` | Title + thumbnail text written and linted as one pairing |
276
+ | `yt-seo` | Description, tags and search-facing text aimed at real queries |
277
+ | `yt-chapters` | Validated YouTube chapters straight from a transcript |
278
+ | `yt-shorts` | Finds the self-contained Shorts hiding inside a long video |
279
+ | `yt-edit` | Transcript → edit decision list (dead air, fillers, retakes) |
280
+ | `yt-retention` | Reads a Studio retention export, says where viewers leave |
281
+ | `yt-viral` | What's actually working in a niche, ranked by channel-beat |
282
+ | `yt-plan` | A week/month content calendar sized to real capacity |
283
+ | `yt-comment` | Drafts comment replies in the creator's voice, triaged |
284
+
285
+ They pair naturally with the data layer: `youtube` finds the videos → `transcript` pulls the text → `yt-*` does the work.
286
+
287
+ ---
288
+
289
+ ## 📦 Install
290
+
291
+ **Requirements:** Python 3.10+ and [`yt-dlp`](https://github.com/yt-dlp/yt-dlp):
292
+
293
+ ```bash
294
+ python -m pip install --user -U yt-dlp
295
+ ```
296
+
297
+ > `posts`, `home`, `shows`, `search`, `keywords` and `track` work even *without* yt-dlp (pure HTTP). Everything else runs through it. Run it as a module (`python -m yt_dlp`) if the exe isn't on PATH.
298
+
299
+ Then, from this repo — point the installer at **your agent's skills directory** (where it discovers `SKILL.md` files):
300
+
301
+ ```bash
302
+ ./install.sh "/path/to/your/agents/skills" # Linux / macOS — e.g. ~/.config/opencode/skills
303
+ ```
304
+
305
+ ```powershell
306
+ .\install.ps1 "C:\path\to\your\agents\skills" # Windows — e.g. %USERPROFILE%\.config\opencode\skills
307
+ ```
308
+
309
+ …or by hand — copy any folder from [`skills/`](skills/) there yourself:
310
+
311
+ ```bash
312
+ cp -r skills/* ~/.config/opencode/skills/ # example: OpenCode
313
+ ```
314
+
315
+ Restart the agent session; the skills are auto-discovered by their `description` frontmatter.
316
+
317
+ ---
318
+
319
+ ## 🤖 Have your agent set it up for you
320
+
321
+ Don't want to install by hand? Paste this into any coding agent that can read files — **Claude Code, OpenCode, Cursor, or any agent with skill discovery**:
322
+
323
+ ```text
324
+ Set up my YouTube skills from https://github.com/hackers-reality/youtube-skillbox
325
+
326
+ 1. Get the repo: git clone https://github.com/hackers-reality/youtube-skillbox.git
327
+ (or fetch files from GitHub if you can't clone)
328
+ 2. Install the data engine: python -m pip install --user -U yt-dlp
329
+ (This is the ONLY runtime dependency — all skills share this one ytdata.py module)
330
+ 3. Copy the data module to your agent's global skills directory (REQUIRED):
331
+ - Linux/macOS: cp -r skills/youtube/scripts ~/.config/opencode/skills/youtube/
332
+ - Linux/macOS: cp -r skills/transcript/scripts ~/.config/opencode/skills/transcript/
333
+ - Windows: xcopy skills\youtube\scripts %USERPROFILE%\.config\opencode\skills\youtube\ /E /I
334
+ - Windows: xcopy skills\transcript\scripts %USERPROFILE%\.config\opencode\skills\transcript\ /E /I
335
+ (The SKILL.md files reference `scripts/ytdata.py` and `scripts/gettranscript.py`
336
+ relative to their SKILL.md location. The scripts MUST be in the same folder structure.)
337
+ 4. Point your agent at the skills:
338
+ - **OpenCode / Cursor / local agents**: skills auto-discovered from
339
+ .opencode/skills/ (project) and ~/.config/opencode/skills/ (global)
340
+ - **Claude Code / web agents**: Add the skills/ folder path in settings,
341
+ or copy skills/*/ to your agent's skills directory
342
+ - **Any agent with "add skill" UI**: Point to skills/ folder or paste SKILL.md files
343
+ 5. Smoke-test: run
344
+ python ~/.config/opencode/skills/youtube/scripts/ytdata.py search "rick astley" --limit 1
345
+ (should return 1 video with title, views, channel, URL)
346
+ 6. Ask your agent: "List all 13 YouTube skills and when to use each"
347
+ It should read each skills/*/SKILL.md and answer from there.
348
+ ```
349
+
350
+ **Important**: All 13 skills (youtube, transcript, 10 yt-*) share **one data module**: `skills/youtube/scripts/ytdata.py`. The skills reference it via relative paths (`scripts/ytdata.py` from SKILL.md). You **must** copy the `scripts/` folder alongside each skill's SKILL.md in your agent's skills directory (step 3 above). Or install globally with `pip install -e .` (then `ytdata` works from anywhere).
351
+
352
+ ---
353
+
354
+ ## 📝 Notes & limits
355
+
356
+ - YouTube may throttle (HTTP 429) if you hammer it — a small delay between bulk calls is enough.
357
+ - `posts` costs one HTTP request per ~10 posts; keep `--limit` ≤ 100 per invocation.
358
+ - `sections` shows `N+` for community counts when more pages exist (exact when they fit on page 1).
359
+ - Flat list view counts can show `?` occasionally — use `info` on a specific video for exact numbers.
360
+ - Private / age-restricted / deleted targets fail with a clear message instead of silence.
361
+
362
+ ## ⚖️ Responsible use
363
+
364
+ This project reads publicly available YouTube data directly from the web rather than through the official API — strictly outside what YouTube's Terms of Service permit, even though that's common practice for personal tools like this.
365
+
366
+ - **Personal use** — read-only public data, no login, low volume: low risk. Keep it that way.
367
+ - **Commercial or high-volume use** — not recommended. Scaling it up, reselling data, or hammering YouTube meaningfully raises the risk of rate-limits, IP blocks, or takedown requests.
368
+ - Never point it at private, age-restricted, or members-only content — the tools intentionally fail instead of bypassing.
369
+ - **No user-supplied YouTube Data API key is required** — the project dynamically extracts YouTube's `INNERTUBE_API_KEY` from YouTube's public page configuration. This does not imply unlimited access, guaranteed uptime, unlimited requests, or immunity from YouTube rate limits.
370
+
371
+ Use it at your own risk; this project is not affiliated with YouTube or Google. The code itself stays MIT-licensed — this section is guidance about how you use it against YouTube, not a restriction on the code.
372
+
373
+ ## 📄 License
374
+
375
+ Released under the **[MIT License](LICENSE)** — free to use, modify, and redistribute.
376
+
377
+ ## 🙏 Credits
378
+
379
+ - **[yt-dlp](https://github.com/yt-dlp/yt-dlp)** — the extraction engine underneath the data layer.
380
+ - The 10 creator (`yt-*`) skills come from the community GitHub collection **`youtube-agent-skill`** — installed here nearly as-is (deduplicated only), not rewritten from scratch.
381
+ - The `youtube` and `transcript` skills (scripts and docs, including every gap-fill in this README) were built and rewritten in this project.
382
+ - This project reads publicly available YouTube data; use it responsibly and respect YouTube's Terms of Service.
383
+
384
+ <p align="center">Made so nobody has to pay for a YouTube API key again 🎉</p>