def METHOD_NAME(self, webpage, video_id, name, is_live):
    window_stores = self._extract_pagestore(webpage, video_id)
    movie_stores = [
        # extract all three important data (most of data are duplicated each other, but slightly different!)
        traverse_obj(window_stores, ('v8', 'state', 'movie'), expected_type=dict),
        traverse_obj(window_stores, ('v8', 'movie'), expected_type=dict),
        traverse_obj(window_stores, 'movieStore', expected_type=dict),
    ]
    if not any(movie_stores):
        raise ExtractorError(f'Failed to extract {name} info')
    formats = list(self._expand_media(video_id, get_first(movie_stores, 'media')))
    if not formats:
        # archived livestreams or subscriber-only videos
        cookies = self._get_cookies('https://www.openrec.tv/')
        detail = self._download_json(
            f'https://apiv5.openrec.tv/api/v5/movies/{video_id}/detail', video_id,
            headers={
                'Origin': 'https://www.openrec.tv',
                'Referer': 'https://www.openrec.tv/',
                'access-token': try_get(cookies, lambda x: x.get('access_token').value),
                'uuid': try_get(cookies, lambda x: x.get('uuid').value),
            })
        new_media = traverse_obj(detail, ('data', 'items', ..., 'media'), get_all=False)
        formats = list(self._expand_media(video_id, new_media))
        is_live = False
    return {
        'id': video_id,
        'title': get_first(movie_stores, 'title'),
        'description': get_first(movie_stores, 'introduction'),
        'thumbnail': get_first(movie_stores, 'thumbnailUrl'),
        'formats': formats,
        'uploader': get_first(movie_stores, ('channel', 'user', 'name')),
        'uploader_id': get_first(movie_stores, ('channel', 'user', 'id')),
        'timestamp': int_or_none(get_first(movie_stores, ['publishedAt', 'time']), scale=1000) or unified_timestamp(get_first(movie_stores, 'publishedAt')),
        'is_live': is_live,
    }