{"record":{"id":"3f29aee57ff44bf1","repo":"ytdl-org/youtube-dl","slug":"letv-cloud-said-s","errorCode":null,"errorMessage":"Letv cloud said: %s","messagePattern":"Letv cloud said: (.+?)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/leeco.py","lineNumber":325,"sourceCode":"                'bver': 'firefox44.0',\n                'format': 'json',\n                'uu': uu,\n                'vu': vu,\n                'ran': compat_str(timestamp),\n            }\n            self.sign_data(data)\n            return self._download_json(\n                'http://api.letvcloud.com/gpc.php?' + compat_urllib_parse_urlencode(data),\n                media_id, 'Downloading playJson data for type %s' % cf)\n\n        play_json = get_play_json(cf, time.time())\n        # The server time may be different from local time\n        if play_json.get('code') == 10071:\n            play_json = get_play_json(cf, play_json['timestamp'])\n\n        if not play_json.get('data'):\n            if play_json.get('message'):\n                raise ExtractorError('Letv cloud said: %s' % play_json['message'], expected=True)\n            elif play_json.get('code'):\n                raise ExtractorError('Letv cloud returned error %d' % play_json['code'], expected=True)\n            else:\n                raise ExtractorError('Letv cloud returned an unknown error')\n\n        def b64decode(s):\n            return compat_b64decode(s).decode('utf-8')\n\n        formats = []\n        for media in play_json['data']['video_info']['media'].values():\n            play_url = media['play_url']\n            url = b64decode(play_url['main_url'])\n            decoded_url = b64decode(url_basename(url))\n            formats.append({\n                'url': url,\n                'ext': determine_ext(decoded_url),\n                'format_id': str_or_none(play_url.get('vtype')),\n                'format_note': str_or_none(play_url.get('definition')),","sourceCodeStart":307,"sourceCodeEnd":343,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/leeco.py#L307-L343","documentation":"Raised by the Letv Cloud extractor when the gpc.php playJson response has no 'data' payload but does carry a 'message' field. The message text from Letv Cloud is included. It is expected=True and usually reports expired/invalid uu/vu parameters or removed videos.","triggerScenarios":"Embedding-style Letv Cloud URLs (with uu= and vu= params) whose signed gpc.php request returns a JSON without data but with message — expired link signatures, deleted cloud videos, or an invalid uu/vu combination (note the code retries once with the server timestamp when code==10071 before giving up).","commonSituations":"Old embed codes from third-party sites whose Letv Cloud assets expired; vu ids that were deleted; clock skew initially producing code 10071 and the retry still failing; sites migrating off Letv Cloud leaving dead embeds.","solutions":["Read the embedded Letv message — 'expired' style messages mean the embed link itself is dead and you must find a new source","Confirm uu and vu parameters were copied completely from the embed code","Try the parent page in a browser to see if its player still works at all","If the content survives on another platform, switch to that platform's URL"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"from urllib.parse import urlparse, parse_qs\n\ndef letv_cloud_params_complete(url):\n    q = parse_qs(urlparse(url).query)\n    return bool(q.get('uu', [''])[0]) and bool(q.get('vu', [''])[0])","typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'Letv cloud said:' in str(e):\n        handle_expired_or_invalid(str(e).split('said:', 1)[1])  # usually permanent\n    else:\n        raise","preventionTips":["Copy uu/vu embed codes verbatim from working players","Treat message-bearing failures as permanent link expiry; seek a fresh embed"],"tags":["letv-cloud","api-error","expired-link","extractor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}