Installable skillMIT

Bilibili All-in-One Skill

A comprehensive Bilibili toolkit that integrates hot trending monitoring, video downloading, video watching/playback, subtitle downloading, and video publishing capabilities into a single unified skill. Supports Bilibili session cookie authentication for publishing and high-quality downloads. Req...

BY aibot88UPDATED Oct 27, 2026
INTENDED FORโ—ˆOpenClawInstall in a listed agent.

instructions.md

---
name: bilibili-all-in-one
description: >
  A comprehensive Bilibili toolkit that integrates hot trending monitoring,
  video downloading, video watching/playback, subtitle downloading,
  and video publishing capabilities into a single unified skill.
  Supports Bilibili session cookie authentication for publishing and
  high-quality downloads. Requests go to official Bilibili API endpoints
  over HTTPS.
version: 1.0.18
type: code
implementation: python
interface: cli-and-api
runtime: python>=3.8
languages:
  - zh-CN
  - en
tags:
  - bilibili
  - video-download
  - hot-trending
  - subtitle
  - danmaku
  - video-publish
  - video-player

  - batch-download
  - multi-format
author: wscats
license: MIT
homepage: https://github.com/wscats/bilibili-all-in-one
repository: https://github.com/wscats/bilibili-all-in-one
entry_point: main.py
required_env_vars: []
optional_env_vars:
  - BILIBILI_SESSDATA
  - BILIBILI_BILI_JCT
  - BILIBILI_BUVID3
  - BILIBILI_PERSIST
install: pip install -r requirements.txt
---

# Bilibili All-in-One Skill

A comprehensive Bilibili toolkit that integrates hot trending monitoring, video downloading, video watching/playback, subtitle downloading, and video publishing capabilities into a single unified skill.

