Repository: yt-dlp/yt-dlp
File: yt_dlp/extractor/asobichannel.py (Python)

Code before:
            'https://asobichannel-api.asobistore.jp/api/v1/vspf/token', video_id,
            note='Retrieving API token')
        return {'Authorization': f'Bearer {request_token}'}

    def _process_vod(self, video_id, metadata):
        content_id = metadata['contents']['video_id']

        vod_data = self._download_json(
            f'https://survapi.channel.or.jp/proxy/v1/contents/{content_id}/get_by_cuid', video_id,
            headers=self._get_survapi_header(video_id), note='Downloading vod data')

        m3u8_url = vod_data['ex_content']['streaming_url']

        return {
            'formats': self._extract_m3u8_formats(m3u8_url, video_id),
        }

    def _process_live(self, video_id, metadata):
        now_ts = datetime.datetime.now().timestamp()

        content_id = metadata['contents']['video_id']

        live_start = traverse_obj(metadata, ('period', 'start', {parse_iso8601}))
        if live_start is None:
            live_status = None
        elif now_ts < live_start:
            live_status = 'is_upcoming'
        else:
            live_status = 'is_live'

        event_data = self._download_json(
            f'https://survapi.channel.or.jp/ex/events/{content_id}?embed=channel', video_id,
            headers=self._get_survapi_header(video_id), note='Downloading event data')

        live_url = event_data['data']['Channel']['Custom_live_url']

        return {
            'live_status': live_status,
            'formats': self._extract_m3u8_formats(live_url, video_id),
        }

    def _real_extract(self, url):
        video_id = self._match_id(url)

        metadata = self._download_json(
            f'https://channel.microcms.io/api/v1/media/{video_id}', video_id,
            headers=self._MICROCMS_HEADER)

        info = self._extract_info(metadata)

        video_type = traverse_obj(metadata, ('contents', 'video_type', 0))

Review comment (suggestion):
This seems odd. Could we maybe use the `Player_type` to determine if a stream is upcoming? i.e. `"poster"` = upcoming?

Upcoming streams currently also seem to error due to a 404 response from the streaming endpoint.

Code after:
        },
    }]

    _survapi_header = None

    def _real_initialize(self):
        token = self._download_json(
            'https://asobichannel-api.asobistore.jp/api/v1/vspf/token', None,
            note='Retrieving API token')
        self._survapi_header = {'Authorization': f'Bearer {token}'}

    def _process_vod(self, video_id, metadata):
        content_id = metadata['contents']['video_id']

        vod_data = self._download_json(
            f'https://survapi.channel.or.jp/proxy/v1/contents/{content_id}/get_by_cuid', video_id,
            headers=self._survapi_header, note='Downloading vod data')

        return {
            'formats': self._extract_m3u8_formats(vod_data['ex_content']['streaming_url'], video_id),
        }

    def _process_live(self, video_id, metadata):
        content_id = metadata['contents']['video_id']
        event_data = self._download_json(
            f'https://survapi.channel.or.jp/ex/events/{content_id}?embed=channel', video_id,
            headers=self._survapi_header, note='Downloading event data')

        player_type = traverse_obj(event_data, ('data', 'Player_type', {str}))
        if player_type == 'poster':
            self.raise_no_formats('Live event has not yet started', expected=True)
            live_status = 'is_upcoming'
            formats = []
        elif player_type == 'player':
            live_status = 'is_live'
            formats = self._extract_m3u8_formats(
                event_data['data']['Channel']['Custom_live_url'], video_id, live=True)
        else:
            raise ExtractorError('Unsupported player type {player_type!r}')

        return {
            'release_timestamp': traverse_obj(metadata, ('period', 'start', {parse_iso8601})),
            'live_status': live_status,
            'formats': formats,
        }

    def _real_extract(self, url):
        video_id = self._match_id(url)

        metadata = self._download_json(
            f'https://channel.microcms.io/api/v1/media/{video_id}', video_id,