Repository: yt-dlp/yt-dlp

Issue:
MLB - Article falls back to generic and fails
### Checklist

- [X] I'm reporting a broken site
- [X] I've verified that I'm running yt-dlp version **2022.04.08** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are alive and playable in a browser
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/ytdl-org/youtube-dl#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

canada

### Description



URL: "https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts"

Pointing directly to M3U file does download video:
https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/15/151a0855-302f49fd-ab9c5d2b-csvm-diamondx64-asset_5472K.m3u8



### Verbose log

```shell
yt-dlp.py -v "https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts"
[debug] Command-line config: ['-v', 'https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts']
[debug] Encodings: locale cp1252, fs utf-8, out utf-8, err utf-8, pref cp1252
[debug] yt-dlp version 2022.04.08 [7884ade65] (zip)
[debug] Python version 3.6.6 (CPython 64bit) - Windows-10-10.0.14393-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 4.3.2-2021-02-02-full_build-www.gyan.dev, ffprobe 4.3.2-2021-02-02-full_build-www.gyan.dev, rtmpdump 2.4
[debug] Optional libraries: sqlite
[debug] Proxy map: {}
[debug] [generic] Extracting URL: https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts
[generic] manny-machado-robs-guillermo-heredia-reacts: Requesting header
WARNING: [generic] Falling back on generic information extractor.
[generic] manny-machado-robs-guillermo-heredia-reacts: Downloading webpage
[generic] manny-machado-robs-guillermo-heredia-reacts: Extracting information
[debug] Looking for video embeds
ERROR: Unsupported URL: https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts
Traceback (most recent call last):
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\YoutubeDL.py", line 1408, in wrapper
    return func(self, *args, **kwargs)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\YoutubeDL.py", line 1478, in __extract_info
    ie_result = ie.extract(url)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\extractor\common.py", line 641, in extract
    ie_result = self._real_extract(url)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\extractor\generic.py", line 4039, in _real_extract
    raise UnsupportedError(url)
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts
```



Discussion:
@RingoTheDog that's because it's not a link to a video, but a link to a news article. I'm sure someone more experienced with this codebase could implement this (I can't be arsed)
I found the video is in `https://www.mlb.com/data-service/en/videos/heredia-not-happy-with-machado` and then we can get it in `'playbacks', ..., 'url'`. However, i didn't know where `heredia-not-happy-with-machado` came from. The 'hacky' solution for this just search `id=media-<slug>` (this untested though).
Not tested yet, but i think we can get the video like this:
First, we need to get `getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"<display_id>\",\"type\":\"story\"})` from the webpage. It should be like this:
```
"getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"})": {
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"})",
                      "typename": "StoryDetail"
                    }
```
Then, we can get the detail of content in webpage by searching `id` in webpage. It should be like this:
```
$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"})": {
                    "_translationId": "36db7394-343c-4ea3-b8ca-ead2e61bca9a",
                    "byline": "Dylan Svoboda",
                    "isMigrated": false,
                    "contentDate": "2022-04-16T04:21:40.329Z",
                    "contributors": [{
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).contributors.0",
                      "typename": "Contributor"
                    }],
                    "headline": "Machado's grab draws hilarious irate reaction",
                    "lastUpdatedDate": "2022-04-16T17:38:57.107Z",
                    "parts": [{
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).parts.0",
                      "typename": "Video"
                    }, {
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).parts.1",
                      "typename": "Markdown"
                    }, {
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).parts.2",
                      "typename": "Video"
                    }, {
                      "type": "id",
                      "generated": true,
                      "id": "$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).parts.3",
                      "typename": "Markdown"
                    }],
                    "storyType": "news",
                    "subHeadline": null,
                    "summary": "Braves outfielder Guillermo Heredia thought he had a base hit when he clobbered a 106.5 mph line drive to the left side during Friday night’s contest against the Padres.\nBefore Heredia could even make it out of the box, though, two-time Gold Glove Award winner Manny Machado made a diving",
                    "tagline({\"stripMarkdown\":false})": null,
                    "tags": [...],
                    "templateUrl": "https://img.mlbstatic.com/mlb-images/image/private/{formatInstructions}/v1650082416/mlb/cl5wrvxmmreqgetzecf9",
                    "title": "Manny Machado's diving play robs Guillermo Heredia",
                    "__typename": "StoryDetail"
                  },
```
And then from `parts`, we can found the video information with searching the `id` again. It should be like this
```
$ROOT_QUERY.getForgeContentBySlug({\"locale\":\"en-us\",\"slug\":\"manny-machado-robs-guillermo-heredia-reacts\",\"type\":\"story\"}).parts.0": {
                    "contentDate": "2022-04-16T02:34:00Z",
                    "description": "Guillermo Heredia jokingly shouts at Manny Machado after Machado robs Heredia of a base hit with a diving catch",
                    "duration": "00:00:10",
                    "slug": "heredia-not-happy-with-machado",
                    "source": null,
                    "tags": [...],
                    "templateUrl": "https://img.mlbstatic.com/mlb-images/image/private/{formatInstructions}/mlb/h4vf0gsuwanqrwbwmzqv",
                    "title": "Heredia not happy with Machado",
                    "type": "video",
                    "url": "/video/heredia-not-happy-with-machado",
                    "__typename": "Video"
```
Then, we can input this into api call in `https://www.mlb.com/data-service/en/videos/<slug>` and get the response like this:
<details><summary>Response from api call </summary>

