Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
bytedance avatar

Byted Byteplus Vod Precision Erasure

  • 9 installs
  • 411 repo stars
  • Updated August 4, 2026
  • bytedance/agentkit-samples

Byted VOD precision erasure is a Claude skill that uploads media to BytePlus VOD and runs OCR-based precision-erasure jobs to remove subtitles or on-screen text.

About

This skill uploads video or audio to a BytePlus VOD (Video on Demand) space, then submits precision-erasure jobs that remove subtitles or on-screen text using automatic OCR. A developer uses it to strip burned-in captions or text from ingested media and get back a new video asset. It handles both local-file and URL-pull uploads and polls the job to completion.

  • Uploads video/audio to a BytePlus VOD space from a local file or public URL and returns a vid:// reference
  • Submits precision-erasure jobs (StartExecution / Task.Type Erase) that remove subtitles or all on-screen text via automa
  • Always uses Auto OCR mode with NewVid true; supports optional clip filtering by skip or selected timeline segments

Byted Byteplus Vod Precision Erasure by the numbers

  • 9 all-time installs (skills.sh)
  • Ranked #1,065 of 1,335 Generative Media skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

byted-byteplus-vod-precision-erasure capabilities & compatibility

Requires BytePlus access/secret keys and a VOD space; precision erasure may need an allowlist or work order.

Capabilities
video generation · image generation
Use cases
video generation
Runs
Runs locally
Pricing
Bring your own API key
From the docs

What byted-byteplus-vod-precision-erasure says it does

Uploads video/audio to a BytePlus VOD space (from a **local file** or a **public URL**) and returns a `vid://…` reference.
SKILL.md
For media already in VOD, submits **precision erasure** tasks (`StartExecution` → `Operation.Task.Type: Erase`) using **automatic OCR only**.
SKILL.md
**Not supported:** `Manual` mode, custom ratio `Locations`, tuning `SubtitleFilter` beyond `{}`, `VideoOption.EncodeMode`, overriding `NewVid`.
SKILL.md
npx skills add https://github.com/bytedance/agentkit-samples --skill byted-byteplus-vod-precision-erasure

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs9
repo stars411
Last updatedAugust 4, 2026
Repositorybytedance/agentkit-samples

What it does

Upload video to BytePlus VOD and erase burned-in subtitles or on-screen text via automatic OCR.

Who is it for?

Removing subtitles or on-screen text from videos already uploaded or uploadable to a BytePlus VOD space.

Skip if: Manual erasure mode, custom ratio Locations, or overriding NewVid, which the docs list as not supported.

When should I use this skill?

The user asks for precision erasure, precise erase, subtitle removal, OCR subtitles, or to remove on-screen text on VOD media.

What you get

Returns a new video asset (NewVid) with subtitles or on-screen text erased via automatic OCR.

  • Vid and vid:// source reference
  • Erased video VideoUrls
  • Optional EraseMeta

By the numbers

  • URL upload polling limit 360 x 5s
  • Direct TOS upload under 20 MiB, else chunked

Files

SKILL.mdMarkdownGitHub ↗

VOD precision erasure

Uploads video/audio to a BytePlus VOD space (from a local file or a public URL) and returns a vid://… reference. For media already in VOD, submits precision erasure tasks (StartExecutionOperation.Task.Type: Erase) using automatic OCR only. Do not tell end users they can change erasure mode between Manual and Auto — this skill always sends `Auto`. `NewVid` is always `true` (not surfaced as a user choice).

---

Product scope

AspectBehaviour
InputVid or DirectUrl (JSON field video)
Erasure coverageDefault subtitle only (Auto.Type: Subtitle, SubtitleFilter: {}). User may opt into all detected on-screen text via text: true or all_text: trueAuto.Type: Text.
TimelineDefault: whole video (no ClipFilter). Optional clip_filter with `mode` skip or `selected` — when either is used, `clips` is mandatory (non-empty).
Output asset`NewVid` is always `true` — not configurable and not prompted.
Erasure metadataDefault `with_erase_info: true` (WithEraseInfo). If false, stdout EraseMeta is {}; VideoUrls are still populated when Erase.File is returned.

