← WistiaCONTENT HISTORY

Update to Wistia

Snapshot Sep 30, 2026 · 22:53 UTC · version 3.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "wistia-language-audit",
  "description": "Audits which languages the audience of Wistia's top-performing videos actually watches in, checks whether transcript translations (captions/subtitles) and video dubs already exist in those languages, and reports the gaps ranked by measured audience demand. Use this skill whenever the user asks for a \"language audit,\" wants to know \"what languages should I dub/translate my videos into,\" asks to \"audit my video languages,\" \"find missing translations/dubs,\" or anything about matching video localization to viewer language demand. Do NOT trigger for one-off single-video captioning/dubbing requests with no audience-analysis component — use the Wistia tools directly for those.",
  "included_files": [
    {
      "relative_path": "references/language-codes.md",
      "size_in_bytes": 3455
    }
  ],
  "skill_md_contents": "---\nname: wistia-language-audit\ndescription: >\n  Audits which languages the audience of Wistia's top-performing videos actually watches\n  in, checks whether transcript translations (captions/subtitles) and video dubs already\n  exist in those languages, and reports the gaps ranked by measured audience demand. Use\n  this skill whenever the user asks for a \"language audit,\" wants to know \"what languages\n  should I dub/translate my videos into,\" asks to \"audit my video languages,\" \"find\n  missing translations/dubs,\" or anything about matching video localization to viewer\n  language demand. Do NOT trigger for one-off single-video captioning/dubbing requests\n  with no audience-analysis component — use the Wistia tools directly for those.\n---\n\n# Wistia Language Audit\n\n## Welcome message\n\nShow this to the user before starting the workflow:\n\n> Let's find out what languages your viewers actually speak, and where your captions and dubs have gaps.\n>\n> Nothing to prepare. I'll pull your analytics and existing translations myself.\n>\n> You'll get a coverage report showing exactly which translations and dubs are missing, ranked by real audience demand.\n\n---\n\nFinds the account's top-performing videos, figures out what languages their viewers\nactually speak (from analytics, not guesses), and audits existing transcript translations\nand dubs against that language demand.\n\nAll Wistia actions use the Wistia MCP tools — call `tool_search` for the relevant tool\nname before each new tool family, since these are deferred tools and their exact\nparameters aren't in context by default. Read `references/language-codes.md` before Step\n3 — the analytics, captions, and dub tools use different language code formats and this\nskill fails silently (comparing the wrong codes) if you skip that step.\n\n**This skill is read-only.** It audits and reports; it never creates translations or\ndubs or makes any other changes to the account. Filling the gaps is done by the user in\nthe Wistia app.\n\n---\n\n## Step 1: Parameters (ask, don't assume)\n\nAsk the user, using `ask_user_input_v0` where helpful:\n\n1. **Date range** for \"top performing\" and \"audience language\" — default to last 90 days\n   if they have no preference, but confirm.\n2. **How many top videos** (N) to audit — e.g. top 5 / top 10 / top 20.\n3. **How many top languages** (or a minimum share threshold, e.g. \"languages with ≥5% of\n   plays\") to target per the aggregate audience — this determines what counts as a \"gap.\"\n\nTop videos are ranked by **plays, tie-broken by engagement rate** (the account's\nestablished default — don't re-ask this each run unless the user wants to change it).\n\n---\n\n## Step 2: Identify top videos with a transcript\n\nOnly consider videos that already have a transcript (i.e. at least one caption track,\nalmost always the source-language one auto-generated on upload). This is a deliberate\nfilter, not an optimization to skip — Wistia accounts reliably surface non-content media at\nthe top of raw play counts: UI loop assets, \"don't delete\" test/synthetic media, silent\nB-roll, short onboarding-flow snippets. None of that is a sensible localization candidate,\nand a transcript is the cheapest reliable proxy for \"this is spoken content someone should\nwatch in their own language.\" Do this filtering **before** ranking, not as a post-hoc\ncleanup step — it changes which N videos qualify, not just how they're displayed.\n\n1. Call `show-account-top-content` with `group_by: media`, `sort_by: plays`,\n   `sort_direction: desc`, the chosen date range, and a generous `per_page` (150–200) to\n   get a large candidate pool — the qualifying N will be a subset of this, and how large a\n   subset varies a lot by account.\n2. Walk the candidates in ranked order and check each one for an existing transcript via\n   `get-captions` with `media_id` set to that candidate's hashed_id. `returned_count > 0`\n   means it has a transcript; qualifies. `returned_count == 0` means no transcript; skip it\n   without spending further calls on it.\n   - Note: `get-captions` returns full caption text per language, not just a summary — this\n     is unavoidable but fine; you only need `returned_count` from each response, don't\n     dwell on the text.\n   - Do **not** use the account-wide `get-captions` call (omitting `media_id`) to try to\n     shortcut this — it returns full SRT text for every caption track on the account with\n     no media-linking field, so it can't be matched back to a specific video and is far\n     more expensive than checking candidates one at a time.\n3. Stop once you have N qualifying videos. If there are ties on plays at the cutoff among\n   qualifying videos, break them using `engagement_rate` from the same top-content\n   response.\n4. This can take a lot of individual `get-captions` calls on accounts with a lot of\n   non-content media mixed into top plays (dozens, sometimes) — that's expected, not a\n   sign something's wrong. Keep going without narrating each check; report the final\n   qualifying list, not the rejected candidates.\n\nKeep the full analytics row per qualifying video (plays, engagement_rate, played_time,\nmedia_duration) — you'll want it in the final report, and `media_duration` feeds the\nreport's duration column directly (skip the separate `get-medias` duration lookup in Step\n4 when this is already present; only fall back to `get-medias` if `media_duration` came\nback null).\n\n---\n\n## Step 3: Identify top audience languages\n\nFor each of the N videos, call `show-media-languages` over the same date range. This\nreturns viewer plays broken down by browser language.\n\n- **Normalize codes first** — see `references/language-codes.md`. Collapse regional\n  variants (e.g. `es-MX`, `es-ES`) to the base language unless a variant has meaningfully\n  distinct volume and the user cares about the distinction.\n- **Aggregate** play counts per language across all N videos to get one account-wide\n  ranked list of audience languages.\n- Apply the threshold/count from Step 1 to get the **target language set** — the\n  languages this audit will check every top video against.\n\nAlways exclude the video's own source/original language from the target set (no point\n\"translating\" a video into the language it's already in).\n\n---\n\n## Step 4: Audit existing coverage\n\nFor each of the N videos, against the target language set:\n\n- Call `get-captions` (filtered to that `media_id`) to see which transcript/caption\n  languages already exist.\n- Call `gets-localizations` for that `mediaHashedId` to see which dubbed languages already\n  exist.\n- Map each result's 3-letter code back to a language name using the reference table, and\n  mark each (video × target language) cell as:\n  - ✅ have both transcript translation + dub\n  - 📝 transcript translation only, dub missing\n  - 🎙️ dub only, transcript translation missing (unusual, but possible)\n  - ❌ have neither — both needed\n\nDuration for the report should already be in hand from Step 2's `media_duration` field\n(seconds). Only call `get-medias` here if that came back null for a particular video —\nflag it as a fallback lookup, not the default path.\n\n---\n\n## Step 5: Report the gaps\n\n**Present both a targeted and a full-coverage gap list, and recommend targeted.**\nApplying the account-wide target language set uniformly to every video (full coverage)\nroutinely produces a materially larger, wasteful list — a video with zero measured plays\nin a target language still gets flagged for a dub in it. Targeted means: only flag a\n(video, language) dub gap where that specific video shows meaningful demand for that\nlanguage (default threshold: ≥5 plays over the date range; mention the threshold used and\nlet the user move it). Show both lists so the user can see the difference and pick, but\nlead with targeted as the default recommendation. Transcript translation gaps stay listed\nfor any language with >0 plays regardless of threshold — there's no reason to be\nconservative there.\n\nFlag videos with **zero plays across every target language** separately and recommend\ndeprioritizing them, even if they're missing every transcript/dub — being missing isn't\nthe same as being wanted; a video with no demonstrated audience in any target language\nhas nothing to localize into yet.\n\nPresent a clear table: video title | duration | language | what's missing | plays in that\nlanguage. Rank by plays in the missing language so the biggest gaps lead.\n\n---\n\n## Step 6: Final summary\n\nRecap what was found:\n\n```\n📊 Audit: top [N] videos, [date range], target languages: [list]\n🌍 Coverage gaps found: [X transcript translations, Y dubs]\n🎯 Recommended first: [the targeted gaps with the most measured demand]\n❓ Flagged: [any videos with unknown duration, ambiguous codes, or no demand in any target language]\n```\n\nNote that transcript translations, dubs, and captions are added from the Wistia app, and\nthat the audit can be re-run after changes to confirm the gaps are closed.\n\n---\n\n## Handling gaps and edge cases\n\n- **Video has no clear source language** (e.g. no primary transcript) → note it in the\n  audit rather than guessing.\n- **Ambiguous language code** not in the reference table → look it up, state the mapping\n  you used in the audit output, don't silently assume.\n- **User wants to re-run with different N/date range/threshold** → just re-run Steps 1–5.\n- **Duration unavailable for a video** → show its duration as unknown in the report,\n  don't guess a number.\n- **Very few or no videos qualify with a transcript** → say so plainly rather than quietly\n  lowering N or substituting non-transcript videos; ask whether to widen the candidate pool\n  (larger `per_page` in Step 2) or proceed with fewer than N videos.\n- **A qualifying video has a transcript but shows zero plays in every target language** →\n  keep it in the audit for completeness but exclude it from the recommended list\n  (see Step 5); don't silently drop it from the report either.\n"
}

SHA-256: aa1a6c826d015972622b8a4070f2900fcdf3c5e94804859b9a31cca0d1734e71