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

Code before:
                'entries': entries,
                'title': title,
                'id': 'c' + video_id if video_type == 'clip' else video_id,
            }


class CSpanCongressIE(InfoExtractor):
    _VALID_URL = r'https?://(?:www\.)?c-span\.org/congress/'
    IE_DESC = 'C-SPAN'
    _TESTS = [{
        'url': 'https://www.c-span.org/congress/?chamber=house&date=2017-12-13&t=1513208380',
        'info_dict': {
            'id': 'Congressional Chronicle - Members of Congress, Hearings and More | C-SPAN.org',
            'title': 'Congressional Chronicle - Members of Congress, Hearings and More',
            'description': 'md5:54c264b7a8f219937987610243305a84',
            'ext': 'mp4'
        }
    }]

    def _real_extract(self, url):
        display_id = self._generic_id(url)
        webpage = self._download_webpage(url, display_id)
        file = open("sample.txt", "w")
        file.write(webpage)
        file.close()
        video_url = re.findall(r'sources: \[\{file: \'(.*?)\'\}\],', webpage)[0]
        formats = self._extract_m3u8_formats(video_url, display_id, ext='mp4')
        self._sort_formats(formats)

        basic_url = "/".join(url.rstrip('/').split('/')[:3])
        for f in formats:
            f.setdefault('http_headers', {})['referer'] = basic_url + "/"
            f.setdefault('http_headers', {})['origin'] = basic_url
            f.setdefault('http_headers', {})['accept'] = "*/*"
            f.setdefault('http_headers', {})['sec-fetch-dest'] = "empty"
            f.setdefault('http_headers', {})['sec-fetch-mode'] = "cors"
            f.setdefault('http_headers', {})['sec-fetch-site'] = "cross-site"

        title = self._og_search_title(webpage, default=None) or self._html_search_regex(
            r'(?s)<title>(.*?)</title>', webpage, 'video title')
        description = self._og_search_description(webpage, default=None) or self._html_search_meta(
            'description', webpage, 'meta description', default=None)

        return {
            'id': title,
            'title': re.sub(r'\s+', ' ', title.split('|')[0]).strip(),
            'description': description,
            'thumbnail': self._og_search_thumbnail(webpage, default=None),
            'formats': formats
        }


Review comment (refactor):
```suggestion
        video_url = self._search_regex(r'sources: \[\{file: \'(.*?)\'\}\],', webpage, 'video URL')
```
You should be able to also just extract the entire jwplayer config with
```py
self._parse_json(
    self._search_regex(r'jwsetup\s*=\s*({.+});', webpage, 'player config'),
    display_id, transform_source=js_to_json),
```
 and use `_parse_jwplayer_data` to parse that (which should also extract captions), but ¯\\\_(ツ)_/¯

Code after:
            entry = dict(entries[0])
            entry['id'] = 'c' + video_id if video_type == 'clip' else video_id
            return entry
        else:
            return {
                '_type': 'playlist',
                'entries': entries,
                'title': title,
                'id': 'c' + video_id if video_type == 'clip' else video_id,
            }


class CSpanCongressIE(InfoExtractor):
    _VALID_URL = r'https?://(?:www\.)?c-span\.org/congress/'
    _TESTS = [{
        'url': 'https://www.c-span.org/congress/?chamber=house&date=2017-12-13&t=1513208380',
        'info_dict': {
            'id': 'house_2017-12-13',
            'title': 'Congressional Chronicle - Members of Congress, Hearings and More',
            'description': 'md5:54c264b7a8f219937987610243305a84',
            'thumbnail': r're:https://ximage.c-spanvideo.org/.+',
            'ext': 'mp4'
        }
    }]

    def _real_extract(self, url):
        query = parse_qs(url)
        video_date = query.get('date', [None])[0]
        video_id = join_nonempty(query.get('chamber', ['senate'])[0], video_date, delim='_')
        webpage = self._download_webpage(url, video_id)
        if not video_date:
            jwp_date = re.search(r'jwsetup.clipprogdate = \'(?P<date>\d{4}-\d{2}-\d{2})\';', webpage)
            if jwp_date:
                video_id = f'{video_id}_{jwp_date.group("date")}'
        jwplayer_data = self._parse_json(
            self._search_regex(r'jwsetup\s*=\s*({(?:.|\n)[^;]+});', webpage, 'player config'),
            video_id, transform_source=js_to_json)

        title = (self._og_search_title(webpage, default=None)
                 or self._html_search_regex(r'(?s)<title>(.*?)</title>', webpage, 'video title'))
        description = (self._og_search_description(webpage, default=None)
                       or self._html_search_meta('description', webpage, 'description', default=None))

        return {
            **self._parse_jwplayer_data(jwplayer_data, video_id, False),
            'title': re.sub(r'\s+', ' ', title.split('|')[0]).strip(),
            'description': description,
            'http_headers': {'Referer': 'https://www.c-span.org/'},
        }