{"record":{"id":"c94b743cdd69804e","repo":"ytdl-org/youtube-dl","slug":"unsupported-clip-storage-location-s","errorCode":null,"errorMessage":"Unsupported clip storage location \"%s\"","messagePattern":"Unsupported clip storage location \"(.+?)\"","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/clipchamp.py","lineNumber":45,"sourceCode":"            'thumbnail': r're:^https?://.+\\.jpg',\n        },\n        'params': {\n            'skip_download': 'm3u8',\n            'format': 'bestvideo',\n        },\n    }]\n\n    _STREAM_URL_TMPL = 'https://%s.cloudflarestream.com/%s/manifest/video.%s'\n    _STREAM_URL_QUERY = {'parentOrigin': 'https://clipchamp.com'}\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n        data = self._search_nextjs_data(webpage, video_id)['props']['pageProps']['video']\n\n        storage_location = data.get('storage_location')\n        if storage_location != 'cf_stream':\n            raise ExtractorError('Unsupported clip storage location \"%s\"' % (storage_location,))\n\n        path = data['download_url']\n        iframe = self._download_webpage(\n            'https://iframe.cloudflarestream.com/' + path, video_id, 'Downloading player iframe')\n        subdomain = self._search_regex(\n            r'''\\bcustomer-domain-prefix\\s*=\\s*(\"|')(?P<sd>[\\w-]+)\\1''', iframe,\n            'subdomain', group='sd', fatal=False) or 'customer-2ut9yn3y6fta1yxe'\n\n        formats = self._extract_mpd_formats(\n            self._STREAM_URL_TMPL % (subdomain, path, 'mpd'), video_id,\n            query=self._STREAM_URL_QUERY, fatal=False, mpd_id='dash')\n        formats.extend(self._extract_m3u8_formats(\n            self._STREAM_URL_TMPL % (subdomain, path, 'm3u8'), video_id, 'mp4',\n            query=self._STREAM_URL_QUERY, fatal=False, m3u8_id='hls'))\n\n        return merge_dicts({\n            'id': video_id,\n            'formats': formats,","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/clipchamp.py#L27-L63","documentation":"Raised by ClipchampIE when the Next.js video data's 'storage_location' field is anything other than 'cf_stream'. Clipchamp stores exports on different backends (e.g. Microsoft/OneDrive-backed or pending storage); the extractor only implements retrieval from Cloudflare Stream manifests, so other locations are rejected with the actual value in the message.","triggerScenarios":"Extracting a clipchamp.com video whose export was stored on a non-Cloudflare backend, or a project whose video is not fully processed/published yet (storage_location may be null or a different enum).","commonSituations":"Older clips created before the Cloudflare Stream backend; drafts/unprocessed exports; Microsoft-era Clipchamp storage changes.","solutions":["Open the clip in a browser; if it does not play there either, re-export or publish the project first.","If it plays, note the actual storage_location value in the error — a different backend means this extractor cannot help; use the browser's network tab to find a direct media URL.","Update to yt-dlp, whose Clipchamp support may cover more backends.","For your own projects, re-download/export directly from the Clipchamp UI."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import json, re\ndef storage_is_supported(html):\n    m = re.search(r'<script[^>]+id=\"__NEXT_DATA__\"[^>]*>([^<]+)</script>', html)\n    if not m:\n        return False\n    video = json.loads(m.group(1))['props']['pageProps']['video']\n    return video.get('storage_location') == 'cf_stream'","typeGuard":"def is_cf_stream_video(video_data):\n    return (\n        isinstance(video_data, dict)\n        and video_data.get('storage_location') == 'cf_stream'\n        and bool(video_data.get('download_url'))\n    )","tryCatchPattern":"from youtube_dl.utils import ExtractorError\ntry:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'Unsupported clip storage location' in str(e):\n        # different backend; fetch media URL manually from browser network tab\n        log('storage backend %s not supported', extract_location(e))\n    else:\n        raise","preventionTips":["Check the clip plays and is fully processed in the Clipchamp UI first.","For your own projects, download exports directly from the UI.","Handle non-cf_stream storage as permanent for this extractor."],"tags":["clipchamp","cloudflare-stream","storage","unsupported"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}