$npx -y skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill watchExtract YouTube video transcripts via yt-dlp and pipe to /learn. Use when user says "watch", "youtube", "video", "transcript", or shares a YouTube URL.
| 1 | # /watch — YouTube → Knowledge Pipeline |
| 2 | |
| 3 | > Eyes that see. Ears that listen. Knowledge that stays. |
| 4 | |
| 5 | Extract transcripts from YouTube videos using yt-dlp, then optionally pipe through /learn for deep analysis. |
| 6 | |
| 7 | ## Usage |
| 8 | |
| 9 | ``` |
| 10 | /watch <url> # Extract CC + summarize |
| 11 | /watch <url> --raw # Extract CC only, save raw SRT |
| 12 | /watch <url> --learn # Extract CC → /learn --deep pipeline |
| 13 | /watch <url> --summary # Extract CC → concise summary only |
| 14 | ``` |
| 15 | |
| 16 | --- |
| 17 | |
| 18 | ## Step 0: Validate & Detect |
| 19 | |
| 20 | ```bash |
| 21 | date "+🕐 %H:%M %Z (%A %d %B %Y)" && ORACLE_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) |
| 22 | if [ -n "$ORACLE_ROOT" ] && [ -f "$ORACLE_ROOT/CLAUDE.md" ] && { [ -d "$ORACLE_ROOT/ψ" ] || [ -L "$ORACLE_ROOT/ψ" ]; }; then |
| 23 | PSI="$ORACLE_ROOT/ψ" |
| 24 | else |
| 25 | ORACLE_ROOT="$(pwd)" |
| 26 | PSI="$ORACLE_ROOT/ψ" |
| 27 | fi |
| 28 | ``` |
| 29 | |
| 30 | ### Check yt-dlp |
| 31 | |
| 32 | ```bash |
| 33 | if command -v yt-dlp &>/dev/null; then |
| 34 | YTDLP="yt-dlp" |
| 35 | elif [ -x /tmp/yt-dlp ]; then |
| 36 | YTDLP="/tmp/yt-dlp" |
| 37 | else |
| 38 | echo "⚠️ yt-dlp not found. Install: pip install yt-dlp OR curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /tmp/yt-dlp && chmod +x /tmp/yt-dlp" |
| 39 | exit 1 |
| 40 | fi |
| 41 | ``` |
| 42 | |
| 43 | ### Validate URL |
| 44 | |
| 45 | Extract video ID from URL. Accept: |
| 46 | - `https://www.youtube.com/watch?v=XXXXX` |
| 47 | - `https://youtu.be/XXXXX` |
| 48 | - `https://youtube.com/watch?v=XXXXX` |
| 49 | |
| 50 | ```bash |
| 51 | VIDEO_URL="$1" |
| 52 | VIDEO_ID=$(echo "$VIDEO_URL" | grep -oP '(?:v=|youtu\.be/)[\w-]{11}' | head -1 | sed 's/v=//') |
| 53 | if [ -z "$VIDEO_ID" ]; then |
| 54 | echo "❌ Invalid YouTube URL: $VIDEO_URL" |
| 55 | exit 1 |
| 56 | fi |
| 57 | echo "🎬 Video ID: $VIDEO_ID" |
| 58 | ``` |
| 59 | |
| 60 | --- |
| 61 | |
| 62 | ## Step 1: Extract Video Metadata |
| 63 | |
| 64 | ```bash |
| 65 | $YTDLP --print title --print duration_string --print channel --skip-download "$VIDEO_URL" 2>/dev/null |
| 66 | ``` |
| 67 | |
| 68 | Save as variables: `TITLE`, `DURATION`, `CHANNEL`. |
| 69 | |
| 70 | --- |
| 71 | |
| 72 | ## Step 2: Extract Transcript (CC) |
| 73 | |
| 74 | Try auto-generated English CC first, fall back to manual subs: |
| 75 | |
| 76 | ```bash |
| 77 | TMPDIR=$(mktemp -d) |
| 78 | $YTDLP --write-auto-sub --sub-lang en --sub-format srt --skip-download -o "$TMPDIR/%(id)s" "$VIDEO_URL" 2>/dev/null |
| 79 | |
| 80 | # Check if SRT was downloaded |
| 81 | SRT_FILE="$TMPDIR/${VIDEO_ID}.en.srt" |
| 82 | if [ ! -f "$SRT_FILE" ]; then |
| 83 | # Try manual subs |
| 84 | $YTDLP --write-sub --sub-lang en --sub-format srt --skip-download -o "$TMPDIR/%(id)s" "$VIDEO_URL" 2>/dev/null |
| 85 | SRT_FILE=$(ls "$TMPDIR"/*.srt 2>/dev/null | head -1) |
| 86 | fi |
| 87 | |
| 88 | if [ ! -f "$SRT_FILE" ]; then |
| 89 | echo "❌ No English subtitles found for this video." |
| 90 | echo "💡 Try: $YTDLP --list-subs '$VIDEO_URL' to see available languages." |
| 91 | exit 1 |
| 92 | fi |
| 93 | |
| 94 | SUB_COUNT=$(grep -c '^[0-9]\+$' "$SRT_FILE") |
| 95 | echo "📝 Extracted $SUB_COUNT subtitle blocks" |
| 96 | ``` |
| 97 | |
| 98 | --- |
| 99 | |
| 100 | ## Step 3: Clean Transcript |
| 101 | |
| 102 | Strip SRT formatting (timestamps, numbers, blank lines) into plain text: |
| 103 | |
| 104 | ```bash |
| 105 | # Remove SRT formatting → clean text |
| 106 | sed '/^[0-9]*$/d; /^$/d; /-->/d' "$SRT_FILE" | sed 's/<[^>]*>//g' | sort -u > "$TMPDIR/clean.txt" |
| 107 | ``` |
| 108 | |
| 109 | Read the clean transcript. |
| 110 | |
| 111 | --- |
| 112 | |
| 113 | ## Step 4: Save & Process (mode-dependent) |
| 114 | |
| 115 | ### Output Directory |
| 116 | |
| 117 | ```bash |
| 118 | # Slugify title |
| 119 | SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g; s/--*/-/g; s/^-//; s/-$//' | cut -c1-50) |
| 120 | DATE=$(date +%Y-%m-%d) |
| 121 | OUT_DIR="$PSI/learn/$SLUG/$DATE" |
| 122 | mkdir -p "$OUT_DIR" |
| 123 | ``` |
| 124 | |
| 125 | ### Mode: `--raw` |
| 126 | |
| 127 | Save raw SRT + clean text only: |
| 128 | |
| 129 | ```bash |
| 130 | cp "$SRT_FILE" "$OUT_DIR/raw-cc.srt" |
| 131 | cp "$TMPDIR/clean.txt" "$OUT_DIR/transcript.txt" |
| 132 | ``` |
| 133 | |
| 134 | Output: |
| 135 | ``` |
| 136 | ✅ Raw transcript saved |
| 137 | 📁 $OUT_DIR/raw-cc.srt (SRT) |
| 138 | 📁 $OUT_DIR/transcript.txt (clean) |
| 139 | 🎬 $TITLE ($DURATION) by $CHANNEL |
| 140 | ``` |
| 141 | |
| 142 | ### Mode: `--summary` (default) |
| 143 | |
| 144 | Read the clean transcript and produce a structured analysis: |
| 145 | |
| 146 | ```markdown |
| 147 | # [TITLE] |
| 148 | |
| 149 | **Source**: [YouTube URL] |
| 150 | **Duration**: [DURATION] | **Channel**: [CHANNEL] |
| 151 | **Extracted**: [DATE] via yt-dlp CC + Oracle analysis |
| 152 | |
| 153 | --- |
| 154 | |
| 155 | ## Thesis |
| 156 | [1-2 sentence core argument] |
| 157 | |
| 158 | ## Timestamped Summary |
| 159 | [Key points with timestamps from SRT] |
| 160 | |
| 161 | ## Key Quotes |
| 162 | [5-10 most important quotes] |
| 163 | |
| 164 | ## Relevance |
| 165 | [How this connects to our work — skills, fleet, philosophy] |
| 166 | ``` |
| 167 | |
| 168 | Save to `$OUT_DIR/analysis.md` + raw files. |
| 169 | |
| 170 | ### Mode: `--learn` |
| 171 | |
| 172 | Save raw files, then invoke the full /learn pipeline: |
| 173 | |
| 174 | ``` |
| 175 | 💡 Transcript extracted. Piping to /learn --deep... |
| 176 | ``` |
| 177 | |
| 178 | Create a temporary markdown file with the full transcript content, then use it as input for deep analysis. The /learn pipeline will produce the full 5-document deep study. |
| 179 | |
| 180 | --- |
| 181 | |
| 182 | ## Step 5: Cleanup |
| 183 | |
| 184 | ```bash |
| 185 | rm -rf "$TMPDIR" |
| 186 | ``` |
| 187 | |
| 188 | --- |
| 189 | |
| 190 | ## Rules |
| 191 | |
| 192 | 1. **Never download video** — subtitles only (`--skip-download` always) |
| 193 | 2. **Oracle root** — detect before writing to ψ/ |
| 194 | 3. **English first** — try `en` auto-subs, then manual, then fail with language hint |
| 195 | 4. **Clean text** — strip SRT formatting before analysis |
| 196 | 5. **Credit source** — always include YouTube URL, channel, and extraction date |
| 197 | 6. **No redistribution** — transcript stays in local ψ/ vau |