```

  "id": "heredia-not-happy-with-machado",
  "content_id": "heredia-not-happy-with-machado",
  "date": "2022-04-16T02:34:00Z",
  "slug": "heredia-not-happy-with-machado",
  "title": "Heredia not happy with Machado",
  "blurb": "Heredia jokes with Machado after Manny's diving catch",
  "description": "Guillermo Heredia jokingly shouts at Manny Machado after Machado robs Heredia of a base hit with a diving catch",
  "timestamp": "2022-04-16T02:34:00Z",
  "language": "EN",
  "feeds": [
    {
      "type": "CMS",
      "duration": "00:00:10",
      "closedCaptions": null,
      "playbacks": [
        {
          "name": "mp4Avc",
          "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_1280x720_59_4000K.mp4"
        },
        {
          "name": "hlsCloud",
          "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset.m3u8"
        },
        {
          "name": "highBit",
          "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_1280x720_59_16000K.mp4"
        },
        {
          "name": "trickplay",
          "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_320x180/05s.%.jpg"
        }
      ],
      "image": {
        "title": "Heredia not happy with Machado",
        "altText": "Heredia not happy with Machado",
        "templateUrl": "https://img.mlbstatic.com/mlb-images/image/private/{formatInstructions}/mlb/h4vf0gsuwanqrwbwmzqv",
        "cuts": [
          {
            "aspectRatio": "16:9",
            "width": 372,
            "height": 210,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          },
          {
            "aspectRatio": "16:9",
            "width": 640,
            "height": 360,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          },
          {
            "aspectRatio": "16:9",
            "width": 1024,
            "height": 576,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          },
          {
            "aspectRatio": "16:9",
            "width": 1536,
            "height": 864,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          },
          {
            "aspectRatio": "16:9",
            "width": 2208,
            "height": 1242,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          },
          {
            "aspectRatio": "16:9",
            "width": 2608,
            "height": 1467,
            "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
            "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
            "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
          }
        ]
      }
    }
  ],
  "keywordsDisplay": [
    {
      "displayName": "2022/04/15 atl@sd",
      "slug": "gamepk-662236"
    },
    {
      "displayName": "Atlanta Braves",
      "slug": "teamid-144"
    },
    {
      "displayName": "Guillermo Heredia",
      "slug": "playerid-628338"
    },
    {
      "displayName": "Cut4",
      "slug": "cut-4"
    },
    {
      "displayName": "highlight",
      "slug": "highlight"
    },
    {
      "displayName": "in-game highlight",
      "slug": "in-game-highlight"
    }
  ],
  "type": "CMS",
  "duration": "00:00:10",
  "closedCaptions": null,
  "playbacks": [
    {
      "name": "mp4Avc",
      "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_1280x720_59_4000K.mp4"
    },
    {
      "name": "hlsCloud",
      "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset.m3u8"
    },
    {
      "name": "highBit",
      "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_1280x720_59_16000K.mp4"
    },
    {
      "name": "trickplay",
      "url": "https://mlb-cuts-diamond.mlb.com/FORGE/2022/2022-04/16/b4d96c46-bc21858a-e9bb9514-csvm-diamondx64-asset_320x180/05s.%.jpg"
    }
  ],
  "image": {
    "title": "Heredia not happy with Machado",
    "altText": "Heredia not happy with Machado",
    "templateUrl": "https://img.mlbstatic.com/mlb-images/image/private/{formatInstructions}/mlb/h4vf0gsuwanqrwbwmzqv",
    "cuts": [
      {
        "aspectRatio": "16:9",
        "width": 372,
        "height": 210,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_372,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      },
      {
        "aspectRatio": "16:9",
        "width": 640,
        "height": 360,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_640,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      },
      {
        "aspectRatio": "16:9",
        "width": 1024,
        "height": 576,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1024,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      },
      {
        "aspectRatio": "16:9",
        "width": 1536,
        "height": 864,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_1536,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      },
      {
        "aspectRatio": "16:9",
        "width": 2208,
        "height": 1242,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2208,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      },
      {
        "aspectRatio": "16:9",
        "width": 2608,
        "height": 1467,
        "src": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg/mlb/h4vf0gsuwanqrwbwmzqv",
        "at2x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg,dpr_2.0/mlb/h4vf0gsuwanqrwbwmzqv",
        "at3x": "https://img.mlbstatic.com/mlb-images/image/private/ar_16:9,g_auto,q_auto:good,w_2608,c_fill,f_jpg,dpr_3.0/mlb/h4vf0gsuwanqrwbwmzqv"
      }
    ]
  }
}
```
</details>