Not supported: Manual mode, custom ratio Locations, tuning SubtitleFilter beyond {}, VideoOption.EncodeMode, overriding NewVid.

Precision erasure allowlist: if you see HTTP 403 or “Permission denied”, explain allowlist / work order per BytePlus VOD.

---

Prerequisites

  • Environment variables (required; optionally place a .env in the working directory — scripts load it automatically):
  • BYTEPLUS_ACCESSKEY — BytePlus Access Key
  • BYTEPLUS_SECRETKEY — BytePlus Secret Key
  • VOD_SPACE_NAME — VOD space name
  • Execution: examples use uv run python … (python scripts/… works if deps are installed).

---

Workflow overview

Upload pipeline (local file):
  [S1_APPLY]  ApplyUploadInfo → TOS upload address + SessionKey
  [S2_TOS]    PUT file to TOS (direct or chunked)
  [S3_COMMIT] CommitUploadInfo → Vid
  Output: { Vid, Source, PlayURL, FileName, SpaceName, SourceUrl }

Upload pipeline (URL):
  [S1_UPLOAD] Submit URL upload job (UploadMediaByUrl) → JobId
  [S2_POLL]   Poll QueryUploadTaskInfo → Vid
  Output: { Vid, Source, PlayURL, FileName, SpaceName, SourceUrl, JobId }

Precision erasure pipeline:
  [S3_ERASE]  Submit Erase task (StartExecution / Task.Type Erase) → RunId
  [S4_POLL]   Poll GetExecution → output Erase.File (+ optional Erase.Info)
  Output: { Status, SpaceName, VideoUrls[{ FileId, Vid, DirectUrl, Source, Url }], EraseMeta? }

---

Quick Self-Check (recommended)

Before running any script:

  • .env or env vars contain BYTEPLUS_ACCESSKEY, BYTEPLUS_SECRETKEY, and VOD_SPACE_NAME.

Pick the pipeline from user intent:

User intentPipelineEntry script
Upload video to VODUploadscripts/upload.py
Subtitle / on-screen text erasurePrecision erasurescripts/precise_erase.py

---

S1_UPLOAD & S2_POLL: Upload and Obtain Vid

Calling convention

Run from the Skill root directory (byted-byteplus-vod-precision-erasure/):

# Local file upload (returns Vid when complete)
uv run python scripts/upload.py "/path/to/video.mp4" [space_name]

# URL upload (polls until Vid is returned)
uv run python scripts/upload.py "https://example.com/video.mp4" [space_name]

uv run python scripts/upload.py "https://example.com/sample.mp4" my_space
  • First argument: local file path or public http:// / https:// URL (auto-detected).
  • Second argument (optional): space name; if omitted, VOD_SPACE_NAME is used.
  • Paths and URLs must include a file extension (e.g. .mp4, .mov, .mp3).

Upload flow

Local file (synchronous, three-step):

1. ApplyUploadInfo (API version 2023-01-01) → TOS address, SessionKey 2. PUT to TOS (direct < 20 MiB, else chunked) 3. CommitUploadInfo (2023-01-01) → Vid

URL pull (async + poll):

1. UploadMediaByUrl (2023-01-01) → JobId 2. Poll QueryUploadTaskInfo until done (same limits as sibling skill: typically 360 × 5 s) 3. Return Vid

Output format

On success, one JSON object on stdout, e.g.:

