Repository: yt-dlp/yt-dlp

Issue:
Unsupported URL for archived games on nfl.com
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

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

### Checklist

- [X] I'm reporting a broken site
- [X] I've verified that I'm running yt-dlp version **2023.01.06** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched 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

United States

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

NFL+ (NFL Game Pass outside of the U.S.) is a subscription service that allows people to view archived NFL games going back to the 2009 (2012 outside of the U.S.) season and other NFL documentaries and specials.

When I tried to download a recent game (https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108), I get the first output with the Unsupported URL error. As you can see, yt-dlp doesn't attempt to use the NFL extractor and uses the generic extractor instead.

The NFL extractor should be updated to support login credentials and be able to grab multiple video types from a single URL as shown in the image below.
![image](https://user-images.githubusercontent.com/5828320/216828650-775a3bdb-0bf1-4733-a955-badcd3802e6b.png)

If I grab the direct URL for the type of video that is currently playing (e.g. Full Game), the generic extractor can provide the format data (second output). There aren't any issues with downloading the video (third output) unless you let the video link expire where you get the following error:
```
[generic] master: Downloading webpage
ERROR: [generic] None: Unable to download webpage: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 680, in extract
  File "yt_dlp\extractor\generic.py", line 2384, in _real_extract
  File "yt_dlp\extractor\common.py", line 825, in _request_webpage

  File "yt_dlp\extractor\common.py", line 807, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3730, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden
```

### 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] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
[debug] Command-line config: ['-vU', 'https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2023.01.06 [6becd25] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg N-109716-g757218564d-20230129 (setts), ffprobe N-109716-g757218564d-20230129, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.16.0, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1760 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.01.06, Current version: 2023.01.06
yt-dlp is up to date (2023.01.06)
[generic] Extracting URL: https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108
[generic] 1572108: Downloading webpage
WARNING: [generic] Falling back on generic information extractor
[generic] 1572108: Extracting information
[debug] Looking for embeds
ERROR: Unsupported URL: https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1502, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1578, in __extract_info
  File "yt_dlp\extractor\common.py", line 680, in extract
  File "yt_dlp\extractor\generic.py", line 2523, in _real_extract
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108

[debug] Command-line config: ['-vU', '-F', '--no-part', '--restrict-filenames', '-N', '4', '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0', '--referer', 'https://www.nfl.com/', 'https://dcs-vod.mp.lura.live/vod/p/master.m3u8?encp=jy_X1N0F6JWSDJyZxnmGfw:HAdVDYQasjEgcV1Xb_Ck78xY1j9cynehh3PGGXW-KbhtwnnI9IKiXO2Jl6x6cywt3DzBOPHaiLkKuIdVRwM-IDrYTfOGnUBK-7JxiUxjg7iG9regxVsGU9aqUxyJHvtUiFW5vr7WMUPKyU_RbfahFiCUyAmKPXolfRDh721I42RV2qtRMTXg5JfkseQT4dZOvxxcdqM3UH46aDgmcdeeWrFB0dq7hYX4GRDQanqYRq2MPfVX0QEGzopJP-4mXhf4hqc09p3KnO74KS5u9pLBG5jwxkI8vu4GfuVajHbgQbKMt0Gs3E0swdp9iy6LQVzdTxU4_U-kBzp2ZR_NsCP1cfOYbWH19Vr5P4nsiTiddePl-pFYClW3aEfOGJNpKTTSESXaL5EWTtMXzFeGSVobTdvQkOftTwl4TR8ZzLU9u22V3ksIrK3FM_Le6WmvUbxLH5PHyIoNoqLeQbV7ZCUrOZVdG4RnKHBvSOAWE-y3X4RxOZj6qgGcbreYRr2hlHkG9DImwOoy9ge3fTMxv3oibwx96RiYDulLVWRsOIP1PQUNdEHthpOyVm-ze3b1gZJK5aLD1_OVgUjTVHET0VgJEy43uHiTX4dl1boEpnbkTD4vWhbaTeQ4h7-tfqlJANAZSTi6ngkP6xdAtvSoLzwy1hJlb8CwzGNVruHFS7dsyqamQEQYzTMOgmZRmx0RJk8xcGEuJ_y1FrwFIwLN7Zt1dBT2gOpQOeXWxLDHtIwQEizKVnM7oBsPFTRswrdRIlLcU5-hP5nqxZ8tkbCg00CWbxscYP3D1ecW3Nwh8G5D_enhZOSXY7_XIWpMPC_sMADmWKSGLPR7ASffYYrw1JO5roFoFpjstc03mSb3FyLF_XWR3Mf8CCpyGmVjoUfUsv4xgP8GXWBAhccKTYYbTpx-judPpQX2IxHdF5fiPkmhy3Yj16CofjmjjQP_o9kQuL3jJyYmlgZEBPxfWq2_V0eNFqqseF1XUNzJmsDYUQzTCw7PlOdis5ePMWz6gZcDP_96l2KgjxBpJ_ktGTHWd2VIoQlA96WXprkFpNoiDu_ujGc&anvauth=tb=0~te=1675169896~sgn=aad9996bfa8d84e1e241d3b4922c834283a3ac4b1ec0a104330c5d37903188e2&t=1675168996']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2023.01.06 [6becd25] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg N-109716-g757218564d-20230129 (setts), ffprobe N-109716-g757218564d-20230129, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.16.0, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1760 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.01.06, Current version: 2023.01.06
yt-dlp is up to date (2023.01.06)
[generic] Extracting URL: https://dcs-vod.mp.lura.live/vod/p/master.m3u8?encp=jy_X1N0F6JWSDJyZxnmGfw:HAdVDYQasjEgcV1Xb_Ck78xY1j9cynehh3PGGXW-KbhtwnnI9IKiXO2Jl6x6cywt3DzBOPHaiLkKuIdVRwM-IDrYTfOGnUBK-7JxiUxjg7iG9regxVsGU9aqUxyJHvtUiFW5vr7WMUPKyU_RbfahFiCUyAmKPXolfRDh721I42RV2qtRMTXg5JfkseQT4dZOvxxcdqM3UH46aDgmcdeeWrFB0dq7hYX4GRDQanqYRq2MPfVX0QEGzopJP-4mXhf4hqc09p3KnO74KS5u9pLBG5jwxkI8vu4GfuVajHbgQbKMt0Gs3E0swdp9iy6LQVzdTxU4_U-kBzp2ZR_NsCP1cfOYbWH19Vr5P4nsiTiddePl-pFYClW3aEfOGJNpKTTSESXaL5EWTtMXzFeGSVobTdvQkOftTwl4TR8ZzLU9u22V3ksIrK3FM_Le6WmvUbxLH5PHyIoNoqLeQbV7ZCUrOZVdG4RnKHBvSOAWE-y3X4RxOZj6qgGcbreYRr2hlHkG9DImwOoy9ge3fTMxv3oibwx96RiYDulLVWRsOIP1PQUNdEHthpOyVm-ze3b1gZJK5aLD1_OVgUjTVHET0VgJEy43uHiTX4dl1boEpnbkTD4vWhbaTeQ4h7-tfqlJANAZSTi6ngkP6xdAtvSoLzwy1hJlb8CwzGNVruHFS7dsyqamQEQYzTMOgmZRmx0RJk8xcGEuJ_y1FrwFIwLN7Zt1dBT2gOpQOeXWxLDHtIwQEizKVnM7oBsPFTRswrdRIlLcU5-hP5nqxZ8tkbCg00CWbxscYP3D1ecW3Nwh8G5D_enhZOSXY7_XIWpMPC_sMADmWKSGLPR7ASffYYrw1JO5roFoFpjstc03mSb3FyLF_XWR3Mf8CCpyGmVjoUfUsv4xgP8GXWBAhccKTYYbTpx-judPpQX2IxHdF5fiPkmhy3Yj16CofjmjjQP_o9kQuL3jJyYmlgZEBPxfWq2_V0eNFqqseF1XUNzJmsDYUQzTCw7PlOdis5ePMWz6gZcDP_96l2KgjxBpJ_ktGTHWd2VIoQlA96WXprkFpNoiDu_ujGc&anvauth=tb=0~te=1675169896~sgn=aad9996bfa8d84e1e241d3b4922c834283a3ac4b1ec0a104330c5d37903188e2&t=1675168996
[generic] master: Downloading webpage
[debug] Identified a direct video link
[generic] master: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, source, id
[info] Available formats for master:
ID   EXT RESOLUTION FPS │   TBR PROTO │ VCODEC        VBR ACODEC    ABR
───────────────────────────────────────────────────────────────────────
308  mp4 416x234     30 │  308k m3u8  │ avc1.42e00d  308k mp4a.40.2  0k
448  mp4 416x234     30 │  448k m3u8  │ avc1.42e00d  448k mp4a.40.2  0k
628  mp4 640x360     30 │  628k m3u8  │ avc1.42e01e  628k mp4a.40.2  0k
928  mp4 640x360     30 │  928k m3u8  │ avc1.4d401e  928k mp4a.40.2  0k
1328 mp4 768x432     30 │ 1328k m3u8  │ avc1.4d401e 1328k mp4a.40.2  0k
2128 mp4 768x432     30 │ 2128k m3u8  │ avc1.4d401e 2128k mp4a.40.2  0k
3328 mp4 1280x720    30 │ 3328k m3u8  │ avc1.4d401f 3328k mp4a.40.2  0k
5128 mp4 1280x720    30 │ 5128k m3u8  │ avc1.4d401f 5128k mp4a.40.2  0k
8128 mp4 1920x1080   30 │ 8128k m3u8  │ avc1.4d4028 8128k mp4a.40.2  0k

[debug] Command-line config: ['-vU', '--downloader', 'aria2c', '--no-part', '--restrict-filenames', '-N', '4', '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0', '--referer', 'https://www.nfl.com/', 'https://dcs-vod.mp.lura.live/vod/p/master.m3u8?encp=jy_X1N0F6JWSDJyZxnmGfw:HAdVDYQasjEgcV1Xb_Ck78xY1j9cynehh3PGGXW-KbhtwnnI9IKiXO2Jl6x6cywt3DzBOPHaiLkKuIdVRwM-IDrYTfOGnUBK-7JxiUxjg7iG9regxVsGU9aqUxyJHvtUiFW5vr7WMUPKyU_RbfahFiCUyAmKPXolfRDh721I42RV2qtRMTXg5JfkseQT4dZOvxxcdqM3UH46aDgmcdeeWrFB0dq7hYX4GRDQanqYRq2MPfVX0QEGzopJP-4mXhf4hqc09p3KnO74KS5u9pLBG5jwxkI8vu4GfuVajHbgQbKMt0Gs3E0swdp9iy6LQVzdTxU4_U-kBzp2ZR_NsCP1cfOYbWH19Vr5P4nsiTiddePl-pFYClW3aEfOGJNpKTTSESXaL5EWTtMXzFeGSVobTdvQkOftTwl4TR8ZzLU9u22V3ksIrK3FM_Le6WmvUbxLH5PHyIoNoqLeQbV7ZCUrOZVdG4RnKHBvSOAWE-y3X4RxOZj6qgGcbreYRr2hlHkG9DImwOoy9ge3fTMxv3oibwx96RiYDulLVWRsOIP1PQUNdEHthpOyVm-ze3b1gZJK5aLD1_OVgUjTVHET0VgJEy43uHiTX4dl1boEpnbkTD4vWhbaTeQ4h7-tfqlJANAZSTi6ngkP6xdAtvSoLzwy1hJlb8CwzGNVruHFS7dsyqamQEQYzTMOgmZRmx0RJk8xcGEuJ_y1FrwFIwLN7Zt1dBT2gOpQOeXWxLDHtIwQEizKVnM7oBsPFTRswrdRIlLcU5-hP5nqxZ8tkbCg00CWbxscYP3D1ecW3Nwh8G5D_enhZOSXY7_XIWpMPC_sMADmWKSGLPR7ASffYYrw1JO5roFoFpjstc03mSb3FyLF_XWR3Mf8CCpyGmVjoUfUsv4xgP8GXWBAhccKTYYbTpx-judPpQX2IxHdF5fiPkmhy3Yj16CofjmjjQP_o9kQuL3jJyYmlgZEBPxfWq2_V0eNFqqseF1XUNzJmsDYUQzTCw7PlOdis5ePMWz6gZcDP_96l2KgjxBpJ_ktGTHWd2VIoQlA96WXprkFpNoiDu_ujGc&anvauth=tb=0~te=1675169896~sgn=aad9996bfa8d84e1e241d3b4922c834283a3ac4b1ec0a104330c5d37903188e2&t=1675168996']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2023.01.06 [6becd25] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg N-109716-g757218564d-20230129 (setts), ffprobe N-109716-g757218564d-20230129, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.16.0, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1760 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.01.06, Current version: 2023.01.06
yt-dlp is up to date (2023.01.06)
[generic] Extracting URL: https://dcs-vod.mp.lura.live/vod/p/master.m3u8?encp=jy_X1N0F6JWSDJyZxnmGfw:HAdVDYQasjEgcV1Xb_Ck78xY1j9cynehh3PGGXW-KbhtwnnI9IKiXO2Jl6x6cywt3DzBOPHaiLkKuIdVRwM-IDrYTfOGnUBK-7JxiUxjg7iG9regxVsGU9aqUxyJHvtUiFW5vr7WMUPKyU_RbfahFiCUyAmKPXolfRDh721I42RV2qtRMTXg5JfkseQT4dZOvxxcdqM3UH46aDgmcdeeWrFB0dq7hYX4GRDQanqYRq2MPfVX0QEGzopJP-4mXhf4hqc09p3KnO74KS5u9pLBG5jwxkI8vu4GfuVajHbgQbKMt0Gs3E0swdp9iy6LQVzdTxU4_U-kBzp2ZR_NsCP1cfOYbWH19Vr5P4nsiTiddePl-pFYClW3aEfOGJNpKTTSESXaL5EWTtMXzFeGSVobTdvQkOftTwl4TR8ZzLU9u22V3ksIrK3FM_Le6WmvUbxLH5PHyIoNoqLeQbV7ZCUrOZVdG4RnKHBvSOAWE-y3X4RxOZj6qgGcbreYRr2hlHkG9DImwOoy9ge3fTMxv3oibwx96RiYDulLVWRsOIP1PQUNdEHthpOyVm-ze3b1gZJK5aLD1_OVgUjTVHET0VgJEy43uHiTX4dl1boEpnbkTD4vWhbaTeQ4h7-tfqlJANAZSTi6ngkP6xdAtvSoLzwy1hJlb8CwzGNVruHFS7dsyqamQEQYzTMOgmZRmx0RJk8xcGEuJ_y1FrwFIwLN7Zt1dBT2gOpQOeXWxLDHtIwQEizKVnM7oBsPFTRswrdRIlLcU5-hP5nqxZ8tkbCg00CWbxscYP3D1ecW3Nwh8G5D_enhZOSXY7_XIWpMPC_sMADmWKSGLPR7ASffYYrw1JO5roFoFpjstc03mSb3FyLF_XWR3Mf8CCpyGmVjoUfUsv4xgP8GXWBAhccKTYYbTpx-judPpQX2IxHdF5fiPkmhy3Yj16CofjmjjQP_o9kQuL3jJyYmlgZEBPxfWq2_V0eNFqqseF1XUNzJmsDYUQzTCw7PlOdis5ePMWz6gZcDP_96l2KgjxBpJ_ktGTHWd2VIoQlA96WXprkFpNoiDu_ujGc&anvauth=tb=0~te=1675169896~sgn=aad9996bfa8d84e1e241d3b4922c834283a3ac4b1ec0a104330c5d37903188e2&t=1675168996
[generic] master: Downloading webpage
[debug] Identified a direct video link
[generic] master: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] master: Downloading 1 format(s): 8128
[debug] Invoking hlsnative downloader on "https://dcs-vod.mp.lura.live/vod/p/8566400/prog.m3u8?i=i176971816-n81d3464b-5e27-46fe-b1a5-46af096a0ee9"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Fragment downloads will be delegated to aria2c
[hlsnative] Total fragments: 1192
[download] Destination: master-[master].mp4
[debug] File locking is not supported. Proceeding without locking
[debug] aria2c command line: aria2c -c "--console-log-level=warn" "--summary-interval=0" "--download-result=hide" "--http-accept-gzip=true" "--file-allocation=none" -x16 -j16 -s16 "--allow-overwrite=true" "--allow-piece-length-change=true" --header "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0" --header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" --header "Accept-Language: en-us,en;q=0.5" --header "Sec-Fetch-Mode: navigate" --header "Referer: https://www.nfl.com/" "--check-certificate=true" "--remote-time=true" "--show-console-readout=true" "--auto-file-renaming=false" "--file-allocation=none" "--uri-selector=inorder" -i ".\master-[master].mp4.frag.urls"
[download] 100% of    6.98GiB in 00:25:42 at 4.63MiB/s
[debug] ffprobe command line: ffprobe -hide_banner -show_format -show_streams -print_format json "file:master-[master].mp4"
[FixupM3u8] Fixing MPEG-TS in MP4 container of "master-[master].mp4"
[debug] ffmpeg command line: ffmpeg -y -loglevel "repeat+info" -i "file:master-[master].mp4" -map 0 -dn -ignore_unknown -c copy -f mp4 "-bsf:a" aac_adtstoasc -movflags "+faststart" "file:master-[master].temp.mp4"
```



Discussion:
If you're willing to share account details, I could work on adding support for this.

Contact:
__Email__ `bashonly (at) protonmail (dot) com`
__Discord__ `bashonly#4457`
__Matrix__ `@bashonly:matrix.org`

BTW for the generic extractor to have any chance at working, you would need to pass cookies with `--cookies-from-browser` when downloading the webpage URL
@bashonly I have sent it to your email. Do you go through each type of video available in the library before working on adding support?

When you mention webpage URL, do you mean https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108? I added the command ```--cookies cookies.txt``` and I still get the Unsupported URL error.

I don't need to use this command for the master.m3u8 URL as you can see on the second and third output above. The command ```--cookies cookies.txt``` doesn't keep the master.m3u8 URL alive as I still receive HTTP Error 403: Forbidden after a period of time.
Email received, I'll look into as soon as I am able to.

> Do you go through each type of video available in the library before working on adding support?

If there are other types of videos you'd like supported, share URLs and I can see what I can do

> When you mention webpage URL, do you mean https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108? I added the command --cookies cookies.txt and I still get the Unsupported URL error.

Correct, yeah then extractor improvements are needed.

Resolving patch:
diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -1197,6 +1197,8 @@
 from .nfl import (
     NFLIE,
     NFLArticleIE,
+    NFLPlusEpisodeIE,
+    NFLPlusReplayIE,
 )
 from .nhk import (
     NhkVodIE,
diff --git a/yt_dlp/extractor/nfl.py b/yt_dlp/extractor/nfl.py
--- a/yt_dlp/extractor/nfl.py
+++ b/yt_dlp/extractor/nfl.py
@@ -1,10 +1,18 @@
+import base64
+import json
 import re
+import time
+import uuid
 
+from .anvato import AnvatoIE
 from .common import InfoExtractor
 from ..utils import (
+    ExtractorError,
     clean_html,
     determine_ext,
     get_element_by_class,
+    traverse_obj,
+    urlencode_postdata,
 )
 
 
@@ -54,15 +62,14 @@ class NFLBaseIE(InfoExtractor):
                         )/
                     '''
     _VIDEO_CONFIG_REGEX = r'<script[^>]+id="[^"]*video-config-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}[^"]*"[^>]*>\s*({.+});?\s*</script>'
+    _ANVATO_PREFIX = 'anvato:GXvEgwyJeWem8KCYXfeoHWknwP48Mboj:'
 
     def _parse_video_config(self, video_config, display_id):
         video_config = self._parse_json(video_config, display_id)
         item = video_config['playlist'][0]
         mcp_id = item.get('mcpID')
         if mcp_id:
-            info = self.url_result(
-                'anvato:GXvEgwyJeWem8KCYXfeoHWknwP48Mboj:' + mcp_id,
-                'Anvato', mcp_id)
+            info = self.url_result(f'{self._ANVATO_PREFIX}{mcp_id}', AnvatoIE, mcp_id)
         else:
             media_id = item.get('id') or item['entityId']
             title = item.get('title')
@@ -157,3 +164,138 @@ def _real_extract(self, url):
             'nfl-c-article__title', webpage)) or self._html_search_meta(
             ['og:title', 'twitter:title'], webpage)
         return self.playlist_result(entries, display_id, title)
+
+
+class NFLPlusReplayIE(NFLBaseIE):
+    IE_NAME = 'nfl.com:plus:replay'
+    _VALID_URL = r'https?://(?:www\.)?nfl.com/plus/games/[\w-]+/(?P<id>\d+)'
+    _TESTS = [{
+        'url': 'https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108',
+        'info_dict': {
+            'id': '1572108',
+            'ext': 'mp4',
+            'title': 'New York Giants at Minnesota Vikings',
+            'description': 'New York Giants play the Minnesota Vikings at U.S. Bank Stadium on January 15, 2023',
+            'uploader': 'NFL',
+            'upload_date': '20230116',
+            'timestamp': 1673864520,
+            'duration': 7157,
+            'categories': ['Game Highlights'],
+            'tags': ['Minnesota Vikings', 'New York Giants', 'Minnesota Vikings vs. New York Giants'],
+            'thumbnail': r're:^https?://.*\.jpg',
+        },
+        'params': {'skip_download': 'm3u8'},
+    }]
+
+    def _real_extract(self, url):
+        video_id = self._match_id(url)
+        return self.url_result(f'{self._ANVATO_PREFIX}{video_id}', AnvatoIE, video_id)
+
+
+class NFLPlusEpisodeIE(NFLBaseIE):
+    IE_NAME = 'nfl.com:plus:episode'
+    _VALID_URL = r'https?://(?:www\.)?nfl.com/plus/episodes/(?P<id>[\w-]+)'
+    _TESTS = [{
+        'note': 'premium content',
+        'url': 'https://www.nfl.com/plus/episodes/kurt-s-qb-insider-conference-championships',
+        'info_dict': {
+            'id': '1576832',
+            'ext': 'mp4',
+            'title': 'Kurt\'s QB Insider: Conference Championships',
+            'description': 'md5:944f7fab56f7a37430bf8473f5473857',
+            'uploader': 'NFL',
+            'upload_date': '20230127',
+            'timestamp': 1674782760,
+            'duration': 730,
+            'categories': ['Analysis'],
+            'tags': ['Cincinnati Bengals at Kansas City Chiefs (2022-POST-3)'],
+            'thumbnail': r're:^https?://.*\.jpg',
+        },
+        'params': {'skip_download': 'm3u8'},
+    }]
+
+    _CLIENT_DATA = {
+        'clientKey': '4cFUW6DmwJpzT9L7LrG3qRAcABG5s04g',
+        'clientSecret': 'CZuvCL49d9OwfGsR',
+        'deviceId': str(uuid.uuid4()),
+        'deviceInfo': base64.b64encode(json.dumps({
+            'model': 'desktop',
+            'version': 'Chrome',
+            'osName': 'Windows',
+            'osVersion': '10.0',
+        }, separators=(',', ':')).encode()).decode(),
+        'networkType': 'other',
+        'nflClaimGroupsToAdd': [],
+        'nflClaimGroupsToRemove': [],
+    }
+    _ACCOUNT_INFO = {}
+    _API_KEY = None
+
+    _TOKEN = None
+    _TOKEN_EXPIRY = 0
+
+    def _get_account_info(self, url, video_id):
+        cookies = self._get_cookies('https://www.nfl.com/')
+        login_token = traverse_obj(cookies, (
+            (f'glt_{self._API_KEY}', f'gig_loginToken_{self._API_KEY}',
+             lambda k, _: k.startswith('glt_') or k.startswith('gig_loginToken_')),
+            {lambda x: x.value}), get_all=False)
+        if not login_token:
+            self.raise_login_required()
+
+        account = self._download_json(
+            'https://auth-id.nfl.com/accounts.getAccountInfo', video_id,
+            note='Downloading account info', data=urlencode_postdata({
+                'include': 'profile,data',
+                'lang': 'en',
+                'APIKey': self._API_KEY,
+                'sdk': 'js_latest',
+                'login_token': login_token,
+                'authMode': 'cookie',
+                'pageURL': url,
+                'sdkBuild': traverse_obj(cookies, (
+                    'gig_canary_ver', {lambda x: x.value.partition('-')[0]}), default='13642'),
+                'format': 'json',
+            }), headers={'Content-Type': 'application/x-www-form-urlencoded'})
+
+        self._ACCOUNT_INFO = traverse_obj(account, {
+            'signatureTimestamp': 'signatureTimestamp',
+            'uid': 'UID',
+            'uidSignature': 'UIDSignature',
+        })
+
+        if len(self._ACCOUNT_INFO) != 3:
+            raise ExtractorError('Failed to retrieve account info with provided cookies', expected=True)
+
+    def _get_auth_token(self, url, video_id):
+        if not self._ACCOUNT_INFO:
+            self._get_account_info(url, video_id)
+
+        token = self._download_json(
+            'https://api.nfl.com/identity/v3/token%s' % (
+                '/refresh' if self._ACCOUNT_INFO.get('refreshToken') else ''),
+            video_id, headers={'Content-Type': 'application/json'}, note='Downloading access token',
+            data=json.dumps({**self._CLIENT_DATA, **self._ACCOUNT_INFO}, separators=(',', ':')).encode())
+
+        self._TOKEN = token['accessToken']
+        self._TOKEN_EXPIRY = token['expiresIn']
+        self._ACCOUNT_INFO['refreshToken'] = token['refreshToken']
+
+    def _real_extract(self, url):
+        slug = self._match_id(url)
+
+        if not self._API_KEY:
+            webpage = self._download_webpage(url, slug, fatal=False) or ''
+            self._API_KEY = self._search_regex(
+                r'window\.gigyaApiKey=["\'](\w+)["\'];', webpage, 'API key',
+                default='3_Qa8TkWpIB8ESCBT8tY2TukbVKgO5F6BJVc7N1oComdwFzI7H2L9NOWdm11i_BY9f')
+
+        if not self._TOKEN or self._TOKEN_EXPIRY <= int(time.time()):
+            self._get_auth_token(url, slug)
+
+        video_id = self._download_json(
+            f'https://api.nfl.com/content/v1/videos/episodes/{slug}', slug, headers={
+                'Authorization': f'Bearer {self._TOKEN}',
+            })['mcpPlaybackId']
+
+        return self.url_result(f'{self._ANVATO_PREFIX}{video_id}', AnvatoIE, video_id)


Test patch: