{"record":{"id":"319825b331563c42","repo":"yt-dlp/yt-dlp","slug":"cannot-find-on-air-video-id-channel","errorCode":null,"errorMessage":"Cannot find on-air {video_id} channel.","messagePattern":"Cannot find on-air (.+?) channel\\.","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"yt_dlp/extractor/abematv.py","lineNumber":372,"sourceCode":"            info['season_number'] = seri if seri < 100 else None\n            # some anime like Detective Conan (though not available in AbemaTV)\n            # has more than 1000 episodes (1026 as of 2021/11/15)\n            info['episode_number'] = epis if epis < 2000 else None\n\n        is_live, m3u8_url = False, None\n        availability = 'public'\n        if video_type == 'now-on-air':\n            is_live = True\n            channel_url = 'https://api.abema.io/v1/channels'\n            if video_id == 'news-global':\n                channel_url = update_url_query(channel_url, {'division': '1'})\n            onair_channels = self._download_json(channel_url, video_id)\n            for ch in onair_channels['channels']:\n                if video_id == ch['id']:\n                    m3u8_url = ch['playback']['hls']\n                    break\n            else:\n                raise ExtractorError(f'Cannot find on-air {video_id} channel.', expected=True)\n        elif video_type == 'episode':\n            api_response = self._download_json(\n                f'https://api.abema.io/v1/video/programs/{video_id}', video_id,\n                note='Checking playability',\n                headers=headers)\n            if not traverse_obj(api_response, ('label', 'free', {bool})):\n                # cannot acquire decryption key for these streams\n                self.report_warning('This is a premium-only stream')\n                availability = 'premium_only'\n            info.update(traverse_obj(api_response, {\n                'series': ('series', 'title'),\n                'season': ('season', 'name'),\n                'season_number': ('season', 'sequence'),\n                'episode_number': ('episode', 'number'),\n            }))\n            if not title:\n                title = traverse_obj(api_response, ('episode', 'title'))\n            if not description:","sourceCodeStart":354,"sourceCodeEnd":390,"githubUrl":"https://github.com/yt-dlp/yt-dlp/blob/81ecd58b1394793e6da9998cc19fdb45657f1685/yt_dlp/extractor/abematv.py#L354-L390","documentation":"For AbemaTV 'now-on-air' URLs the extractor downloads the live channel list from api.abema.io/v1/channels (with division=1 for news-global) and linearly matches video_id against each channel's id to grab its HLS playback URL. If the loop completes with no match, this expected ExtractorError is raised: the channel slug in your URL is not currently broadcasting (or not present in the API's response).","triggerScenarios":"A URL like https://abema.tv/now-on-air/SLUG where SLUG is not among onair_channels['channels'][*]['id'] — e.g. the channel went off-air and Abema rotated slugs, a typo in the slug, or the API returned a reduced channel set because of geoblocking (Abema is Japan-only).","commonSituations":"Watching a time-limited live channel that ended; copied stale URLs; accessing Abema from outside Japan without a JP exit node so the channels payload differs; scheduled channels that have not started.","solutions":["Pick a current live channel from https://abema.tv/now-on-air and use that fresh URL/slug","Double-check the slug spelling against the site; news-global is the special-cased id for the news division","If outside Japan, route through a JP VPN/proxy (or --proxy) — Abema geo-restricts its API responses","Update yt-dlp in case the API contract changed, then retest with -v"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from yt_dlp.utils import ExtractorError\ntry:\n    info = ydl.extract_info(url, download=True)\nexcept ExtractorError as e:\n    if e.expected and 'Cannot find on-air' in str(e):\n        logger.info('channel off-air or geo-blocked; refresh the now-on-air slug: %s', url)\n    else:\n        raise","preventionTips":["Resolve live slugs dynamically from abema.tv/now-on-air instead of caching channel URLs","Outside Japan, configure a JP proxy consistently for both page and API requests","Treat expected=true extractor errors as 'skip and refresh channel list', not as bugs"],"tags":["abematv","extractor","live-stream","channel-not-found","geo-restriction"],"backgroundTag":"content-unavailable","analyzedSha":"81ecd58b1394793e6da9998cc19fdb45657f1685","analyzedAt":"2026-08-22T12:21:25.439Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}