From this api response, we can get video url from `url` for every element in `playbacks`
Encounter another one today....

URL:  https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp



>yt-dlp.py -v "https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp"
[debug] Command-line config: ['-v', 'https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.08.19 [48c88e0] (zip)
[debug] Python 3.10.5 (CPython 64bit) - Windows-10-10.0.14393-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 4.3.2-2021-02-02-full_build-www.gyan.dev, ffprobe 4.3.2-2021-02-02-full_build-www.gyan.dev, rtmpdump 2.4
[debug] Optional libraries: sqlite3-2.6.0
[debug] Proxy map: {}
[debug] [generic] Extracting URL: https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp
[generic] windham-snares-the-bunt-attempt?t=t553-default-vtp: Downloading webpage
WARNING: [generic] Falling back on generic information extractor
[generic] windham-snares-the-bunt-attempt?t=t553-default-vtp: Extracting information
[debug] Looking for Brightcove embeds
[debug] Looking for embeds
ERROR: Unsupported URL: https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp
Traceback (most recent call last):
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\YoutubeDL.py", line 1442, in wrapper
    return func(self, *args, **kwargs)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\YoutubeDL.py", line 1518, in __extract_info
    ie_result = ie.extract(url)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\extractor\common.py", line 666, in extract
    ie_result = self._real_extract(url)
  File "C:\Transmogrifier\yt-dlp.py\yt_dlp\extractor\generic.py", line 3077, in _real_extract
    raise UnsupportedError(url)
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.milb.com/tennessee/video/windham-snares-the-bunt-attempt?t=t553-default-vtp

cheers 
Ringo


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
@@ -987,6 +987,7 @@
     MLBIE,
     MLBVideoIE,
     MLBTVIE,
+    MLBArticleIE,
 )
 from .mlssoccer import MLSSoccerIE
 from .mnet import MnetIE
diff --git a/yt_dlp/extractor/mlb.py b/yt_dlp/extractor/mlb.py
--- a/yt_dlp/extractor/mlb.py
+++ b/yt_dlp/extractor/mlb.py
@@ -347,3 +347,36 @@ def _real_extract(self, url):
             'subtitles': subtitles,
             'http_headers': {'Authorization': f'Bearer {self._access_token}'},
         }
+
+
+class MLBArticleIE(InfoExtractor):
+    _VALID_URL = r'https?://www\.mlb\.com/news/(?P<id>[\w-]+)'
+    _TESTS = [{
+        'url': 'https://www.mlb.com/news/manny-machado-robs-guillermo-heredia-reacts',
+        'info_dict': {
+            'id': '36db7394-343c-4ea3-b8ca-ead2e61bca9a',
+            'title': 'Machado\'s grab draws hilarious irate reaction',
+            'modified_timestamp': 1650130737,
+            'description': 'md5:a19d4eb0487b2cb304e9a176f6b67676',
+            'modified_date': '20220416',
+        },
+        'playlist_count': 2,
+    }]
+
+    def _real_extract(self, url):
+        display_id = self._match_id(url)
+        webpage = self._download_webpage(url, display_id)
+        apollo_cache_json = self._search_json(r'window\.initState\s*=', webpage, 'window.initState', display_id)['apolloCache']
+
+        content_data_id = traverse_obj(
+            apollo_cache_json, ('ROOT_QUERY', lambda k, _: k.startswith('getForgeContent'), 'id'), get_all=False)
+
+        content_real_info = apollo_cache_json[content_data_id]
+
+        return self.playlist_from_matches(
+            traverse_obj(content_real_info, ('parts', lambda _, v: v['typename'] == 'Video', 'id')),
+            getter=lambda x: f'https://www.mlb.com/video/{apollo_cache_json[x]["slug"]}',
+            ie=MLBVideoIE, playlist_id=content_real_info.get('_translationId'),
+            title=self._html_search_meta('og:title', webpage),
+            description=content_real_info.get('summary'),
+            modified_timestamp=parse_iso8601(content_real_info.get('lastUpdatedDate')))


Test patch: