From aca5d0bf881d6dcf825b898c9832ac56ab04b96c Mon Sep 17 00:00:00 2001 From: Ebenezer Don Date: Thu, 8 Oct 2026 11:52:10 +0100 Subject: [PATCH] Add a draft asset-migration skill split out of cloudinary-video Park the platform-migration content removed from the cloudinary-video skill (PR #23) as an internal use-case skill: intake questions, getting originals instead of delivered renditions, mining an existing site, and the source-platform reference for Brightcove, Vimeo, YouTube, and Wistia. It is video-only today and marked metadata.internal, so it stays out of the default install until the image and raw-file sections exist (DOC-11638). --- skills/use-cases/asset-migration/SKILL.md | 208 ++++++++++++++++++ .../references/source-platforms.md | 125 +++++++++++ 2 files changed, 333 insertions(+) create mode 100644 skills/use-cases/asset-migration/SKILL.md create mode 100644 skills/use-cases/asset-migration/references/source-platforms.md diff --git a/skills/use-cases/asset-migration/SKILL.md b/skills/use-cases/asset-migration/SKILL.md new file mode 100644 index 0000000..95ff21c --- /dev/null +++ b/skills/use-cases/asset-migration/SKILL.md @@ -0,0 +1,208 @@ +--- +name: asset-migration +description: "End-to-end recipe for migrating images, video, and raw files onto Cloudinary from other platforms, storage, and websites. Use when moving assets off Brightcove, Vimeo, YouTube, Wistia, another DAM, cloud storage, or an existing website." +license: MIT +metadata: + author: cloudinary + version: '1.0.0' + internal: true +--- + +# Migrating assets onto Cloudinary + +> **Draft, not ready to publish.** This content was split out of the +> `cloudinary-video` skill (cloudinary-devs/skills#23) so the video skill could +> ship without it. It is video-specific today. The plan is a general migration +> skill: general guidelines plus image-, video-, and raw-file-specific resources, +> with input from Solutions, who handle most enterprise migrations. What is +> still unverified is listed at the end. + +## When to Use + +- Moving an existing image or video library onto Cloudinary from another + platform (Brightcove, Vimeo, YouTube, Wistia) or from customer storage +- Rebuilding an existing website's media on Cloudinary +- Building a page for a named real site or brand, using that site's real media + +## Quick Start + +### Default Best Practices: Apply These to Every Migration + +1. **Upload the master, never what the website delivers.** Delivered files are + transcoded renditions, and uploading one caps quality for every derived + version. See [Get the originals](#get-the-originals-never-the-delivered-renditions). +2. **Use the named site's real media.** Never substitute Cloudinary's `demo` + cloud or other stock assets for a real site or brand without asking first. +3. **Keep human-authored metadata.** Captions, chapters, titles, and tags a + person wrote beat regenerated ones. Carry them over. +4. **Record the old-to-new mapping** (old asset or embed reference to new public + ID) so rewiring is mechanical and verifiable. +5. **Fall back in order: fetch, then ask them to provide, then ask them to + map.** Never silently substitute a scraped rendition. +6. **Say what had no Cloudinary equivalent** rather than approximating it. + +## Start here + +**Is this a migration or a build from scratch?** A migration gives you three +things at once: the media, the conventions to match (layout, naming, +structure), and human-authored metadata worth more than anything regenerated. +From scratch, the builder supplies the sources; do not go looking. + +**Are the assets already on a Cloudinary cloud?** If so, there is nothing to +migrate. Do not re-upload them. + +**Where are the resources?** + +| Source | What it means | +| --- | --- | +| **An existing website** | Try to fetch it for them; otherwise ask them to provide or map it. The site is also your source of guidelines and mapping (see below). | +| **Another video platform** | Get the original from the platform's API or the customer's masters. See [references/source-platforms.md](references/source-platforms.md). | +| **Customer storage** | Ask for access or the files. | + +**A named real site is never a cue to reach for Cloudinary's `demo` cloud or +any other stock/sample assets.** If the user names a real site or brand +("build a page for gap.com"), you must actually open that site and pull its +real images/video before writing any page code. Do not silently substitute +placeholder assets because fetching feels slower or the site has no obvious +video element. Only fall back to demo/stock assets if, after actually trying, +the real assets are genuinely unreachable (login-gated, blocked, no usable +media), and even then, say so explicitly and ask the user before +substituting anything. Silently swapping in demo-cloud assets for a named +brand is the single failure mode this rule exists to prevent. + +**Where does it land: an existing cloud, or a new claimable one?** On an +existing cloud, respect existing folders, naming, and presets, and be +idempotent: re-runs cost real quota and can overwrite live assets. A fresh +claimable cloud expects no add-ons; provisioning and upload are covered by the +cloudinary-video skill. + +## Get the originals, never the delivered renditions + +**Find the video in the raw HTML, not in a browser's DOM.** `curl` the page +and grep the source *first*: + +```sh +curl -s -A "" "" -o page.html +grep -oE '[A-Za-z0-9_-]+\.(mp4|m3u8|webm|mov)' page.html | sort -u +``` + +**Do not conclude "this site has no video" from `document.querySelectorAll`.** +An automated/headless browser's DOM is systematically *less complete* than +what a real user sees, and it fails silently: you get a clean empty array, +not an error: + +- On a React/Next.js site the `