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

Code before:
        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':
            # FFmpeg is unable to update HTTP request headers during download.
            self.report_warning(
                'Due to technical limitations, the download will be interrupted after one hour.')
            live_status = 'is_live'
        elif delivery_status == 'STOPPED':
            # check archive status
            errmsg = 'This event has been ended. '
            if archive_mode == 'ON':  # I didn't see values other than "ON"
                raise UserNotLive(errmsg + 'The archive has not been generated yet.')
            else:
                raise ExtractorError(errmsg + 'No archive for this event.', expected=True)
        elif delivery_status == 'WAIT_CONFIRM_ARCHIVED':
            raise UserNotLive('The archive will be available shortly.')
        elif delivery_status == 'CONFIRMED_ARCHIVE':
            # The archive may be available.
            # TODO: how to update HTTP request headers for "HlsFD" during 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}', expected=False)

        # TODO: if there are multiple playlists, tell me.
        m3u8_playlist_urls = self._html_search_regex(
            r'var listChannels = (.+);\n', webpage, 'listChannels', default=None)
        if not m3u8_playlist_urls:
            raise ExtractorError(
                'Could not find the playlist URL. This event may not be accessible.', expected=True)

        return {
            # mandatory metafields

            'id': data_json['app_id'],
            'title': data_json['app_name'],
            'formats': self._extract_m3u8_formats(m3u8_url=traverse_obj(self._parse_json(
                m3u8_playlist_urls, video_id), 0), video_id=video_id),

            # optional metafields

            'live_status': live_status,
            'description': traverse_obj(data_json, 'content'),
            'timestamp': calendar.timegm((datetime.datetime.strptime(
                traverse_obj(data_json, 'event_datetime'), '%Y%m%d%H%M')
                - datetime.timedelta(hours=9)).timetuple()),
        }


Review comment (refactor):
```suggestion
        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}')
```

Code after:
        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)
            else:
                self.raise_no_formats(
                    'Could not find the playlist URL. This event may not be accessible', expected=True)
        elif live_status == 'is_upcoming':
            self.raise_no_formats(f'This live event will begin at {release_timestamp_str} JST', expected=True)
        elif live_status == 'post_live':
            self.raise_no_formats('This event has ended, and the archive will be available shortly', expected=True)
        else:
            for m3u8_playlist_url in m3u8_playlist_urls:
                formats.extend(self._extract_m3u8_formats(m3u8_playlist_url, video_id))
            # FIXME: HTTP request headers need to be updated to continue download
            warning = 'Due to technical limitations, the download will be interrupted after one hour'
            if live_status == 'is_live':
                self.report_warning(warning)
            elif live_status == 'was_live':