PluginBench
Skill
Pass
Audit score 90

bangumi-frames

agents365-ai/365-skills

Extract and organize anime frames from Bilibili videos by character or scenery using anime-specific detection and CCIP embeddings.

What is bangumi-frames?

Extracts keyframes from Bilibili videos (bangumi episodes, UP uploads, or local files) and organizes them into character crops and scenery shots using anime-specific person detection and CCIP character-identity embeddings. Use this when you need to collect, extract, or organize anime screenshots by character or scene from a Bilibili video.

  • Download and extract keyframes from Bilibili videos or process local video files
  • Cluster character crops by visual identity using CCIP embeddings, or match crops against a reference character folder
  • Separate scenery shots from character-containing frames automatically
  • Remove burned-in subtitles and watermarks with optional --clean mode
  • Cache CCIP features for efficient re-processing and output results as JSON with human-readable summaries

How to install bangumi-frames

npx skills add https://github.com/agents365-ai/365-skills --skill bangumi-frames
Prerequisites
  • ffmpeg and yt-dlp on PATH (yt-dlp only needed for Bilibili downloads; local files skip this)
  • Python 3.9+ with dghs-imgutils installed (pip install dghs-imgutils)
  • Bilibili cookie in Netscape format for accessing 1080p+ or premium episodes (local files do not require this)
  • ONNX_MODE must not be set to CoreML (CCIP will crash; person detection is fine on CoreML)
  • Optional: rapidocr-onnxruntime and simple-lama-inpainting for subtitle/watermark removal (--clean mode)
Claude Code
Cursor
Windsurf
Cline

How to use bangumi-frames

  1. 1.Install prerequisites: ffmpeg, yt-dlp, and pip install dghs-imgutils
  2. 2.Prepare a Bilibili cookie file if downloading from Bilibili (local files do not require this)
  3. 3.Run in cluster mode (organize all characters): python3 bangumi_frames.py <bilibili_url_or_local_file> --out <output_dir>
  4. 4.Or run in one-vs-rest mode (match a specific character): python3 bangumi_frames.py <bilibili_url> --ref <reference_folder> --ref-eps 0.04 --out <output_dir>
  5. 5.Review the output montage (_montage.png or matched_montage.png) and index.json to verify grouping quality
  6. 6.Adjust thresholds (--eps, --min-samples, --ref-eps, --conf, --min-area) and re-run if needed; stages are idempotent

Use cases

Good for
  • Extract all character appearances from a bangumi episode and organize them into per-character folders
  • Pull out all frames of a specific character from a video using a reference folder of that character's crops
  • Collect scenery shots and background frames separately from character-focused content
  • Create montages and indexed catalogs of character appearances across multiple episodes
  • Analyze character visual consistency and outfit variations across a series
Who it's for
  • Anime fans and archivists collecting character screenshots
  • Content creators making character compilations or analysis videos
  • Researchers studying anime visual styles and character design
  • Bilibili video enthusiasts organizing personal offline collections

bangumi-frames FAQ

Can I use this on live-action video?

No. The skill uses anime-specific person detection and CCIP embeddings designed for anime and 2.5D-render art only. Live-action video requires a different face-recognition stack.

Do I need a Bilibili account or cookie?

Only for downloading 1080p+ or premium episodes from Bilibili. Local video files require no cookie. A preview-only cookie will download lower resolution. Use --cookies flag or set $BILIBILI_COOKIES environment variable.

What does --clean do?

The --clean flag removes burned-in subtitles and watermarks from frames using OCR and LaMa inpainting before character detection. Requires rapidocr-onnxruntime and simple-lama-inpainting.

How do I use reference-folder mode to extract one character?

Create a folder with ~200 crops of the target character, then run with --ref <folder> --ref-eps 0.04. The skill will match all crops in the video to that character and output them distance-prefixed in matched/ (closest first).

Can I re-run the skill without re-downloading?

Yes. Stages are idempotent — if output already exists, that stage is skipped. Use --redo to force re-processing of a specific stage. CCIP features are cached in features.npy for efficient re-clustering.

Full instructions (SKILL.md)

Source of truth, from agents365-ai/365-skills.


name: bangumi-frames version: 0.5.0 description: Extract and organize frames from a Bilibili video (bangumi episode, UP upload, or a local file) into scenery shots and per-character image groups, using anime-specific person detection + CCIP character-identity embeddings. Two modes — cluster everyone, or pull out one (or several) named characters via reference folders. Use when the user wants to collect, extract, or organize anime frames/screenshots by character or by scenery from a Bilibili video. Read-only download for personal viewing/analysis; uploads nothing. license: MIT homepage: https://github.com/Agents365-ai/365-skills/tree/main/plugins/bangumi-frames/skills/bangumi-frames compatibility: Requires ffmpeg and (for downloads) yt-dlp on PATH; Python 3.9+ with dghs-imgutils (anime person detection + CCIP). The CCIP step runs on CPU — do NOT set ONNX_MODE=CoreML (CCIP crashes there); person detection is fine on CoreML. Anime / 2.5D-render art only — not for live-action. Optional --clean (subtitle/watermark removal) needs rapidocr-onnxruntime + simple-lama-inpainting. platforms: [macos, linux] metadata: {"openclaw":{"requires":{"anyBins":["ffmpeg"]},"emoji":"🎬","os":["darwin","linux"],"install":[{"id":"brew-ffmpeg","kind":"brew","formula":"ffmpeg","bins":["ffmpeg"],"label":"Install ffmpeg via Homebrew","os":["darwin"]},{"id":"pip-yt-dlp","kind":"pip","package":"yt-dlp","bins":["yt-dlp"],"label":"Install yt-dlp (download Bilibili streams)"},{"id":"pip-imgutils","kind":"pip","package":"dghs-imgutils","label":"Install anime person detection + CCIP models"}]},"hermes":{"tags":["bilibili","anime","bangumi","frames","character","ccip","screenshot","video"],"category":"media","requires_tools":["ffmpeg","yt-dlp"],"related_skills":[]},"author":"Agents365-ai","version":"0.5.0"}

