One-click downloader for images and videos from any webpage
Enhanced support for WeChat Official Account articles
简体中文 | English
- Automatically detect all images on the page
- Support lazy-loaded images (
data-src,data-original, etc.) - Extract content from
<canvas>elements - Smart filtering for WeChat articles (excludes avatars, QR codes, etc.)
- Double-click to preview images in a new tab
| Layer | Method | Coverage |
|---|---|---|
| DOM Detection | video tags, source elements, data attributes, structured data (ld+json), meta tags (og:video), player containers (video.js, etc.) |
Static video elements |
| Network Interception | Hook fetch() and XMLHttpRequest, PerformanceObserver monitoring, performance.getEntriesByType('resource') |
Dynamically loaded videos |
| Blob URL Recognition | Detect blob: URLs generated by MSE (Media Source Extensions), support MediaRecorder + captureStream() capture |
Streamed / encrypted videos |
| Label | Color | Description |
|---|---|---|
| Stream | Orange | HLS/DASH streaming video (m3u8/mpd) |
| Record | Blue | Blob URL video (MSE) |
| Network | Green | Video detected via network interception |
| Format | Detection | Download |
|---|---|---|
| MP4 | Yes | Direct download |
| WebM | Yes | Direct download |
| MKV / AVI / MOV | Yes | Direct download |
| FLV | Yes | Direct download |
| HLS (m3u8) | Yes | Auto-parse segments and merge to MP4 |
| DASH (mpd) | Yes | External tool required |
| Blob URL (MSE) | Yes | Recording / capture required |
| TS / M4S segments | Yes | Auto-concatenate |
| Canvas PNG | Yes | Direct export |
- Single file: Direct download
- Multiple files: Auto-packaged as ZIP archive
- Select All: One-click selection of all media
- Right-click menu: Quick download any image on the page
- View article metadata: title, author, description, cover image
- Optimized content extraction from article body
- One-click access to article URL
- WeChat Official Account Articles
- yaolifeng.com
- Juejin (掘金)
- Zhihu (知乎)
- InfoQ
- Jianshu (简书)
- Aliyun (阿里云)
- Tencent Cloud (腾讯云)
- CSDN
- Cnblogs (博客园)
- 51CTO
- Sina Weibo (新浪微博)
- Douban (豆瓣)
- Bilibili (哔哩哔哩)
- Weibo (微博)
- SegmentFault (思否)
- Toutiao (今日头条)
- Any other webpage (universal detection)
- Plasmo — Browser extension framework
- React 18 — UI library
- TypeScript — Type safety
- Tailwind CSS — Styling
- Zustand — State management
- i18next — Internationalization
- JSZip — ZIP archive creation
- FileSaver.js — File downloads
- Lucide React — Icons
- Radix UI — Accessible UI primitives
- mux.js — Video transmuxing (TS to MP4)
Coming soon.
Prerequisites: Node.js 18+ and pnpm
# Clone the repository
git clone https://github.com/yaolifeng0629/PickPic.git
cd PickPic
# Install dependencies
pnpm install
# Start development server
pnpm devThen load the extension in Chrome:
- Open
chrome://extensions/ - Enable Developer mode (toggle in the top right)
- Click Load unpacked
- Select the
build/chrome-mv3-devdirectory
# Build for production
pnpm build
# Package as ZIP for distribution
pnpm packageThe production bundle will be created in build/chrome-mv3-prod.
- Navigate to any webpage — PickPic works on all websites
- Open the extension — Click the PickPic icon in your browser toolbar
- View extracted content — All images, videos, and canvases are displayed in the side panel
- For WeChat articles — Click the Detail button to view article metadata
- Select items — Click to select (multi-select supported)
- Preview images — Double-click any image to open it in a new tab
- Download:
- Download Selected: Single item downloads directly; multiple items are packaged as ZIP
- Download All: Creates a ZIP archive with all content
- Refresh — Click the refresh button to re-scan the page for new content
Right-click on any image and select "Download this image" for instant download without opening the side panel.
| Permission | Purpose |
|---|---|
activeTab |
Access the current webpage to extract media |
storage |
Save user preferences (language, settings) |
downloads |
Download images, videos, and ZIP files |
sidePanel |
Display the extension interface in the browser side panel |
contextMenus |
Add right-click menu options for quick downloads |
<all_urls> |
Work on any website (media is only extracted when you click the extension icon) |
PickPic does not collect, store, or transmit any personal data. All processing happens locally in your browser. See PRIVACY.md for details.
-
DASH (mpd): Browser cannot directly download mpd format. Use FFmpeg or similar tools:
ffmpeg -i "https://example.com/video.mpd" -c copy output.mp4 -
Blob URL (MSE): Requires the video to be playing for recording. Output format is WebM.
-
DRM-protected content: Videos protected by Widevine, FairPlay, or PlayReady cannot be downloaded.
PickPic/
├── assets/ # Extension icons and images
├── background.ts # Service worker
├── sidepanel.tsx # Side panel entry point
├── contents/ # Content scripts
│ ├── extractor.ts # Main extraction orchestrator
│ └── extractors/
│ ├── article-extractor.ts # WeChat article metadata
│ ├── network-interceptor.ts # Network request interception
│ └── video-extractor.ts # Video detection logic
├── components/
│ ├── sidepanel/ # Side panel UI components
│ ├── settings/ # Settings page tabs
│ └── ui/ # Reusable UI primitives
├── hooks/ # Custom React hooks
├── lib/ # Utility functions
│ ├── canvas-extractor.ts # Canvas element extraction
│ ├── image-extractor.ts # Image detection
│ ├── image-downloader.ts # Download queue and logic
│ ├── hls-utils.ts # HLS playlist utilities
│ ├── zip-utils.ts # ZIP packaging
│ └── video/ # Video download modules
│ ├── hls-downloader.ts # HLS to MP4 downloader
│ ├── blob-downloader.ts # Blob URL downloader
│ ├── mse-transmuxer.ts # TS to MP4 transmuxer
│ └── video-format-utils.ts
├── store/ # Zustand state stores
├── types/ # TypeScript type definitions
├── locales/ # i18n translation files
│ ├── en/ # English
│ └── zh-CN/ # Simplified Chinese
└── config/
└── i18n.ts # i18n configuration
| Command | Description |
|---|---|
pnpm dev |
Start development server with hot reload |
pnpm build |
Create production build |
pnpm package |
Package extension as ZIP for distribution |
pnpm lint |
Run ESLint |
pnpm lint:fix |
Run ESLint with auto-fix |
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch:
git checkout -b feature/AmazingFeature - Commit your changes:
git commit -m 'Add some AmazingFeature' - Push to the branch:
git push origin feature/AmazingFeature - Open a Pull Request
Immerse
- Website: yaolifeng.com
- GitHub: @yaolifeng0629
- Email: dev@yaolifeng.com
Made with care by Immerse
