ytdl-org/youtube-dl · error · ExtractorError

error_element.attrib['abstract']

Error message

error_element.attrib['abstract']

What it means

Raised by thePlatform base extractor when the SMIL manifest contains an error <smil:ref> whose src points at link.theplatform.<tld>/s/errorFiles/Unavailable.*. The human-readable reason is taken from the element's 'abstract' attribute (e.g. 'This video has been removed...'). It is expected=True, so it is treated as a normal content-unavailable condition, not a bug.

Source

Thrown at youtube_dl/extractor/theplatform.py:51

class ThePlatformBaseIE(OnceIE):
    _TP_TLD = 'com'

    def _extract_theplatform_smil(self, smil_url, video_id, note='Downloading SMIL data'):
        meta = self._download_xml(
            smil_url, video_id, note=note, query={'format': 'SMIL'},
            headers=self.geo_verification_headers())
        error_element = find_xpath_attr(meta, _x('.//smil:ref'), 'src')
        if error_element is not None:
            exception = find_xpath_attr(
                error_element, _x('.//smil:param'), 'name', 'exception')
            if exception is not None:
                if exception.get('value') == 'GeoLocationBlocked':
                    self.raise_geo_restricted(error_element.attrib['abstract'])
                elif error_element.attrib['src'].startswith(
                        'http://link.theplatform.%s/s/errorFiles/Unavailable.'
                        % self._TP_TLD):
                    raise ExtractorError(
                        error_element.attrib['abstract'], expected=True)

        smil_formats = self._parse_smil_formats(
            meta, smil_url, video_id, namespace=default_ns,
            # the parameters are from syfy.com, other sites may use others,
            # they also work for nbc.com
            f4m_params={'g': 'UXWGVKRWHFSP', 'hdcore': '3.0.3'},
            transform_rtmp_url=lambda streamer, src: (streamer, 'mp4:' + src))

        formats = []
        for _format in smil_formats:
            if OnceIE.suitable(_format['url']):
                formats.extend(self._extract_once_formats(_format['url']))
            else:
                media_url = _format['url']
                if determine_ext(media_url) == 'm3u8':
                    hdnea2 = self._get_cookies(media_url).get('hdnea2')
                    if hdnea2:

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Confirm the video still plays on the originating site in a browser; if the site also shows an error, the asset is gone
  2. Update to the latest youtube-dl/yt-dlp; thePlatform handling has been improved in newer forks
  3. If you control the request, ensure any required auth/Referer cookies are available so the SMIL is not degraded to an error file
  4. Handle ExtractorError with expected=True in batch jobs and skip the URL
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ydl.extract_info(theplatform_url)
except ExtractorError as e:
    if e.expected and 'Unavailable' in str(e):
        mark_unavailable(url)  # asset removed upstream; skip permanently

Prevention

When it happens

Trigger: A theplatform-fed site (syfy, nbc, etc.) returns a SMIL whose error ref starts with 'http://link.theplatform.<tld>/s/errorFiles/Unavailable.'; happens when the media was taken down, expired, or is otherwise unavailable while the metadata page still loads.

Common situations: Clips removed after broadcast windows close; season passes expiring; CDN/token mismatch producing Unavailable.smil; embedding sites keeping article pages alive long after the video asset was deleted upstream at thePlatform.

Related errors


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