# Dwnldr

> Yarr! Plunder videos from the seven seas of the internet — YouTube, TikTok, Instagram, X, Reddit & 1000+ ports o' call. Drop a link, get full quality loot with metadata scrubbed clean. No traces, no evidence, just pure content booty delivered straight to yer Telegram. Supports MP4, MP3, playlists, and more.

- Skill: `johnalbertini14-glitch/dwnldr` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add johnalbertini14-glitch/dwnldr`
- Raw SKILL.md: https://api.skillmd.com/api/skills/johnalbertini14-glitch/dwnldr/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: johnalbertini14-glitch (https://skillmd.com/u/johnalbertini14-glitch)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/johnalbertini14-glitch/dwnldr

---


# Video Downloader

Download videos from **YouTube, TikTok, Instagram, Twitter/X**, and 1000+ sites. Just paste a link — the video gets downloaded at full quality and sent back to you.

## URL Detection (AUTO-TRIGGER)

**CRITICAL:** When the user sends a message that contains a URL from any of these domains, AUTOMATICALLY treat it as a download request. Do NOT ask "what do you want me to do with this?" — just download it.

**Auto-detect domains:**
- `youtube.com`, `youtu.be`, `m.youtube.com`
- `tiktok.com`, `vm.tiktok.com`
- `instagram.com` (reels, posts, stories)
- `x.com`, `twitter.com`
- `reddit.com` (video posts)
- `twitch.tv` (clips)
- `vimeo.com`
- `facebook.com` (videos, reels)

**Pattern:** If user message contains a URL matching these domains → skip questions, download immediately.

## Download Flow

### Step 1 — Download

```bash
yt-dlp --js-runtimes nodejs \
  -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \
  --merge-output-format mp4 \
  --no-playlist \
  --output "/home/rami/.openclaw/workspace/_incoming/%(title).50s.%(ext)s" \
  "<URL>"
```

**Fallback for stubborn sites (TikTok, Instagram):**
```bash
yt-dlp --js-runtimes nodejs \
  -f "best" \
  --no-playlist \
  --output "/home/rami/.openclaw/workspace/_incoming/%(title).50s.%(ext)s" \
  "<URL>"
```

### Step 2 — Strip metadata

Remove ALL metadata (title, author, GPS, comments, timestamps, source URL) for clean clips:

```bash
ffmpeg -i "/home/rami/.openclaw/workspace/_incoming/<filename>" \
  -map_metadata -1 \
  -fflags +bitexact \
  -flags:v +bitexact \
  -flags:a +bitexact \
  -c copy \
  "/home/rami/.openclaw/workspace/_incoming/<filename>_clean.mp4" \
  && mv "/home/rami/.openclaw/workspace/_incoming/<filename>_clean.mp4" \
        "/home/rami/.openclaw/workspace/_incoming/<filename>"
```

This strips: title, artist, comment, description, source URL, creation date, encoder info, GPS coordinates — everything.

### Step 3 — Get file info

```bash
ls -lh /home/rami/.openclaw/workspace/_incoming/<filename>
```

### Step 3 — Send to user

**If file is under 50MB** — send directly via Telegram:
```bash
openclaw message send \
  --channel telegram \
  --target <user_id> \
  --message "🎬 Downloaded: <title>" \
  --media /home/rami/.openclaw/workspace/_incoming/<filename>
```

**If file is over 50MB** — use LocalSend:
1. Notify user: "Video is <size> — too big for Telegram. Sending via LocalSend."
2. Start LocalSend send flow:
   ```bash
   localsend-cli send --to "<user_device>" /home/rami/.openclaw/workspace/_incoming/<filename>
   ```

**Buttons after send:**
```json
buttons: [
  [
    { "text": "🎬 Download Another", "callback_data": "dl:another" },
    { "text": "📱 Send via LocalSend", "callback_data": "dl:localsend" }
  ],
  [
    { "text": "🗑️ Delete File", "callback_data": "dl:delete" }
  ]
]
```

### Step 4 — Cleanup

After confirmed delivery, offer to delete the file to save disk space.

## Quality Options

Default is **best quality MP4**. If user asks for specific quality:

| Request | Flag |
|---------|------|
| "1080p" | `-f "bestvideo[height<=1080]+bestaudio/best[height<=1080]"` |
| "720p" | `-f "bestvideo[height<=720]+bestaudio/best[height<=720]"` |
| "audio only" / "mp3" | `-x --audio-format mp3` |
| "thumbnail" | `--write-thumbnail --skip-download` |

## Audio-Only Downloads

If user says "mp3", "audio only", "just the audio":

```bash
yt-dlp --js-runtimes nodejs \
  -x --audio-format mp3 \
  --output "/home/rami/.openclaw/workspace/_incoming/%(title).50s.%(ext)s" \
  "<URL>"
```

## Batch Downloads (Playlists)

If user sends a playlist URL and says "download all":

```bash
yt-dlp --js-runtimes nodejs \
  -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \
  --merge-output-format mp4 \
  --output "/home/rami/.openclaw/workspace/_incoming/%(title).50s.%(ext)s" \
  "<URL>"
```

Remove `--no-playlist` flag for playlists.

## Error Handling

| Error | Fix |
|-------|-----|
| "Video unavailable" | Private/deleted video — notify user |
| "Sign in to confirm" | Age-restricted — try with `--cookies-from-browser chrome` |
| Geographic restriction | Try with `--geo-bypass` |
| Rate limited | Wait 30s and retry once |
| Merge failed | Fallback to `-f best` (single stream) |

## Callback Reference

| callback_data | Action |
|---------------|--------|
| `dl:another` | Prompt for another URL |
| `dl:localsend` | Send last downloaded file via LocalSend |
| `dl:delete` | Delete the downloaded file |
| `dl:audio` | Re-download as MP3 |

## CLI Reference

| Command | Usage |
|---------|-------|
| Best quality | `yt-dlp -f "bestvideo+bestaudio/best" --merge-output-format mp4 URL` |
| Audio only | `yt-dlp -x --audio-format mp3 URL` |
| List formats | `yt-dlp -F URL` |
| Thumbnail | `yt-dlp --write-thumbnail --skip-download URL` |

