{"record":{"id":"d13e3cc6a05f021f","repo":"unslothai/unsloth","slug":"this-video-s-captions-are-empty","errorCode":null,"errorMessage":"This video's captions are empty.","messagePattern":"This video's captions are empty\\.","errorType":"exception","errorClass":"TranscriptUnavailable","httpStatus":null,"severity":"warning","filePath":"studio/backend/core/youtube_transcript.py","lineNumber":130,"sourceCode":"    async with httpx.AsyncClient(timeout = _TIMEOUT, follow_redirects = True) as client:\n        player = await _fetch_player(client, video_id)\n        status = (player.get(\"playabilityStatus\") or {}).get(\"status\")\n        if status not in (None, \"OK\"):\n            raise TranscriptUnavailable(\n                (player.get(\"playabilityStatus\") or {}).get(\"reason\")\n                or \"YouTube will not play this video.\"\n            )\n\n        tracklist = (player.get(\"captions\") or {}).get(\"playerCaptionsTracklistRenderer\") or {}\n        tracks = [t for t in (tracklist.get(\"captionTracks\") or []) if t.get(\"baseUrl\")]\n        if not tracks:\n            raise TranscriptUnavailable(\"This video has no captions.\")\n\n        track = _select_track(tracks, tracklist, languages)\n        text = await _fetch_track_text(client, str(track[\"baseUrl\"]))\n\n    if not text:\n        raise TranscriptUnavailable(\"This video's captions are empty.\")\n    text, truncated = _truncate_transcript(text)\n\n    details = player.get(\"videoDetails\") or {}\n    return Transcript(\n        video_id = video_id,\n        title = str(details.get(\"title\") or \"\"),\n        author = str(details.get(\"author\") or \"\"),\n        length_seconds = _as_int(details.get(\"lengthSeconds\")),\n        language = _track_label(track),\n        language_code = str(track.get(\"languageCode\") or \"\"),\n        is_generated = track.get(\"kind\") == \"asr\",\n        text = text,\n        truncated = truncated,\n    )\n\n\ndef _truncate_transcript(text: str) -> tuple[str, bool]:\n    \"\"\"Bound the transcript so a long video cannot swallow the model's context.\"\"\"","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/youtube_transcript.py#L112-L148","documentation":"TranscriptUnavailable raised after a caption track was successfully selected and fetched, but the resulting text was empty (falsy). The track exists on YouTube's side but yields no usable cues, e.g. all events were filtered out or the payload decoded to nothing.","triggerScenarios":"A caption track whose json3 payload contains only events that flatten to empty text (e.g. only aAppend rolling-newline markers); tracks that exist but were never populated; edge-case payload shapes after the flatten step.","commonSituations":"Placeholder/disabled caption tracks; extremely short videos; YouTube serving an effectively empty track for restricted content.","solutions":["Try a different language track by passing languages= to fetch_transcript so another track is selected.","Retry once — transient empty responses occur under load.","Treat as 'no transcript' and skip or fall back to local transcription, same as the no-captions case."],"exampleFix":"# before\ntranscript = await fetch_transcript(video_id)  # selected track is empty -> raises\n\n# after\ntranscript = await fetch_transcript(video_id, languages=(\"en\", \"en-US\", \"\"))","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    transcript = await fetch_transcript(video_id, languages=(\"en\", \"en-US\"))\nexcept TranscriptUnavailable as e:\n    if \"captions are empty\" in str(e):\n        transcript = await fetch_transcript(video_id)  # retry default track once\n    else:\n        raise","preventionTips":["Pass an explicit languages priority list so a dead track is not selected first.","Treat empty captions like missing captions in product logic (offer fallback transcription).","Retry once before giving up — empty track bodies are often transient."],"tags":["youtube","transcript","empty-response"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}