bangumi-frames — Bilibili Anime Frame & Character Organizer

Overview

Give a Bilibili video (a bangumi ep link, a UP-upload BV link/id, or a local video file); it downloads → extracts scene-change keyframes → splits scenery vs character frames → organizes the character crops. One pass, two modes:

  • no --ref (cluster mode) — group every character crop by CCIP identity into characters/char_NN/.
  • with --ref DIR (one-vs-rest mode) — given ONE character's reference folder, pull every crop in the video that matches it into matched/, filenames prefixed with distance (closest first) so a tight threshold yields a pure set.

Models are anime-specific (deepghs anime person detection + CCIP character-identity embeddings) — they do not work on live-action footage.

When to use / when NOT to use

  • Use when the user wants to collect/extract/organize anime frames or screenshots from a Bilibili video — by character, by scenery, or to pull out one specific person.
  • Don't use for live-action video (needs an insightface-class face stack instead), or for generic video editing/trimming/transcoding.

Bundled resources

ResourceRead it when
references/pipeline.mdTuning a stage — download (--height/--prefer), extract (--scene/--interval/--dedup/--skip), --clean (OCR+LaMa subtitle/watermark removal), classify (--conf/--min-area); feature caching; the CPU/CoreML rule; --redo
references/modes.mdChoosing/tuning the two modes — mode 1 cluster (--eps/--min-samples) vs mode 2 one-vs-rest (--ref-eps, the distance-band histogram, the compressed-embedding threshold lore); full output layout
scripts/bangumi_frames.pyThe entry point (all stages + both modes)
scripts/remove_overlay.pyStandalone subtitle/watermark removal on a frame dir or single image

Prerequisites

  1. ffmpeg on PATH; yt-dlp on PATH for downloads (a local-file input skips download).
  2. Python 3.9+, pip install dghs-imgutils (first run pulls ~300 MB of models from HuggingFace, then cached locally).
  3. A Bilibili cookie (Netscape cookies.txt). Resolution order: --cookies > $BILIBILI_COOKIES > ~/bb_up/bb_cookies/www.bilibili.com_cookies.txt. 1080p+ / premium episodes need a cookie with membership; a preview-only download means the cookie lacks access to that episode. Local-file input needs no cookie.
  4. Run the CCIP step on CPU — do not set ONNX_MODE=CoreML (CCIP crashes; the script pops it before clustering/matching). Person detection is fine on CoreML.
  5. (Only for --clean) pip install rapidocr-onnxruntime simple-lama-inpainting.
  6. (Only for --engine pyscenedetect) pip install scenedetect.

Usage

SKILL=skills/bangumi-frames/scripts/bangumi_frames.py

# Mode 1 — cluster everyone into char_NN groups
python3 $SKILL https://www.bilibili.com/video/BV15qVm68E2h --out ~/frames
python3 $SKILL ep1231575 --out ~/frames           # ep / BV id also accepted
python3 $SKILL ~/local.mp4 --out ~/frames          # local file, skips download

# Mode 2 — pull out ONE character (ref folder = ~200 crops of that character)
python3 $SKILL BV15qVm68E2h --ref ~/refs/紫灵 --ref-eps 0.04 --out ~/frames

# Optional: strip burned-in subtitles + watermark before analysis
python3 $SKILL ep1231575 --clean --out ~/frames

Stages are idempotent (a stage is skipped when its output already exists; clustering / matching always re-runs since the CCIP features are cached). For every flag, the per-stage trade-offs, and the threshold lore, read the two reference files above.

Agent-native output: stdout is a single JSON envelope ({"ok", "data", "next", "meta"} on success, {"ok": false, "error"} on failure — JSON when piped, a human summary on a TTY; force with --format), stderr carries human progress logs, and exit codes are stable (0 ok · 1 runtime · 2 auth · 3 validation). Use --dry-run to preview the plan without downloading, --schema to print the output contract. Details in references/pipeline.md.

Output

<out>/<id>/                     # id = BV id / ep id / local filename
├── frames/  frames.json        # keyframes + timestamps
├── scenery/                    # frames with no detected character
├── crops/  features.npy        # character crops + cached CCIP features
├── detect.json                 # frame -> person boxes / crops
├── characters/                 # MODE 1: char_NN_crop/ + char_NN_full/ (paired), _unsorted/, _montage.png
├── matched/                    # MODE 2: 0.012_<crop>.jpg (distance-prefixed) + index.json
├── matched_montage.png         # MODE 2 sample montage
└── index.json                  # MODE 1: char group -> {crop, frame, time}

After a run, look at characters/_montage.png (mode 1) or matched_montage.png (mode 2) first to judge quality, then read index.json. See references/modes.md for what to adjust when grouping/matching is off.

Limits

  • Anime / 2.5D-render art only; live-action needs a different (face-recognition) stack.
  • CCIP may split one character's different forms (outfit / transform) into separate groups — usually fine for "group by visual appearance"; for mode 2, put each form in the ref.
  • 1080p+ on Bilibili needs a membership cookie; download is for personal offline analysis only and uploads nothing.