> **โš ๏ธ Optional Environment Variables:** `BILIBILI_SESSDATA`, `BILIBILI_BILI_JCT` (optional), `BILIBILI_BUVID3` (optional), `BILIBILI_PERSIST` (optional)
> These are sensitive Bilibili session cookies needed **only** for publishing and high-quality (1080p+/4K) downloads.
> **Most features work WITHOUT any credentials:** hot monitoring, standard-quality downloads, subtitle listing, danmaku, stats viewing.
>
> **๐Ÿ“ฆ Install:** `pip install -r requirements.txt` (all standard PyPI packages: httpx, aiohttp, beautifulsoup4, lxml, requests)
>
> **๐Ÿ”— Source:** [github.com/wscats/bilibili-all-in-one](https://github.com/wscats/bilibili-all-in-one)

---
### ไฝ•ๆ—ถๆฟ€ๆดป

ๅฝ“็”จๆˆท**ๆ˜Ž็กฎ่ฏทๆฑ‚**ไปฅไธ‹ Bilibili ็›ธๅ…ณๆ“ไฝœๆ—ถ๏ผŒๆœฌ Skill ๅฏ่ขซๆฟ€ๆดป๏ผš

| ่งฆๅ‘ๅœบๆ™ฏ | ๅŒน้…็š„ๆจกๅ— | ๅ…ธๅž‹่งฆๅ‘่ฏ |
|---|---|---|
| ๆŸฅ็œ‹B็ซ™็ƒญ้—จใ€็ƒญๆœใ€ๆŽ’่กŒๆฆœใ€ๅฟ…็œ‹ๆฆœ | ๐Ÿ”ฅ Hot Monitor | "็ƒญ้—จ"ใ€"็ƒญๆœ"ใ€"ๆŽ’่กŒ"ใ€"่ถ‹ๅŠฟ"ใ€"ๅฟ…็œ‹"ใ€"ๆต่กŒ"ใ€"ๆฆœๅ•" |
| ไธ‹่ฝฝB็ซ™่ง†้ข‘ใ€ๆๅ–้Ÿณ้ข‘ใ€ๆ‰น้‡ไธ‹่ฝฝ | โฌ‡๏ธ Downloader | "ไธ‹่ฝฝ"ใ€"ไฟๅญ˜่ง†้ข‘"ใ€"ๆๅ–้Ÿณ้ข‘"ใ€"ๅฏผๅ‡บMP4"ใ€"ๆ‰น้‡ไธ‹่ฝฝ" |
| ๆŸฅ็œ‹่ง†้ข‘ๆ’ญๆ”พ้‡ใ€็‚น่ตžๆ•ฐใ€ๆ•ฐๆฎ่ฟฝ่ธชใ€ๅฏนๆฏ” | ๐Ÿ‘€ Watcher | "ๆ’ญๆ”พ้‡"ใ€"็‚น่ตž"ใ€"ๆ•ฐๆฎ"ใ€"็ปŸ่ฎก"ใ€"ๅฏนๆฏ”"ใ€"็›‘ๆŽง"ใ€"่ฟฝ่ธช"ใ€"่ง‚็œ‹้‡" |
| ไธ‹่ฝฝๅญ—ๅน•ใ€่ฝฌๆขๅญ—ๅน•ๆ ผๅผใ€ๅˆๅนถๅญ—ๅน• | ๐Ÿ“ Subtitle | "ๅญ—ๅน•"ใ€"CC"ใ€"SRT"ใ€"ASS"ใ€"ๅญ—ๅน•ไธ‹่ฝฝ"ใ€"ๅญ—ๅน•่ฝฌๆข"ใ€"็ฟป่ฏ‘" |
| ๆ’ญๆ”พ่ง†้ข‘ใ€่Žทๅ–ๅผนๅน•ใ€ๆ’ญๆ”พๅˆ—่กจ | โ–ถ๏ธ Player | "ๆ’ญๆ”พ"ใ€"ๅผนๅน•"ใ€"ๆ’ญๆ”พๅœฐๅ€"ใ€"ๅˆ†P"ใ€"ๆ’ญๆ”พๅˆ—่กจ"ใ€"danmaku" |
| ไธŠไผ ่ง†้ข‘ใ€ๅ‘ๅธƒใ€ๅฎšๆ—ถๅ‘ๅธƒใ€่‰็จฟใ€็ผ–่พ‘ | ๐Ÿ“ค Publisher | "ไธŠไผ "ใ€"ๅ‘ๅธƒ"ใ€"ๆŠ•็จฟ"ใ€"ๅฎšๆ—ถๅ‘ๅธƒ"ใ€"่‰็จฟ"ใ€"็ผ–่พ‘่ง†้ข‘" |

> โš ๏ธ **ๆณจๆ„**๏ผšๆœฌ Skill ไธไผšไป…ๅ› ๆถˆๆฏไธญๅ‡บ็Žฐ Bilibili ้“พๆŽฅๆˆ– BV ๅทๅฐฑ่‡ชๅŠจๆฟ€ๆดปใ€‚ๅชๆœ‰ๅฝ“็”จๆˆทๆ˜Ž็กฎ่กจ่พพไบ†ๆ“ไฝœๆ„ๅ›พ๏ผˆๅฆ‚"ไธ‹่ฝฝ่ฟ™ไธช่ง†้ข‘"ใ€"ๆŸฅ็œ‹็ƒญ้—จ"็ญ‰๏ผ‰ๆ—ถๆ‰ไผš่ขซ่ฐƒ็”จใ€‚ๆถ‰ๅŠๅ†™ๆ“ไฝœ๏ผˆๅ‘ๅธƒ/็ผ–่พ‘๏ผ‰ๆ—ถ๏ผŒ้œ€่ฆ็”จๆˆทๆ˜พๅผๆไพ›ๅ‡ญ่ฏใ€‚

---

## Features
| Module | Description |
|---|---|
| ๐Ÿ”ฅ **Hot Monitor** | Monitor Bilibili hot/trending videos and topics in real-time |
| โฌ‡๏ธ **Downloader** | Download Bilibili videos with multiple quality and format options |
| ๐Ÿ‘€ **Watcher** | Watch and track video engagement metrics (supports Bilibili) |
| ๐Ÿ“ **Subtitle** | Download and process subtitles in multiple formats and languages |
| โ–ถ๏ธ **Player** | Get playback URLs, danmaku (bullet comments), and playlist info |
| ๐Ÿ“ค **Publisher** | Upload, schedule, edit, and manage videos on Bilibili |

## Installation

### Requirements

- Python >= 3.8
- ffmpeg (optional, for merging video/audio streams)

### Install Dependencies

```bash
pip install -r requirements.txt
```

### Dependencies

- `httpx >= 0.24.0`
- `aiohttp >= 3.8.0`
- `beautifulsoup4 >= 4.12.0`
- `lxml >= 4.9.0`
- `requests >= 2.31.0`
- `faster-whisper >= 1.0.0` *(optional, for speech recognition subtitle fallback)*

## Configuration

Some features (downloading high-quality videos, publishing, etc.) require Bilibili authentication. You can provide credentials in three ways:

### 1. Environment Variables

```bash
export BILIBILI_SESSDATA="your_sessdata"
export BILIBILI_BILI_JCT="your_bili_jct"
export BILIBILI_BUVID3="your_buvid3"
```

### 2. Credential File

Create a JSON file (e.g., `credentials.json`):

```json
{
  "sessdata": "your_sessdata",
  "bili_jct": "your_bili_jct",
  "buvid3": "your_buvid3"
}
```

### 3. Direct Parameters

Pass credentials directly when initializing:

```python
from main import BilibiliAllInOne

app = BilibiliAllInOne(
    sessdata="your_sessdata",
    bili_jct="your_bili_jct",
    buvid3="your_buvid3",
)
```

### 4. Persistent Storage (Optional)

By default, credentials are kept **in-memory only** and are not saved to disk. To enable automatic persistence across sessions:

```bash
# Via environment variable
export BILIBILI_PERSIST=1
```

```python
# Or via code
app = BilibiliAllInOne(persist=True)
```

When persistence is enabled:
- Credentials are auto-saved to `.credentials.json` (with `0600` permissions) after initialization
- On next startup, credentials are auto-loaded from this file
- You can toggle persistence at runtime: `app.auth.persist = True` / `app.auth.persist = False`
- To delete the persisted file: `app.auth.clear_persisted()`

> **How to get cookies:** Log in to [bilibili.com](https://www.bilibili.com), open browser DevTools (F12) โ†’ Application โ†’ Cookies, and copy the values of `SESSDATA`, `bili_jct`, and `buvid3`.

## โš ๏ธ Security & Privacy

### Credential Handling

This skill handles **sensitive Bilibili session cookies**. Please read the following carefully:

| Concern | Detail |
|---|---|
| **What credentials are needed?** | `SESSDATA`, `bili_jct`, `buvid3` โ€” Bilibili **full browser session cookies** (not limited API keys). Providing them grants broad access to your Bilibili account. |
| **Which features require authentication?** | Publishing (upload/edit/schedule/draft), downloading 1080p+/4K quality videos |
| **Which features work WITHOUT credentials?** | Hot monitoring, standard-quality downloads, subtitle listing, danmaku fetching, stats viewing |
| **Where are credentials sent?** | To official Bilibili API endpoints (`api.bilibili.com`, `member.bilibili.com`) over HTTPS only |
| **Are credentials persisted to disk?** | **NO** by default โ€” credentials stay in memory. Set `persist=True` or `BILIBILI_PERSIST=1` to opt-in to automatic persistence (saved to `.credentials.json` with `0600` permissions). You can also manually call `auth.save_to_file()` |
| **File permissions for saved credentials** | `0600` (owner read/write only) โ€” restrictive by default |

### Best Practices

1. ๐Ÿงช **Use a test account** โ€” Do NOT provide your primary Bilibili account cookies for evaluation/testing purposes. These are **full session cookies** that grant broad account access (not limited API keys).
2. ๐Ÿ”’ **Prefer in-memory credentials** โ€” Pass credentials via environment variables or direct parameters rather than saving to a file. Only enable `persist=True` if you need credentials to survive across sessions.
3. ๐Ÿ“ **If you enable persistence** โ€” Credentials are saved with `0600` permissions. Use `auth.clear_persisted()` or `auth.persist = False` to remove the file when no longer needed.
4. ๐Ÿณ **Run in isolation** โ€” When possible, run this skill in an isolated container/environment and inspect network traffic.
5. ๐ŸŒ **Verify network traffic** โ€” All HTTP requests go to Bilibili's official domains only. You can verify by monitoring outbound connections.
6. โŒ **No exfiltration** โ€” This skill does NOT send credentials to any third-party service, analytics endpoint, or telemetry server.
7. ๐Ÿ”‘ **Credential scope** โ€” `SESSDATA` and `bili_jct` are full session cookies. They are NOT scoped/limited API keys. Treat them with the same care as your account password.

### Network Endpoints Used

| Domain | Purpose |
|---|---|
| `api.bilibili.com` | Video info, stats, hot lists, subtitles, danmaku, playback URLs |
| `member.bilibili.com` | Video publishing (upload, edit) |
| `upos-sz-upcdnbda2.bilivideo.com` | Video file upload CDN |
| `www.bilibili.com` | Web page scraping fallback |

### Credential Requirement by Module

| Module | Auth Required? | Notes |
|---|---|---|
| ๐Ÿ”ฅ Hot Monitor | โŒ No | All public APIs |
| โฌ‡๏ธ Downloader | โš ๏ธ Optional | Required only for 1080p+ / 4K quality |
| ๐Ÿ‘€ Watcher | โŒ No | Public stats APIs |
| ๐Ÿ“ Subtitle | โŒ No | Public subtitle APIs |
| โ–ถ๏ธ Player | โš ๏ธ Optional | Required for high-quality playback URLs |
| ๐Ÿ“ค Publisher | โœ… **Required** | All operations need `SESSDATA` + `bili_jct` |

## Usage

### CLI

```bash
python main.py <skill_name> <action> [params_json]
```

### Python API

```python
import asyncio
from main import BilibiliAllInOne

app = BilibiliAllInOne()

async def demo():
    result = await app.execute("hot_monitor", "get_hot", limit=5)
    print(result)

asyncio.run(demo())
```

---

## Skills Reference

### 1. ๐Ÿ”ฅ Hot Monitor (`bilibili_hot_monitor`)

Monitor Bilibili hot/trending videos and topics in real-time. Supports filtering by category, tracking rank changes.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `get_hot` | Get popular/hot videos | `page`, `page_size` |
| `get_trending` | Get trending series/topics | `limit` |
| `get_weekly` | Get weekly must-watch list | `number` (week number, optional) |
| `get_rank` | Get category ranking videos | `category`, `limit` |

#### Supported Categories

`all`, `anime`, `music`, `dance`, `game`, `tech`, `life`, `food`, `car`, `fashion`, `entertainment`, `movie`, `tv`

#### Examples

```bash
# Get top 10 hot videos
python main.py hot_monitor get_hot '{"page_size": 10}'

# Get trending topics
python main.py hot_monitor get_trending '{"limit": 5}'

# Get this week's must-watch
python main.py hot_monitor get_weekly

# Get game category rankings
python main.py hot_monitor get_rank '{"category": "game", "limit": 10}'
```

```python
# Python API
result = await app.execute("hot_monitor", "get_hot", page_size=10)
result = await app.execute("hot_monitor", "get_rank", category="game", limit=10)
```

---

### 2. โฌ‡๏ธ Downloader (`bilibili_downloader`)

Download Bilibili videos with support for multiple quality options, batch downloading, and format selection.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `get_info` | Get video information | `url` |
| `get_formats` | List available qualities/formats | `url` |
| `download` | Download a single video | `url`, `quality`, `output_dir`, `format`, `page` |
| `batch_download` | Download multiple videos | `urls`, `quality`, `output_dir`, `format` |

#### Quality Options

`360p`, `480p`, `720p`, `1080p` (default), `1080p+`, `4k`

#### Format Options

`mp4` (default), `flv`, `mp3` (audio only)

#### Examples

```bash
# Get video info
python main.py downloader get_info '{"url": "BV1xx411c7mD"}'

# List available formats
python main.py downloader get_formats '{"url": "BV1xx411c7mD"}'

# Download in 1080p MP4
python main.py downloader download '{"url": "BV1xx411c7mD", "quality": "1080p", "format": "mp4"}'

# Extract audio only
python main.py downloader download '{"url": "BV1xx411c7mD", "format": "mp3"}'

# Batch download
python main.py downloader batch_download '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"], "quality": "720p"}'
```

```python
# Python API
info = await app.execute("downloader", "get_info", url="BV1xx411c7mD")
result = await app.execute("downloader", "download", url="BV1xx411c7mD", quality="1080p")
```

---

### 3. ๐Ÿ‘€ Watcher (`bilibili_watcher`)

Watch and monitor Bilibili videos. Track view counts, comments, likes, and other engagement metrics over time.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `watch` | Get detailed video information | `url` |
| `get_stats` | Get current engagement statistics | `url` |
| `track` | Track metrics over time | `url`, `interval` (minutes), `duration` (hours) |
| `compare` | Compare multiple videos | `urls` |

#### Supported Platforms

- **Bilibili**: `https://www.bilibili.com/video/BVxxxxxx` or `BVxxxxxx`

#### Examples

```bash
# Get video details
python main.py watcher watch '{"url": "BV1xx411c7mD"}'

# Get current stats
python main.py watcher get_stats '{"url": "BV1xx411c7mD"}'

# Track views every 30 minutes for 12 hours
python main.py watcher track '{"url": "BV1xx411c7mD", "interval": 30, "duration": 12}'

# Compare multiple videos
python main.py watcher compare '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"]}'
```

```python
# Python API

comparison = await app.execute("watcher", "compare", urls=["BV1xx411c7mD", "BV1yy411c8nE"])
```

---

### 4. ๐Ÿ“ Subtitle (`bilibili_subtitle`)

Download and process subtitles/CC from Bilibili videos. Supports multiple subtitle formats and languages.

**When no CC subtitles are available**, the module automatically falls back to:
1. **Speech Recognition** โ€” Downloads the video's audio and transcribes it using `faster-whisper` (requires `pip install faster-whisper`)
2. **Danmaku Extraction** โ€” Fetches bullet comments from the video as a text reference

Both fallback results are returned together when triggered.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `list` | List available subtitles | `url` |
| `download` | Download subtitles (with auto-fallback) | `url`, `language`, `format`, `output_dir` |
| `convert` | Convert subtitle format | `input_path`, `output_format`, `output_dir` |
| `merge` | Merge multiple subtitle files | `input_paths`, `output_path`, `output_format` |

#### Supported Formats

`srt` (default), `ass`, `vtt`, `txt`, `json`

#### Supported Languages

`zh-CN` (default), `en`, `ja`, and other language codes available on the video.

#### Fallback Strategy

When `download` is called and no CC subtitles exist:

```
CC Subtitle Available? โ”€โ”€Yesโ”€โ”€โ–ถ Download CC subtitle
        โ”‚
       No
        โ”‚
        โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Fallback 1: Speech Recognition     โ”‚
โ”‚  Download audio โ†’ faster-whisper    โ”‚
โ”‚  Output: {title}_transcribed.srt    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Fallback 2: Danmaku Extraction     โ”‚
โ”‚  Fetch bullet comments โ†’ SRT        โ”‚
โ”‚  Output: {title}_danmaku.srt        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

#### Examples

```bash
# List available subtitles
python main.py subtitle list '{"url": "BV1xx411c7mD"}'

# Download Chinese subtitles in SRT format (auto-fallback if no CC)
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "zh-CN", "format": "srt"}'

# Download English subtitles in ASS format
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "en", "format": "ass"}'

# Convert SRT to VTT
python main.py subtitle convert '{"input_path": "./subtitles/video.srt", "output_format": "vtt"}'

# Merge subtitle files
python main.py subtitle merge '{"input_paths": ["part1.srt", "part2.srt"], "output_path": "merged.srt"}'
```

```python
# Python API
subs = await app.execute("subtitle", "list", url="BV1xx411c7mD")
result = await app.execute("subtitle", "download", url="BV1xx411c7mD", language="zh-CN", format="srt")

# When no CC subtitles, result includes both fallback outputs:
# result["transcription"]["filepath"]  โ†’ speech recognition SRT
# result["danmaku"]["filepath"]        โ†’ danmaku SRT
```

---

### 5. โ–ถ๏ธ Player (`bilibili_player`)

Play Bilibili videos with support for playback control, playlist management, and danmaku (bullet comments) display.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `play` | Get complete playback info | `url`, `quality`, `page` |
| `get_playurl` | Get direct play URLs | `url`, `quality`, `page` |
| `get_danmaku` | Get danmaku/bullet comments | `url`, `page`, `segment` |
| `get_playlist` | Get playlist/multi-part info | `url` |

#### Danmaku Modes

| Mode | Description |
|---|---|
| 1 | Scroll (right to left) |
| 4 | Bottom fixed |
| 5 | Top fixed |

#### Examples

```bash
# Get playback info
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p"}'

# Get direct play URLs
python main.py player get_playurl '{"url": "BV1xx411c7mD", "quality": "720p"}'

# Get danmaku
python main.py player get_danmaku '{"url": "BV1xx411c7mD"}'

# Get playlist for multi-part video
python main.py player get_playlist '{"url": "BV1xx411c7mD"}'

# Get page 3 of a multi-part video
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p", "page": 3}'
```

```python
# Python API
play_info = await app.execute("player", "play", url="BV1xx411c7mD", quality="1080p")
danmaku = await app.execute("player", "get_danmaku", url="BV1xx411c7mD")
playlist = await app.execute("player", "get_playlist", url="BV1xx411c7mD")
```

---

### 6. ๐Ÿ“ค Publisher (`bilibili_publisher`)

Publish videos to Bilibili. Supports uploading videos, setting metadata, scheduling publications, and managing drafts.

> โš ๏ธ **Authentication Required**: All publisher actions require valid Bilibili credentials.

#### Actions

| Action | Description | Parameters |
|---|---|---|
| `upload` | Upload and publish a video | `file_path`, `title`, `description`, `tags`, `category`, `cover_path`, `dynamic`, `no_reprint`, `open_elec` |
| `draft` | Save as draft | `file_path`, `title`, `description`, `tags`, `category`, `cover_path` |
| `schedule` | Schedule future publication | `file_path`, `title`, `schedule_time`, `description`, `tags`, `category`, `cover_path` |
| `edit` | Edit existing video metadata | `bvid`, `file_path`, `title`, `description`, `tags`, `cover_path` |

#### Upload Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `file_path` | string | *required* | Path to the video file |
| `title` | string | *required* | Video title (max 80 chars) |
| `description` | string | `""` | Video description (max 2000 chars) |
| `tags` | string[] | `["bilibili"]` | Tags (max 12, each max 20 chars) |
| `category` | string | `"171"` | Category TID |
| `cover_path` | string | `null` | Path to cover image (JPG/PNG) |
| `no_reprint` | int | `1` | 1 = original content, 0 = repost |
| `open_elec` | int | `0` | 1 = enable charging, 0 = disable |

#### Examples

```bash
# Upload and publish
python main.py publisher upload '{"file_path": "./video.mp4", "title": "My Video", "description": "Hello World", "tags": ["test", "demo"], "category": "171"}'

