ytdl-org/youtube-dl · error · ExtractorError
Letv cloud said: %s
Error message
Letv cloud said: %s
What it means
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.
Source
Thrown at youtube_dl/extractor/leeco.py:325
'bver': 'firefox44.0',
'format': 'json',
'uu': uu,
'vu': vu,
'ran': compat_str(timestamp),
}
self.sign_data(data)
return self._download_json(
'http://api.letvcloud.com/gpc.php?' + compat_urllib_parse_urlencode(data),
media_id, 'Downloading playJson data for type %s' % cf)
play_json = get_play_json(cf, time.time())
# The server time may be different from local time
if play_json.get('code') == 10071:
play_json = get_play_json(cf, play_json['timestamp'])
if not play_json.get('data'):
if play_json.get('message'):
raise ExtractorError('Letv cloud said: %s' % play_json['message'], expected=True)
elif play_json.get('code'):
raise ExtractorError('Letv cloud returned error %d' % play_json['code'], expected=True)
else:
raise ExtractorError('Letv cloud returned an unknown error')
def b64decode(s):
return compat_b64decode(s).decode('utf-8')
formats = []
for media in play_json['data']['video_info']['media'].values():
play_url = media['play_url']
url = b64decode(play_url['main_url'])
decoded_url = b64decode(url_basename(url))
formats.append({
'url': url,
'ext': determine_ext(decoded_url),
'format_id': str_or_none(play_url.get('vtype')),
'format_note': str_or_none(play_url.get('definition')),View on GitHub (pinned to 956b8c5855)
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
Defensive patterns
Strategy: try-catch
Validate before calling
from urllib.parse import urlparse, parse_qs
def letv_cloud_params_complete(url):
q = parse_qs(urlparse(url).query)
return bool(q.get('uu', [''])[0]) and bool(q.get('vu', [''])[0]) Try / catch
try:
ydl.extract_info(url)
except ExtractorError as e:
if 'Letv cloud said:' in str(e):
handle_expired_or_invalid(str(e).split('said:', 1)[1]) # usually permanent
else:
raise Prevention
- Copy uu/vu embed codes verbatim from working players
- Treat message-bearing failures as permanent link expiry; seek a fresh embed
When it happens
Trigger: 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).
Common situations: 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.
Related errors
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/3f29aee57ff44bf1.
Report an issue: GitHub.