ytdl-org/youtube-dl · error · ExtractorError

This video is no longer available.

Error message

This video is no longer available.

What it means

Raised by TeamcocoIE._real_extract when the slug lookup POST to teamcoco.com/graphql returns the NotFoundSlug variant with a truthy status field — i.e. the Conan (Team Coco) site has no record for the display id parsed from the URL. The video page slug was removed, renamed, or never existed. Marked expected=True.

Source

Thrown at youtube_dl/extractor/teamcoco.py:131

        response = self._graphql_call('''{
  %%s(slug: "%%s") {
    ... on RecordSlug {
      record {
        %s
      }
    }
    ... on PageSlug {
      child {
        id
      }
    }
    ... on NotFoundSlug {
      status
    }
  }
}''' % self._RECORD_TEMPL, 'Slug', display_id)
        if response.get('status'):
            raise ExtractorError('This video is no longer available.', expected=True)

        child = response.get('child')
        if child:
            record = self._graphql_call('''{
  %%s(id: "%%s") {
    ... on Video {
      %s
    }
  }
}''' % self._RECORD_TEMPL, 'Record', child['id'])
        else:
            record = response['record']
        video_id = record['id']

        info = {
            'id': video_id,
            'display_id': display_id,
            'title': record['title'],

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Confirm the URL opens on teamcoco.com; if it 404s, search the site for the clip and use the current slug.
  2. Find the clip on Team Coco's YouTube channel and extract from there instead.
  3. In batch jobs, catch this expected error and mark the slug retired rather than retrying.
Defensive patterns

Strategy: try-catch

Validate before calling

# Optional: pre-validate the slug via the same GraphQL endpoint
import json, urllib.request
q = '{ findSlug(slug: "%s") { ... on NotFoundSlug { status } } }' % slug
req = urllib.request.Request('https://teamcoco.com/graphql', data=json.dumps({'query': q}).encode(), headers={'Content-Type': 'application/json'})
resp = json.load(urllib.request.urlopen(req))['data']['findSlug']
if resp.get('status'):
    print('slug retired:', slug)

Try / catch

try:
    info = ydl.extract_info(url)
except ExtractorError as e:
    if e.expected and 'no longer available' in str(e):
        mark_slug_retired(slug)
    else:
        raise

Prevention

When it happens

Trigger: Extracting a teamcoco.com URL whose slug query resolves to {... on NotFoundSlug { status }} with non-empty status; note the extractor's own test carries skip='This video is no longer available.' because the old test clip was taken down.

Common situations: Conan clips deleted or re-slugged after site redesigns (the source tree itself marks one test as permanently unavailable); stale links from forums/Reddit; typo'd slugs.

Related errors


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/859dadda6c98a3f9. Report an issue: GitHub.