# Save as draft
python main.py publisher draft '{"file_path": "./video.mp4", "title": "Draft Video"}'

# Schedule publication
python main.py publisher schedule '{"file_path": "./video.mp4", "title": "Scheduled Video", "schedule_time": "2025-12-31T20:00:00+08:00"}'

# Edit video metadata (requires re-uploading the video file)
python main.py publisher edit '{"bvid": "BV1xx411c7mD", "file_path": "./video.mp4", "title": "New Title", "tags": ["updated"]}'
```

```python
# Python API (authentication required)
app = BilibiliAllInOne(sessdata="xxx", bili_jct="xxx", buvid3="xxx")

result = await app.execute("publisher", "upload",
    file_path="./video.mp4",
    title="My Video",
    description="Published via bilibili-all-in-one",
    tags=["python", "bilibili"],
)

# Edit video (requires file_path for re-upload)
result = await app.execute("publisher", "edit",
    bvid="BV1xx411c7mD",
    file_path="./video.mp4",
    title="New Title",
    tags=["updated"],
)
```

---

## Project Structure

```
bilibili-all-in-one/
โ”œโ”€โ”€ skill.json              # Skill configuration & parameter schema
โ”œโ”€โ”€ skill.md                # This documentation file
โ”œโ”€โ”€ README.md               # Project README (Chinese)
โ”œโ”€โ”€ LICENSE                  # MIT License
โ”œโ”€โ”€ requirements.txt        # Python dependencies
โ”œโ”€โ”€ .gitignore              # Git ignore rules
โ”œโ”€โ”€ main.py                 # Entry point & unified BilibiliAllInOne class
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ __init__.py         # Package exports
    โ”œโ”€โ”€ auth.py             # Authentication & credential management
    โ”œโ”€โ”€ utils.py            # Shared utilities, API constants, helpers
    โ”œโ”€โ”€ hot_monitor.py      # Hot/trending video monitoring
    โ”œโ”€โ”€ downloader.py       # Video downloading
    โ”œโ”€โ”€ watcher.py          # Video watching & stats tracking
    โ”œโ”€โ”€ subtitle.py         # Subtitle downloading & processing
    โ”œโ”€โ”€ player.py           # Video playback & danmaku
    โ””โ”€โ”€ publisher.py        # Video uploading & publishing
```

## Response Format

All skill actions return a JSON object with a unified structure:

```json
{
  "success": true,
  "...": "action-specific fields"
}
```

On error:

```json
{
  "success": false,
  "message": "Error description"
}
```

## License

MIT
COMPATIBILITY & REFERENCES

Platform guidance

Imported from the listed AgentSkill.sh category. Complete supplied package files and notices are retained. Required external tools and credentials are not installed. No bundled code was executed during import. Individual agent task behavior has not been tested.