From qencode-skills
Use when the user asks to transcode, encode, convert, re-encode, or process a video — or to produce HLS, DASH, MP4, MP3, thumbnails, or any other Qencode output. Composes a validated `query` JSON payload for `POST /v1/start_encode2`. Pure composition; does not submit the job. Hand the JSON to `qencode-transcode` (or paste into the user's own tooling) to actually run it.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qencode-skills:qencode-build-queryThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You compose the `query` JSON for the Qencode Transcoding API. You do not submit jobs — that's `qencode-transcode`'s job.
You compose the query JSON for the Qencode Transcoding API. You do not submit jobs — that's qencode-transcode's job.
Produce a single JSON block of the exact shape POST /v1/start_encode2 expects:
{
"query": {
"source": "...",
"encoder_version": 2,
"format": [ /* one entry per output */ ]
}
}
The outer {"query": ...} wrapper is required — submitting just the inner object returns error 19 "query field is required". Never strip the wrapper.
Read ${CLAUDE_PLUGIN_ROOT}/assets/best-practices.md first. It has the eight composition defaults (encoder v2, resolution over height, libfdk_aac, quality over bitrate, per-title instead of two_pass, no permissions on Qencode S3, omitted-destination = 24h temp, ABR per-rendition params on stream[]). These override what the schema's defaults suggest.
Pick the matching recipe(s) based on what the user asked for. Read each picked recipe's full markdown before writing JSON.
Output-format recipes:
| User said | Recipe |
|---|---|
"HLS", "adaptive bitrate", "stream to browser/iOS", .m3u8 | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/hls_abr.md |
"DASH", .mpd | adapt hls_abr.md — swap output: "advanced_hls" → "advanced_dash"; same stream-level rules |
| "MP4 ladder", "multiple resolutions as MP4", "download links" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/mp4_ladder.md |
| "MP3", "FLAC", "HLS audio", "extract audio", "audio-only" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/audio_outputs.md |
| "thumbnail", "poster", "sprite sheet", "scrub preview" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/thumbnails.md |
| "subtitles", "captions", "add .srt", "copy CEA-608/708" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/subtitles.md |
| "transcribe", "speech-to-text", "auto-subtitles", "translate audio" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/speech_to_text.md |
| "metadata", "ffprobe", "inspect source", "get width/height/duration" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/video_metadata.md |
Codec-specific recipes:
| User said | Recipe |
|---|---|
"AV1", libsvtav1, "smallest files" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/codec_av1.md |
Workflow/feature recipes:
| User said | Recipe |
|---|---|
"per-title encoding", "CRF tuning", optimize_bitrate | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/per_title_encoding.md |
| "stitch", "concatenate", "combine clips", "compilation" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/stitching.md |
| "webhook", "callback", "notify when done" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/callbacks.md |
| "retry on error", "soft fail", "reliability", "production-ready" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/reliability.md |
"incremental ABR", "add a 1080p rung later", incremental_tag | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/incremental_abr.md |
| "refresh playlist", "playable while encoding", "rolling availability" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/refresh_abr_playlist.md |
DRM recipes:
| User said | Recipe |
|---|---|
| "AES-128", "simple HLS encryption" | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_aes128.md |
"Widevine", "EZDRM Widevine", cenc_drm for Android/Chrome | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_widevine_ezdrm.md |
"PlayReady", "EZDRM PlayReady", cenc_drm for Windows/Xbox | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_playready_ezdrm.md |
"FairPlay", "EZDRM Fairplay", fps_drm for iOS/macOS | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_fairplay_ezdrm.md |
| "BuyDRM", "KeyOS", CPIX request | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_buydrm.md |
| "ExpressPlay", multi-DRM via ExpressPlay | ${CLAUDE_PLUGIN_ROOT}/assets/recipes/drm_expressplay.md |
Combined outputs ("HLS + a poster + extract audio") → one format[] entry per output, all in the same job. Mix recipes as needed.
If no recipe matches, fall back to the schema digest at ${CLAUDE_PLUGIN_ROOT}/assets/schema-digest.md.
Pick the destination shape. Read ${CLAUDE_PLUGIN_ROOT}/assets/storage.md whenever the user mentions:
If the user names no destination at all, omit destination and explicitly tell them outputs will be deleted after ~24 hours.
Fill in user-supplied values (source URL, custom ladder, bucket, etc.). For missing details:
Sanity check before emitting:
{"query": ...} wrapper present.encoder_version: 2 at the top.video_codec, audio_codec, resolution (or sizing equivalent), framerate, keyframe, quality, audio_bitrate live on each stream[] entry — NOT at the format level.*.s3.qencode.com): no key, no secret, no permissions, no storage_class.permissions, no storage_class.two_pass: 1 — use optimize_bitrate: 1 with min_crf/max_crf instead.libfdk_aac unless the user said otherwise.Emit the JSON in a single fenced block. Then add a short, scannable summary covering:
destination was omittedqencode-transcode to submit, or pass it as the query form field to POST /v1/start_encode2.")Do not narrate the composition process — just the JSON and the summary.
Self-study examples live in ${CLAUDE_PLUGIN_ROOT}/skills/qencode-build-query/examples/. Each is a .md file with the user prompt and the expected output. Read one or two if you're unsure of the conventions.
api_key or task_token — those belong to the submission step.{"query": ...} wrapper, ever.best-practices.md silently; if you must, surface why in the summary.${CLAUDE_PLUGIN_ROOT}/assets/best-practices.md — composition defaults${CLAUDE_PLUGIN_ROOT}/assets/storage.md — destinations${CLAUDE_PLUGIN_ROOT}/assets/gotchas.md — non-obvious quirks${CLAUDE_PLUGIN_ROOT}/assets/recipes/*.md — named recipes${CLAUDE_PLUGIN_ROOT}/assets/schema-digest.md — every attribute${CLAUDE_PLUGIN_ROOT}/assets/schema-index.json — fast attribute lookup (for qencode-api-reference)Provides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
npx claudepluginhub qencode-corp/qencode-skills --plugin qencode-skills