Repository: yt-dlp
Issue: [SenateGov] Add channel / hearing list extractor
Labels: site-enhancement,triage

### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [x] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [x] I'm requesting a site-specific feature
- [x] I've verified that I have **updated yt-dlp to nightly or master** ([update instructions](https://github.com/yt-dlp/yt-dlp#update-channels))
- [x] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [x] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [x] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [x] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

US, probably no geo restrictions

### Example URLs

https://www.help.senate.gov/hearings

### Provide a description that is worded well enough to be understood

Download all hearing list information like a Youtube channel / playlist.

There are metadata fields in the table for `Hearing`, `Type`, `Location`, and `Date`. I believe these fields should be available in the individual hearing page, but I am not sure if they are consistent with one another. It would probably be best to default to the metadata available on the individual hearing page.

The individual hearing page link is available as `<a class="LegislationList__link Link" href="https://www.help.senate.gov/hearings/starting-the-119th-congress">
                      Starting the 119th Congress
                    </a>`

Some hearings such as `[POSTPONED: S. 2305, S. 2780, S. 4436, S. 4583, S.5146, and S. 5103](https://www.help.senate.gov/hearings/s-2305-s-2780-s-4436-s-4583-s_-medical-graduate-investment-act-and-s_-food-and-drug-administration-foods-accountability-act)` are postponed, which means there is no video available. Such videos would be skipped, but this can happen when processing the individual hearing videos in `SenateGov`. Probably not a concern for the channel extraction.

![Image](https://github.com/user-attachments/assets/1d22871e-e194-49f4-be86-bdbeee9eb541)

### Provide verbose output that clearly demonstrates the problem

- [x] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [x] If using API, add `'verbose': True` to `YoutubeDL` params instead
- [x] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
PyDev console: using IPython 8.18.1
Python 3.11.11 (main, Dec  4 2024, 08:55:07) [GCC 11.4.0] on linux
import yt_dlp
ydl_opts = {
    'verbose': True
}
hearing_list_url = 'https://www.help.senate.gov/hearings'
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
    hearing_list_info = ydl.sanitize_info(ydl.extract_info(url=hearing_list_url, download=False))
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8 (No ANSI), error utf-8 (No ANSI), screen utf-8 (No ANSI)
[debug] yt-dlp version nightly@2025.01.19.232735 from yt-dlp/yt-dlp-nightly-builds [68221ecc8] (pip) API
[debug] params: {'verbose': True, 'compat_opts': set(), 'http_headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5', 'Sec-Fetch-Mode': 'navigate'}}
[debug] Python 3.11.11 (CPython x86_64 64bit) - Linux-6.8.0-51-generic-x86_64-with-glibc2.35 (OpenSSL 3.0.2 15 Mar 2022, glibc 2.35)
[debug] exe versions: ffmpeg N-71064-gd5e603ddc0-static (setts), ffprobe 4.4.2
[debug] Optional libraries: Cryptodome-3.19.0, brotli-1.1.0, certifi-2023.11.17, mutagen-1.47.0, requests-2.32.3, secretstorage-3.3.3, sqlite3-3.37.2, urllib3-2.2.3, websockets-13.1
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets
[debug] Loaded 1837 extractors
[SenateGov] Extracting URL: https://www.help.senate.gov/hearings
[SenateGov] hearings: Downloading webpage
ERROR: Unsupported URL: https://www.help.senate.gov/hearings
Traceback (most recent call last):
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1637, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1772, in __extract_info
    ie_result = ie.extract(url)
                ^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/extractor/common.py", line 742, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/extractor/senategov.py", line 229, in _real_extract
    raise UnsupportedError(url)
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.help.senate.gov/hearings
Traceback (most recent call last):
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1637, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1772, in __extract_info
    ie_result = ie.extract(url)
                ^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/extractor/common.py", line 742, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/extractor/senategov.py", line 229, in _real_extract
    raise UnsupportedError(url)
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.help.senate.gov/hearings
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/IPython/core/interactiveshell.py", line 3550, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-0b0b74c9db58>", line 9, in <module>
    hearing_list_info = ydl.sanitize_info(ydl.extract_info(url=hearing_list_url, download=False))
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1626, in extract_info
    return self.__extract_info(url, self.get_info_extractor(key), download, extra_info, process)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1655, in wrapper
    self.report_error(str(e), e.format_traceback())
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1095, in report_error
    self.trouble(f'{self._format_err("ERROR:", self.Styles.ERROR)} {message}', *args, **kwargs)
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1034, in trouble
    raise DownloadError(message, exc_info)
yt_dlp.utils.DownloadError: ERROR: Unsupported URL: https://www.help.senate.gov/hearings
hearing_list_info
Traceback (most recent call last):
  File "/home/tianzi/.virtualenvs/python3.11news/lib/python3.11/site-packages/IPython/core/interactiveshell.py", line 3550, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-3-08fd9e7b8150>", line 1, in <module>
    hearing_list_info
NameError: name 'hearing_list_info' is not defined
```