{
  "Vid": "v0d123abc",
  "Source": "vid://v0d123abc",
  "PlayURL": "https://example.cdn.com/xxx.m3u8",
  "PosterUri": "",
  "FileName": "uuid-filename.mp4",
  "SpaceName": "my_space",
  "SourceUrl": "https://example.com/video.mp4",
  "JobId": "job-xxx"
}
  • Preserve `Source` (vid://…) for downstream skills.

Timeout handling (URL upload)

If URL polling exhausts retries, stderr / JSON includes something like:

{
  "error": "Polling timed out (360 attempts × 5s); the URL pull upload is still processing",
  "resume_hint": {
    "description": "The URL upload has not finished yet; retry with the command below",
    "command": "uv run python scripts/upload.py \"<original URL>\" [space_name]"
  },
  "JobIds": "job-xxx",
  "State": "running"
}

---

S3_ERASE & S4_POLL: precision erasure

Calling convention

Run from the Skill root directory (byted-byteplus-vod-precision-erasure/):

# Default: subtitle-only, whole video, WithEraseInfo on
uv run python scripts/precise_erase.py '{"type":"Vid","video":"v0310abc"}'

uv run python scripts/precise_erase.py '{"type":"Vid","video":"vid://v0d225gxxx"}' production_space

# Broader OCR (subtitle + other on-screen text)
uv run python scripts/precise_erase.py '{"type":"Vid","video":"v0310abc","text":true}'

uv run python scripts/precise_erase.py @params.json

# Resume after timeout
uv run python scripts/poll_execution.py '<RunId>' [space_name]

Parameter reference

ParameterTypeRequiredDescription
typestringVid or DirectUrl
videostringVid or VOD FileName; vid:// / directurl:// stripped automatically
textbooleannoIf true: `Auto.Type: Text` (more aggressive). Default false → subtitle-only.
all_textbooleannoSynonym for `text` (if both are set, `text` is applied first).
clip_filterobjectnoOmit = whole video. If set: `mode` skip or selected, and `clips` (non-empty list of { "start", "end" } seconds; Start/End accepted).
with_erase_infobooleannoDefault true (WithEraseInfo). If false, detailed erase geometry is not requested; stdout `EraseMeta` is {}.

Do not prompt users for Manual mode or NewVid.

Agent prompting (plain language)

Clarify: subtitle-only vs all on-screen text; whole video vs segments (skip / selected + clips); whether they need region-level erase telemetry (with_erase_info). Use conversational labels — avoid exposing raw JSON field names unless the user asks for implementation details.

Output format

On success, one JSON object on stdout, roughly:

{
  "Status": "Success",
  "SpaceName": "my_space",
  "VideoUrls": [
    {
      "FileId": "…",
      "Vid": "v0…",
      "DirectUrl": "path/to/output.mp4",
      "Source": "vid://v0…",
      "Url": "https://example.cdn.com/…"
    }
  ],
  "AudioUrls": [],
  "Texts": [],
  "EraseMeta": {
    "Duration": 57.099,
    "Info": {}
  }
}

When `with_erase_info` was false, `EraseMeta` is {}.

  • `VideoUrls[0].Url`: playable / downloadable when signing succeeds for the space.
  • `Source`: prefer vid://… when the API returns a new Vid; else directurl://….

Timeout handling (GetExecution polling)

Same pattern as the enhancement skill:

{
  "error": "Polling timed out (360 attempts × 5s); the job is still processing",
  "resume_hint": {
    "description": "The job has not finished yet; resume polling with the command below",
    "command": "uv run python scripts/poll_execution.py '<RunId>' [space_name]"
  }
}

---

Environment Variables

NameDescriptionRequired
BYTEPLUS_ACCESSKEYBytePlus Access KeyYes
BYTEPLUS_SECRETKEYBytePlus Secret KeyYes
VOD_SPACE_NAMEVOD space nameYes (or via CLI argument)
VOD_POLL_INTERVALPolling interval (seconds, default 5)No
VOD_POLL_MAXMaximum polling attempts (default 360)No
VOD_URL_EXPIRE_MINUTESSigned URL expiry (minutes, default 60)No
VOD_PLAY_DOMAINForce a specific playback domain (optional, highest priority)No
VOD_HOSTOverride VOD OpenAPI hostname (optional)No

---

Error Output Format

All failures use:

{"error": "error description"}

---

References

  • BytePlus VOD Python SDK
  • precision erasure parameter reference
  • API: ApplyUploadInfo (2023-01-01)
  • API: CommitUploadInfo (2023-01-01)
  • API: UploadMediaByUrl (2023-01-01)
  • API: QueryUploadTaskInfo (2023-01-01)
  • API: StartExecution (2025-07-01)
  • API: GetExecution (2025-07-01)

Related skills

FAQ

What erasure mode does it use?

It always sends Auto OCR mode; the docs say to never tell users they can switch between Manual and Auto.

Does it produce a new video?

Yes, NewVid is always true, so the erasure output is always a new asset.

What does a 403 error mean?

A 403 or Permission denied means precision erasure needs an allowlist or work order for BytePlus VOD.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.