[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83230":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":34,"readmeContent":35,"aiSummary":9,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":36,"discoverSource":37},83230,"xiaoer-videolab","Jane-xiaoer\u002Fxiaoer-videolab","Jane-xiaoer","One click on the toolbar grabs the current page's video into ~\u002FDownloads — local yt-dlp daemon, 1800+ sites. 小耳抓视频：一键把当前页视频抓到本地。",null,"JavaScript",510,76,2,1,0,9,181,48,9.66,"MIT License",false,"main",true,[25,26,27,28,29,30,31,32,33],"bilibili","chrome-extension","launchd","macos","manifest-v3","privacy-friendly","video-downloader","youtube-dl","yt-dlp","2026-06-12 02:04:32","\u003Cdiv align=\"center\">\n\n# 🎬 Xiaoer VideoLab\n\n### One click. Any video. Local.\n\nPress one toolbar button and the video on the current page lands in your `~\u002FDownloads`.\nPowered by a tiny local [`yt-dlp`](https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp) daemon — **1800+ sites** out of the box\n(YouTube · Bilibili · X\u002FTwitter · TikTok · Vimeo · Twitch · Weibo …).\n\n[![CI](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab\u002Factions\u002Fworkflows\u002Fci.yml)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-black.svg)](LICENSE)\n![Platform](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-macOS%20%7C%20Windows-lightgrey)\n![Manifest V3](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FChrome-MV3-4285F4?logo=googlechrome&logoColor=white)\n![Python stdlib only](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPython-stdlib%20only-3776AB?logo=python&logoColor=white)\n![No tracking](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnetwork-localhost%20only-27ae60)\n\n[![English](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flang-English-2563eb)](README.md)&nbsp;\n[![简体中文](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flang-简体中文-lightgrey)](README.zh-CN.md)\n\n\u003C\u002Fdiv>\n\n---\n\n## 🙏 Thanks to our contributors \u002F 致谢贡献者\n\n**This project is better because of these people — thank you! \u002F 本项目因他们而更好,衷心感谢!**\n\n- [**@ttmouse**](https:\u002F\u002Fgithub.com\u002Fttmouse) — popup history panel, **cancel a stuck download**, play \u002F open-folder, one-click daemon start ([#4](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab\u002Fpull\u002F4))\n  \u003Cbr>弹出历史面板、**取消卡住的下载**、播放 \u002F 打开文件夹、一键启动服务\n- [**@jzq1212 (林以恒)**](https:\u002F\u002Fgithub.com\u002Fjzq1212) — **Windows support**: cross-platform daemon + PowerShell install scripts ([#1](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab\u002Fpull\u002F1))\n  \u003Cbr>**Windows 支持**:跨平台 daemon + PowerShell 安装脚本\n- [**@alick-zhang**](https:\u002F\u002Fgithub.com\u002Falick-zhang) — raised the Windows request that kicked it off ([#3](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab\u002Fissues\u002F3))\n  \u003Cbr>提出 Windows 需求,促成了上面的 Windows 支持\n\n> Issues & PRs welcome — your name goes here too. \u002F 欢迎提 issue 和 PR,你的名字也会出现在这里。\n\n---\n\n## Why\n\nBrowser video downloaders are a swamp of sketchy extensions that beg for \"read everything on every site\"\npermissions and phone home. Xiaoer VideoLab takes the opposite bet:\n\n- **The extension does almost nothing.** It only reads the *current tab's URL* when you click it, and POSTs\n  that one string to `127.0.0.1`. No page scraping, no content scripts, no remote servers.\n- **The download happens locally.** A small Python daemon hands the URL to `yt-dlp`, the\n  battle-tested open-source downloader. All the smarts live in a tool you can audit.\n- **Nothing leaves your machine** except the request `yt-dlp` makes to fetch the video you asked for.\n\n## How it works\n\n```\n ┌─────────────────────┐   click    ┌──────────────────────────┐         ┌──────────┐\n │  Browser toolbar     │ ─────────► │  daemon @ 127.0.0.1:7788 │ ──────► │  yt-dlp  │ ──► ~\u002FDownloads\n │  (Chrome MV3 ext.)   │  POST url  │  (Python stdlib, launchd)│  spawn  └──────────┘        │\n └─────────────────────┘            └──────────────────────────┘                              ▼\n        ▲   badge: … ✓ ✕ !                       │                                   macOS notification\n        └───────────────────────────────────────┘                                     \"✅ \u003Cfilename>\"\n```\n\n- **daemon** — Python standard-library `http.server`, listens on `127.0.0.1:7788`, started at login by `launchd`.\n- **extension** — Chrome MV3, a single toolbar button, grabs `tab.url` and POSTs it to the daemon.\n- **output** — `~\u002FDownloads\u002F\u003Cplatform>_\u003Ctitle>_\u003Cdate>.mp4` (≤1080p mp4 by default; configurable).\n- **log** — `~\u002FLibrary\u002FLogs\u002Fxiaoer-videolab.log`\n\n## ✅ What you can download\n\nPowered by yt-dlp's **1872 extractors** — most video sites work. A practical map:\n\n| | Sites |\n|---|---|\n| **✅ Tested & confirmed** | **YouTube · Vimeo · Bilibili (B站) · Douyin (抖音) · Xiaohongshu (小红书)** |\n| **✅ Supported** (yt-dlp extractor, same path) | X\u002FTwitter · Ixigua (西瓜) · Instagram · Reddit · Dailymotion · Facebook · TikTok\\* · …and ~1860 more |\n| **⚠️ Free content only** | Youku (优酷) · iQiyi (爱奇艺) — VIP \u002F DRM-protected episodes can't be downloaded |\n| **🚫 Not recommended** | **Weibo (微博) · Zhihu (知乎)** — see note below |\n| **❌ Not supported** | Kuaishou (快手) & Tencent Video (腾讯视频) — no extractor; **WeChat Channels (视频号)** — in-app & encrypted |\n\n> 🚫 **Weibo \u002F Zhihu — not recommended.** Their web pages are combined SPA feeds (much like TikTok): the video is just one small part of a big page, and you usually **can't open a single video on its own URL**. With no clean per-video address to grab, the button has nothing reliable to work with — so we suggest skipping them.\n>\n> \\* **TikTok \u002F overseas sites** need a network that can reach them (a proxy in mainland China; note some datacenter IPs are blocked by TikTok's API).\n>\n> 🎯 **视频号 \u002F 快手 \u002F 小程序 \u002F 直播流?** Those live inside apps and need packet-sniffing — use [**res-downloader**](https:\u002F\u002Fgithub.com\u002Fputyy\u002Fres-downloader) for them. This tool focuses on the yt-dlp universe.\n\n> **抖音 & 小红书** use a special in-page grabber (yt-dlp can't read them), so click the button **while the video is open\u002Fplaying** on the page.\n\nNotes: 平台 (platform) and 标题 (title) are auto-detected for the filename; 日期 (date) is the download day.\n\n## TL;DR (if you've done this before)\n\n```bash\nbrew install yt-dlp ffmpeg\ngit clone https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab.git\ncd xiaoer-videolab && .\u002Fscripts\u002Finstall.sh\n# then load extension\u002F as an unpacked extension at chrome:\u002F\u002Fextensions\u002F\n```\n\n---\n\n## Installation — step by step\n\nFirst time? Follow every step below. It takes about 5 minutes and you only do it once.\n\n### What you need\n\n- **macOS** (background service via `launchd`) **or Windows 10\u002F11** (via Task Scheduler).\n- A Chromium-based browser — Chrome, Arc, Edge, Brave, or Dia.\n- About 5 minutes.\n\n> **On Windows?** Parts A & B below are for macOS. Jump to **[🪟 On Windows](#-on-windows-do-this-instead-of-parts-a--b)**, then come back for Part C.\n\nYou do **not** need to know how to code. You will copy-paste a few commands.\n\n### Part A · Install the engine (one-time)\n\nThis tool is a friendly button in front of [`yt-dlp`](https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp), the open-source\ndownloader that does the real work. So you install that first.\n\n**A1.** Open the **Terminal** app. (Press `⌘ Space`, type `Terminal`, hit Enter.)\n\n\u003C!-- 截图位: docs\u002Fimages\u002F01-terminal.png -->\n\n**A2.** Install **Homebrew** (a package manager for Mac). If you already have it, skip to A3.\nPaste this into Terminal and press Enter, then follow its prompts:\n\n```bash\n\u002Fbin\u002Fbash -c \"$(curl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FHomebrew\u002Finstall\u002FHEAD\u002Finstall.sh)\"\n```\n\n**A3.** Install `yt-dlp` and `ffmpeg`:\n\n```bash\nbrew install yt-dlp ffmpeg\n```\n\n> `ffmpeg` matters — without it some sites give you audio-only or low quality, because the video and\n> audio come as separate streams that `ffmpeg` merges back together.\n\n### Part B · Install Xiaoer VideoLab\n\n**B1.** Still in Terminal, paste these three lines:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab.git\ncd xiaoer-videolab\n.\u002Fscripts\u002Finstall.sh\n```\n\n**B2.** When it works, the last lines you see will look like this:\n\n```\n✓ Daemon running at http:\u002F\u002F127.0.0.1:7788\n  Log: ~\u002FLibrary\u002FLogs\u002Fxiaoer-videolab.log\n\nNext: load the browser extension\n  1. Open chrome:\u002F\u002Fextensions\u002F\n  ...\n```\n\n\u003C!-- 截图位: docs\u002Fimages\u002F02-install-success.png -->\n\nThat means the background downloader is installed and will start automatically every time you log in.\nYou never touch the Terminal again.\n\n### 🪟 On Windows? (do this instead of Parts A & B)\n\nThe browser steps (Part C & D) are identical on every OS — only the engine + service install differs.\n\n**W1.** Install the engine. Open **PowerShell** and run (uses [winget](https:\u002F\u002Faka.ms\u002Fgetwinget), built into Win 10\u002F11):\n\n```powershell\nwinget install Python.Python.3.11 yt-dlp.yt-dlp ffmpeg\n```\n\n**W2.** Install Xiaoer VideoLab. Either grab the code with the green **Code → Download ZIP** button (then unzip), or in PowerShell:\n\n```powershell\ngit clone https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-videolab.git\ncd xiaoer-videolab\npowershell -ExecutionPolicy Bypass -File scripts\\install.ps1\n```\n\nThe installer registers a **login-start task** and asks which browser to pull cookies from (`edge`\u002F`chrome`).\nTo uninstall later: `powershell -ExecutionPolicy Bypass -File scripts\\uninstall.ps1`.\n\nNow continue with **Part C** below — loading the toolbar button is the same everywhere.\n\n### Part C · Add the toolbar button\n\nThe browser button isn't on the Chrome Web Store (yet), so you load it manually. This is normal and safe.\n\n> The screenshot below marks every step in this part (labels are in Chinese, but the red arrows\n> point at exactly the right buttons): **① open the address · ② turn on Developer mode ·\n> ③ click \"Load unpacked\" · ④ flip the extension's switch on.**\n\n![Four steps to load the extension: open the address, enable Developer mode, Load unpacked, toggle on](docs\u002Fimages\u002Fload-extension-steps.png)\n\n**C1.** Open a new browser tab and go to: `chrome:\u002F\u002Fextensions\u002F`\n(On Edge it's `edge:\u002F\u002Fextensions\u002F`, on Arc\u002FBrave the same `chrome:\u002F\u002Fextensions\u002F`.)\n\n**C2.** Turn on **Developer mode** — the switch in the **top-right** corner.\n\n\u003C!-- 截图位: docs\u002Fimages\u002F03-developer-mode.png -->\n\n**C3.** Click the **Load unpacked** button (top-left). A folder picker opens.\n\n\u003C!-- 截图位: docs\u002Fimages\u002F04-load-unpacked.png -->\n\n**C4.** Navigate to where you cloned the repo and select the **`extension`** folder inside it\n(e.g. `xiaoer-videolab\u002Fextension`). Click **Select**.\n\nA card titled **Xiaoer VideoLab** now appears in your extensions list.\n\n\u003C!-- 截图位: docs\u002Fimages\u002F05-extension-card.png -->\n\n**C5.** Click the **puzzle-piece icon** in your toolbar, find **Xiaoer VideoLab**, and click the **pin**\nso its icon stays on the toolbar.\n\n\u003C!-- 截图位: docs\u002Fimages\u002F06-pin-toolbar.png -->\n\n### Part D · Download your first video\n\n**D1.** Open any video page (YouTube, Bilibili, X, TikTok …).\n\n**D2.** Click the **Xiaoer VideoLab** icon in your toolbar.\n\n\u003C!-- 截图位: docs\u002Fimages\u002F07-click-button.png -->\n\n**D3.** You'll get a **\"Downloading…\"** notification, then a **\"✅ &lt;filename&gt;\"** notification when it's done.\nThe icon also shows a little badge:\n\n| Badge | Meaning |\n|:---:|---|\n| `…` | request sent, downloading |\n| `✓` | daemon accepted the job (download continues in the background) |\n| `✕` | can't reach the daemon |\n| `!` | daemon returned an error (check the notification \u002F log) |\n\n\u003C!-- 截图位: docs\u002Fimages\u002F08-notification.png -->\n\n**D4.** Find your video in the **`~\u002FDownloads`** folder. 🎉\n\n\u003C!-- 截图位: docs\u002Fimages\u002F09-downloads-folder.png -->\n\nThat's it — from now on it's just **open a video → click the button**.\n\n## Configuration\n\nAll optional — set them and re-run `.\u002Fscripts\u002Finstall.sh` to bake them into the service:\n\n| Variable | Default | What it does |\n|---|---|---|\n| `VIDEOLAB_PORT` | `7788` | daemon port — ⚠️ if you change it, also edit `extension\u002Fbackground.js` (`DAEMON`) **and** `extension\u002Fmanifest.json` (`host_permissions`) to the same port, or the button can't reach the daemon |\n| `VIDEOLAB_DOWNLOADS` | `~\u002FDownloads` | where files land |\n| `VIDEOLAB_YT_DLP` | auto-detect | path to the `yt-dlp` binary (auto-detect prefers a `yt-dlp-nightly` build if one is installed — see FAQ on `HTTP Error 412`) |\n| `VIDEOLAB_PREFIX` | _(none)_ | filename prefix, e.g. `小耳-` |\n| `VIDEOLAB_MAX_HEIGHT` | `1080` | max video height (set `2160` for 4K) |\n| `VIDEOLAB_COOKIES_BROWSER` | _(off)_ | pull cookies from a browser (`chrome`\u002F`brave`\u002F`firefox`\u002F`edge`\u002F`safari`) for **login-gated \u002F private** videos |\n| `VIDEOLAB_APP_NAME` | `Xiaoer VideoLab` | name in notifications |\n\n```bash\n# example: 4K, pull login cookies from Chrome, brand the filenames\nVIDEOLAB_MAX_HEIGHT=2160 VIDEOLAB_COOKIES_BROWSER=chrome VIDEOLAB_PREFIX=\"小耳-\" .\u002Fscripts\u002Finstall.sh\n```\n\n## Commands\n\n```bash\n# is the daemon alive?\ncurl http:\u002F\u002F127.0.0.1:7788\u002Fhealth\n\n# tail the log\ntail -f ~\u002FLibrary\u002FLogs\u002Fxiaoer-videolab.log\n\n# restart the daemon\nlaunchctl unload ~\u002FLibrary\u002FLaunchAgents\u002Fcom.xiaoer.videolab.plist\nlaunchctl load   ~\u002FLibrary\u002FLaunchAgents\u002Fcom.xiaoer.videolab.plist\n\n# download without the extension\ncurl -X POST http:\u002F\u002F127.0.0.1:7788\u002Fdownload \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\"url\":\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=dQw4w9WgXcQ\"}'\n\n# update everything (latest code + newest yt-dlp engine), keeping your settings\n.\u002Fscripts\u002Fupdate.sh\n\n# uninstall the service\n.\u002Fscripts\u002Funinstall.sh\n```\n\n> 🔄 **The yt-dlp engine auto-updates weekly** (a `launchd` job, Sundays ~4am — log: `~\u002FLibrary\u002FLogs\u002Fxiaoer-videolab-ytdlp-update.log`), so fast-moving sites keep working without you doing anything. Run `bash scripts\u002Fauto-update-ytdlp.sh` any time to update it now. (Code updates to VideoLab itself stay manual via `.\u002Fscripts\u002Fupdate.sh`.)\n\n## Security\n\n- The daemon binds to `127.0.0.1` only — it is not reachable from your network.\n- **No drive-by downloads.** `\u002Fdownload` rejects any request carrying an `http(s)` `Origin` header,\n  so a malicious web page's JavaScript cannot make the daemon download files behind your back. The\n  extension (`chrome-extension:\u002F\u002F`) and command-line calls (no Origin) are allowed.\n- The extension's only host permission is `http:\u002F\u002F127.0.0.1:7788\u002F*`. It reads only the current tab's\n  URL when you click — no page content, no content scripts.\n- If you also want to block *other local processes*, add a shared `X-Token` header check in `daemon\u002Fserver.py`.\n\n## FAQ\n\n**It says \"can't reach the daemon\" (`✕`).** Run `curl http:\u002F\u002F127.0.0.1:7788\u002Fhealth`. If that fails,\ncheck `tail ~\u002FLibrary\u002FLogs\u002Fxiaoer-videolab.err.log` and confirm `yt-dlp` is installed.\n\n**A video downloads at low quality \u002F audio only.** Some sites split streams; make sure `ffmpeg` is\ninstalled so `yt-dlp` can merge them.\n\n**A private \u002F members-only video fails.** Set `VIDEOLAB_COOKIES_BROWSER` to the browser where you're\nlogged in, then re-install.\n\n**A site that used to work now fails — Bilibili returns `HTTP Error 412`, or a site throws extractor\nerrors.** The site tightened its anti-bot defenses and your `yt-dlp` is older than the fix. Update it\nfirst (`yt-dlp --update`, or `brew upgrade yt-dlp`). Stable releases can lag days-to-weeks behind\nfast-moving sites like Bilibili — if updating stable isn't enough, install the **nightly** build, which\nVideoLab auto-detects and prefers over stable:\n\n```bash\n# self-contained nightly binary (macOS) — VideoLab picks it up automatically, no config needed\nmkdir -p ~\u002F.local\u002Fbin\ncurl -L -o ~\u002F.local\u002Fbin\u002Fyt-dlp-nightly \\\n  https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp-nightly-builds\u002Freleases\u002Flatest\u002Fdownload\u002Fyt-dlp_macos\nchmod +x ~\u002F.local\u002Fbin\u002Fyt-dlp-nightly\n# update it any time it falls behind again:\n~\u002F.local\u002Fbin\u002Fyt-dlp-nightly --update-to nightly\n```\n\n**Not on macOS?** The extension is cross-platform; the *installer* is macOS-only. On Linux\u002FWindows just\nrun `python3 daemon\u002Fserver.py` yourself (any process manager works).\n\n## Contributing\n\nIssues and PRs welcome. The whole thing is ~400 lines of stdlib Python + vanilla JS — easy to read,\neasy to fork. If you add support for a workflow you care about (a new format profile, a Firefox\nmanifest, a Linux service file), send it over.\n\n## Author\n\n**Jane** · 小耳 \u002F Xiaoer — *a family of little tools that listen, read, find, and organize.*\n\n- GitHub: [@Jane-xiaoer](https:\u002F\u002Fgithub.com\u002FJane-xiaoer)\n- Email: xiaoerzhan@gmail.com\n\nPart of the **Xiaoer** toolbox, alongside\n[Xiaoer Ask](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fxiaoer-ask) and\n[Smart Rename](https:\u002F\u002Fgithub.com\u002FJane-xiaoer\u002Fsmart-rename).\n\n## 📱 关注作者 \u002F Follow Me\n\n如果这个仓库对你有帮助，欢迎关注我。后面我会持续更新更多 AI Skill、做网站、自动化工作流和创意项目。\n\nIf this repo helped you, follow me for more AI skills, website building, automation workflows, and creative projects.\n\n- X (Twitter): [@xiaoerzhan](https:\u002F\u002Fx.com\u002Fxiaoerzhan)\n- 微信公众号 \u002F WeChat Official Account: 扫码关注 \u002F Scan to follow\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\".\u002Ffollow-wechat-qrcode.jpg\" alt=\"Jane WeChat Official Account QR code\" width=\"300\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Cstrong>中文：\u003C\u002Fstrong>欢迎关注我的公众号，一起研究 AI Skill、网站搭建、自动化流程和创意实验。\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Cstrong>English:\u003C\u002Fstrong> Follow my WeChat Official Account for more AI skills, website building, automation workflows, and creative experiments.\u003C\u002Fp>\n\n## Acknowledgements\n\nStanding entirely on the shoulders of [**yt-dlp**](https:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp) — this project is\njust a friendly one-click button in front of it. Please support and respect the yt-dlp project.\n\n## License\n\n[MIT](LICENSE) © 2026 Jane (小耳 \u002F Xiaoer)\n\n> Download only content you have the right to download. You are responsible for respecting the terms of\n> service of the sites you use this on, and applicable copyright law.\n","2026-06-11 04:10:29","CREATED_QUERY"]