将视频/音频媒体上传至BytePlus VOD(视频点播)存储,返回Vid及播放链接;支持本地文件上传(ApplyUploadIn...
Uploads video/audio to a BytePlus VOD space (from a local file or a public URL) and returns a vid://vxxxx reference. Additionally provides AI-based comprehensive quality restoration that removes compression artifacts, noise, and scratches from ingested videos, improving overall clarity and color rendition.
Environment variables (required, can be configured via a .env file in the working directory — the scripts will load it automatically):
BYTEPLUS_ACCESSKEY — BytePlus Access KeyBYTEPLUS_SECRETKEY — BytePlus Secret KeyVOD_SPACE_NAME — VOD space nameExecution: examples use uv run python ... (if the host environment can run Python directly, python scripts/... also works).
text
Upload pipeline (local file):
[S1_APPLY] ApplyUploadInfo → returns TOS upload address + SessionKey
[S2_TOS] PUT file to TOS (direct or chunked)
[S3_COMMIT] CommitUploadInfo → returns Vid
Output: { Vid, Source, PlayURL, FileName, SpaceName, SourceUrl }
Upload pipeline (URL):
[S1_UPLOAD] Submit URL upload job (UploadMediaByUrl) → returns JobId
[S2_POLL] Poll QueryUploadTaskInfo → returns Vid
Output: { Vid, Source, PlayURL, FileName, SpaceName, SourceUrl, JobId }
Quality restoration pipeline:
[S3_ENHANCE] Submit restoration job (StartExecution/enhanceVideo) → returns RunId
[S4_POLL] Poll GetExecution → returns the restored file
Output: { Status, SpaceName, VideoUrls[{ FileId, DirectUrl, Source }] }
Before running any script, confirm the following (avoid unrelated Python/uv version checks):
.env or environment variables contain:
BYTEPLUS_ACCESSKEY + BYTEPLUS_SECRETKEYVOD_SPACE_NAMEOnce verified, pick the corresponding pipeline based on user intent:
User intentPipelineEntry scriptUpload video to VODUpload pipelinescripts/upload.pyQuality restoration / denoise / remove compression artifactsQuality restoration pipelinescripts/quality_enhance.py
Run from the Skill root directory ( byted-byteplus-vod-video-enhancement/):
bash
# Local file upload (synchronous — returns Vid when complete)
uv run python scripts/upload.py "/path/to/video.mp4" [space_name]
# URL upload (automatically polls until a Vid is returned)
uv run python scripts/upload.py "<https://example.com/video.mp4>" [space_name]
# Example: specifying the space
uv run python scripts/upload.py "https://example.com/sample.mp4" my_space
http:// / https:// link. The script auto-detects which mode to use.VOD_SPACE_NAME..mp4, .mov, .mp3), otherwise an error is raised.Local file upload (synchronous, three-step):
ApplyUploadInfo (API Version: 2023-01-01) to obtain the TOS upload address, authentication token, and SessionKey.CommitUploadInfo (API Version: 2023-01-01) with the SessionKey; returns the Vid.URL upload (two-phase asynchronous):
UploadMediaByUrl (API Version: 2023-01-01) to submit the pull job; returns a JobId.QueryUploadTaskInfo until the job completes, with a maximum wait of 30 minutes (360 × 5s).Vid.On success, a JSON line is printed to stdout:
json
{
"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"
}
Source: a vid://-formatted reference that can be passed directly to follow-up skills such as byted-mediakit.Source field for use in subsequent processing steps.If polling times out (30 minutes), the output is:
json
{
"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"
}
Run from the Skill root directory ( byted-byteplus-vod-video-enhancement/):
bash
# Submit after the user has explicitly selected both config and repair_style
uv run python scripts/quality_enhance.py '{"type":"Vid","video":"v0310abc","config":"common","repair_style":1}'
# Example: a vid:// prefix is also accepted (the script strips it automatically)
uv run python scripts/quality_enhance.py '{"type":"Vid","video":"vid://v0d225gxxx","config":"common","repair_style":1}' production_space
# Optional target output resolution (omit res for source resolution)
uv run python scripts/quality_enhance.py '{"type":"Vid","video":"v0310abc","config":"common","repair_style":1,"res":"1080p"}'
# Pass parameters via @file.json (recommended — avoids shell escaping issues)
uv run python scripts/quality_enhance.py @params.json
# Resume polling after a timeout
uv run python scripts/poll_execution.py '<RunId>' [space_name]
ParameterTypeRequiredDescriptiontypestring✅Vid (video ID) or DirectUrl (VOD storage FileName)videostring✅The video Vid or FileName (a vid:// prefix is accepted and automatically stripped)configstring✅VolcMoeEnhanceParam Config; one of common, ugc, short_series, aigc, old_film. If the user explicitly asks for defaults, use common.repair_styleinteger✅VolcMoeEnhanceParam VideoStrategy.RepairStyle; 1 = Standard, 2 = Pro. If the user explicitly asks for defaults, use 1.resstringnoOptional MoeEnhance.Target.Res — target output resolution. Omit or leave empty for source resolution (no upscaling target). Allowed: 240p, 360p, 480p, 540p, 720p, 1080p, 2k, 4k.
Before quality restoration, you MUST ask the user to choose both required enhancement parameters if either config or repair_style is missing. Do not silently use defaults. Only use config=common and repair_style=1 when the user explicitly asks for default/recommended settings. When asking the user, use plain product language only; do not show internal parameter names or values such as config=..., repair_style=..., common, or short_series in the question text or option labels.
Suggested prompt:
Video enhancement may take some time. Choosing the right template usually gives better results.
What type of video is it?
- General video
- Short video / UGC
- Short drama / short series
- AI-generated content
- Old film / classic footage that needs restoration
Which video enhancement tier would you like to use?
- Standard: balanced visual improvement and processing speed
- Pro: cinematic-grade restoration with longer processing time; allowlist access may be required
What output resolution do you want? (optional)
- Keep the same as the source video (recommended default — do not pass
res)- Or choose a target: 240p, 360p, 480p, 540p, 720p, 1080p, 2K, 4K
If the user wants source / original resolution, omit res from the JSON (or use an empty string). Only set res when they explicitly pick a target resolution.
If the user asks for a default recommendation, use config=common and repair_style=1 with no res. Otherwise, wait for the user's selections before running scripts/quality_enhance.py.
Internal mapping: General video -> config=common; Short video / UGC -> config=ugc; Short drama / short series -> config=short_series; AI-generated content -> config=aigc; Old film / classic footage -> config=old_film; Standard -> repair_style=1; Pro -> repair_style=2; source resolution -> omit res; 240p–4K -> res as listed in the parameter table ( 2k / 4k in JSON). Do not expose these parameter names or values in the question unless the user asks for implementation details.
Special handling for Pro: if the user chooses repair_style=2 and the StartExecution/GetExecution response returns HTTP status 403, or any error message contains Permission denied, explain that Pro is only available to users on the allowlist. Ask the user to submit a ticket to apply: https://console.byteplus.com/workorder/create
On success, a JSON line is printed to stdout:
json
{
"Status": "Success",
"SpaceName": "my_space",
"VideoUrls": [
{
"FileId": "xxx",
"DirectUrl": "path/to/output.mp4",
"Source": "directurl://path/to/output.mp4",
"Url": "https://example.cdn.com/path/to/output.mp4?auth_key=..."
}
],
"AudioUrls": [],
"Texts": []
}
VideoUrls[0].Url: a directly accessible/downloadable URL (the script signs it based on the space's domain/auth rules).VideoUrls[0].Source ( directurl://...) can be passed directly to downstream skills.If polling times out (30 minutes), the output is:
json
{
"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]"
}
}
NameDescriptionRequiredBYTEPLUS_ACCESSKEYBytePlus Access KeyYesBYTEPLUS_SECRETKEYBytePlus Secret KeyYesVOD_SPACE_NAMEVOD space nameYes (or via CLI argument)VOD_POLL_INTERVALPolling interval (seconds, default 5)NoVOD_POLL_MAXMaximum polling attempts (default 360)NoVOD_URL_EXPIRE_MINUTESSigned URL expiration (minutes, default 60)NoVOD_PLAY_DOMAINForce the use of a specific play domain (optional, highest priority)No
All errors share the same format:
json
{"error": "error description"}
ApplyUploadInfo (Version: 2023-01-01)CommitUploadInfo (Version: 2023-01-01)UploadMediaByUrl (Version: 2023-01-01)QueryUploadTaskInfo (Version: 2023-01-01)StartExecution (Version: 2025-07-01)GetExecution (Version: 2025-07-01)