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

Code before:
        # complex fake url
        'url': 'https://live.eplus.jp/ex/player?ib=YA4Z%2Fz2rpI5cDl3V%2Bx9PI%2FXTGOX0j8IBzPthgx7%2BieWeff6iLcdsdsds1926zosZU9AbB3gdL3wG%2BNa1afQdIf%3D%3D',
        'only_matching': True,
    }]

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

        data_json = self._parse_json(self._html_search_regex(
            r'<script>\s*var app = (.+);\n', webpage, 'data_json'), video_id)

        delivery_status = traverse_obj(data_json, 'delivery_status')
        archive_mode = traverse_obj(data_json, 'archive_mode')

        self.to_screen(f'delivery_status = {delivery_status}, archive_mode = {archive_mode}')

        if delivery_status == 'PREPARING':
            raise UserNotLive('This event has not started yet')
        elif delivery_status == 'STARTED':
            # FIXME: HTTP request headers need to be updated to continue download
            self.report_warning(
                'Due to technical limitations, the download will be interrupted after one hour')
            live_status = 'is_live'
        elif delivery_status == 'STOPPED':
            if archive_mode == 'ON':  # I didn't see values other than "ON"
                raise UserNotLive(
                    'This event has ended, but the archive has not been generated yet')
            raise ExtractorError(
                'This event has ended and there is no archive for this event', expected=True)
        elif delivery_status == 'WAIT_CONFIRM_ARCHIVED':
            raise UserNotLive(
                'This event has ended, and the archive will be available shortly')
        elif delivery_status == 'CONFIRMED_ARCHIVE':
            # FIXME: HTTP request headers need to be updated to continue download
            self.report_warning(
                'Due to technical limitations, the download will be interrupted after one hour. '
                'You can restart to continue the download')
            live_status = 'was_live'
        else:
            raise ExtractorError(f'Unknown delivery_status: {delivery_status}')

        m3u8_playlist_urls = self._html_search_regex(
            r'var listChannels = (.+);\n', webpage, 'listChannels', default=None)
        if not m3u8_playlist_urls:
            self.raise_no_formats(
                'Could not find the playlist URL. This event may not be accessible', expected=True)

        return {
            'id': data_json['app_id'],
            'title': data_json.get('app_name'),

Review comment (suggestion):
```suggestion
            if archive_mode == 'ON':
```

Code after:
            'description': str,
        },
        'params': {
            'skip_download': True,
            'ignore_no_formats_error': True,
        },
        'expected_warnings': [
            'Could not find the playlist URL. This event may not be accessible',
            'No video formats found!',
            'Requested format is not available',
        ],
    }]

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

        data_json = self._search_json(r'<script>\s*var app\s*=', webpage, 'data json', video_id)

        delivery_status = data_json.get('delivery_status')
        archive_mode = data_json.get('archive_mode')
        release_timestamp = try_call(lambda: unified_timestamp(data_json['event_datetime']) - 32400)
        release_timestamp_str = data_json.get('event_datetime_text')  # JST

        self.write_debug(f'delivery_status = {delivery_status}, archive_mode = {archive_mode}')

        if delivery_status == 'PREPARING':
            live_status = 'is_upcoming'
        elif delivery_status == 'STARTED':
            live_status = 'is_live'
        elif delivery_status == 'STOPPED':
            if archive_mode != 'ON':
                raise ExtractorError(
                    'This event has ended and there is no archive for this event', expected=True)
            live_status = 'post_live'
        elif delivery_status == 'WAIT_CONFIRM_ARCHIVED':
            live_status = 'post_live'
        elif delivery_status == 'CONFIRMED_ARCHIVE':
            live_status = 'was_live'
        else:
            self.report_warning(f'Unknown delivery_status {delivery_status}, treat it as a live')
            live_status = 'is_live'

        formats = []

        m3u8_playlist_urls = self._search_json(
            r'var listChannels\s*=', webpage, 'hls URLs', video_id, contains_pattern=r'\[.+\]', default=[])
        if not m3u8_playlist_urls:
            if live_status == 'is_upcoming':
                self.raise_no_formats(
                    f'Could not find the playlist URL. This live event will begin at {release_timestamp_str} JST', expected=True)