We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Telecaribeplus livestream
### 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'm running yt-dlp version **2023.03.04** ([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 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

Colombia

### Example URLs

https://www.play.telecaribe.co/liveplus

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

The site recently added the possibility of stream the plus version of the channel wich is not currently supported by yt-dlp

### 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
[debug] Command-line config: ['-vU', 'https://www.play.telecaribe.co/liveplus']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.03.16.195558 [216bcb66d] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg n6.0-7-gadb4688bfb-20230316 (setts), ffprobe n6.0-7-gadb4688bfb-20230316
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1788 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
Available version: nightly@2023.03.21.231235, Current version: nightly@2023.03.16.195558
Current Build Hash: f2d91d50f78f402321f3ecaaf951d67c23d7b40324a3192ff3a0486c2c1f7aa7
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/_update_spec
Updating to nightly@2023.03.21.231235 ...
[debug] Downloading yt-dlp.exe from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/yt-dlp.exe
[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/SHA2-256SUMS
Updated yt-dlp to nightly@2023.03.21.231235
[debug] Restarting: yt-dlp -vU "https://www.play.telecaribe.co/liveplus"
[debug] Command-line config: ['-vU', 'https://www.play.telecaribe.co/liveplus']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.03.21.231235 [c2e0fc40a] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg n6.0-7-gadb4688bfb-20230316 (setts), ffprobe n6.0-7-gadb4688bfb-20230316
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1788 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest
Available version: nightly@2023.03.21.231235, Current version: nightly@2023.03.21.231235
Current Build Hash: 6dcf55afd207aa945cb97a2e435f42518808874992ef3f87e197b127d6e7736d
yt-dlp is up to date (nightly@2023.03.21.231235)
[TelecaribePlay] Extracting URL: https://www.play.telecaribe.co/liveplus
[TelecaribePlay] liveplus: Downloading webpage
[TelecaribePlay] liveplus: Downloading JSON metadata
[TelecaribePlay] liveplus: Downloading webpage
[download] Downloading playlist: Señal en vivo Plus
[TelecaribePlay] Playlist Señal en vivo Plus: Downloading 0 items of 0
[download] Finished downloading playlist: Señal en vivo Plus
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `yt_dlp/extractor/telecaribe.py`
Content:
```
1 import re
2 
3 from .common import InfoExtractor
4 from ..utils import traverse_obj
5 
6 
7 class TelecaribePlayIE(InfoExtractor):
8     _VALID_URL = r'https?://(?:www\.)?play\.telecaribe\.co/(?P<id>[\w-]+)'
9     _TESTS = [{
10         'url': 'https://www.play.telecaribe.co/breicok',
11         'info_dict': {
12             'id': 'breicok',
13             'title': 'Breicok',
14         },
15         'playlist_count': 7,
16     }, {
17         'url': 'https://www.play.telecaribe.co/si-fue-gol-de-yepes',
18         'info_dict': {
19             'id': 'si-fue-gol-de-yepes',
20             'title': 'Sí Fue Gol de Yepes',
21         },
22         'playlist_count': 6,
23     }, {
24         'url': 'https://www.play.telecaribe.co/ciudad-futura',
25         'info_dict': {
26             'id': 'ciudad-futura',
27             'title': 'Ciudad Futura',
28         },
29         'playlist_count': 10,
30     }, {
31         'url': 'https://www.play.telecaribe.co/live',
32         'info_dict': {
33             'id': 'live',
34             'title': r're:^Señal en vivo',
35             'live_status': 'is_live',
36             'ext': 'mp4',
37         },
38         'params': {
39             'skip_download': 'Livestream',
40         }
41     }]
42 
43     def _download_player_webpage(self, webpage, display_id):
44         page_id = self._search_regex(
45             (r'window.firstPageId\s*=\s*["\']([^"\']+)', r'<div[^>]+id\s*=\s*"pageBackground_([^"]+)'),
46             webpage, 'page_id')
47 
48         props = self._download_json(self._search_regex(
49             rf'<link[^>]+href\s*=\s*"([^"]+)"[^>]+id\s*=\s*"features_{page_id}"',
50             webpage, 'json_props_url'), display_id)['props']['render']['compProps']
51 
52         return self._download_webpage(traverse_obj(props, (..., 'url'))[-1], display_id)
53 
54     def _get_clean_title(self, title):
55         return re.sub(r'\s*\|\s*Telecaribe\s*VOD', '', title or '').strip() or None
56 
57     def _real_extract(self, url):
58         display_id = self._match_id(url)
59         webpage = self._download_webpage(url, display_id)
60         player = self._download_player_webpage(webpage, display_id)
61 
62         if display_id != 'live':
63             return self.playlist_from_matches(
64                 re.findall(r'<a[^>]+href\s*=\s*"([^"]+\.mp4)', player), display_id,
65                 self._get_clean_title(self._og_search_title(webpage)))
66 
67         formats, subtitles = self._extract_m3u8_formats_and_subtitles(
68             self._search_regex(r'(?:let|const|var)\s+source\s*=\s*["\']([^"\']+)', player, 'm3u8 url'),
69             display_id, 'mp4')
70 
71         return {
72             'id': display_id,
73             'title': self._get_clean_title(self._og_search_title(webpage)),
74             'formats': formats,
75             'subtitles': subtitles,
76             'is_live': True,
77         }
78
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/yt_dlp/extractor/telecaribe.py b/yt_dlp/extractor/telecaribe.py
--- a/yt_dlp/extractor/telecaribe.py
+++ b/yt_dlp/extractor/telecaribe.py
@@ -38,11 +38,23 @@
         'params': {
             'skip_download': 'Livestream',
         }
+    }, {
+        'url': 'https://www.play.telecaribe.co/liveplus',
+        'info_dict': {
+            'id': 'liveplus',
+            'title': r're:^Señal en vivo Plus',
+            'live_status': 'is_live',
+            'ext': 'mp4',
+        },
+        'params': {
+            'skip_download': 'Livestream',
+        },
+        'skip': 'Geo-restricted to Colombia',
     }]
 
     def _download_player_webpage(self, webpage, display_id):
         page_id = self._search_regex(
-            (r'window.firstPageId\s*=\s*["\']([^"\']+)', r'<div[^>]+id\s*=\s*"pageBackground_([^"]+)'),
+            (r'window\.firstPageId\s*=\s*["\']([^"\']+)', r'<div[^>]+id\s*=\s*"pageBackground_([^"]+)'),
             webpage, 'page_id')
 
         props = self._download_json(self._search_regex(
@@ -59,14 +71,16 @@
         webpage = self._download_webpage(url, display_id)
         player = self._download_player_webpage(webpage, display_id)
 
-        if display_id != 'live':
+        livestream_url = self._search_regex(
+            r'(?:let|const|var)\s+source\s*=\s*["\']([^"\']+)', player, 'm3u8 url', default=None)
+
+        if not livestream_url:
             return self.playlist_from_matches(
                 re.findall(r'<a[^>]+href\s*=\s*"([^"]+\.mp4)', player), display_id,
                 self._get_clean_title(self._og_search_title(webpage)))
 
         formats, subtitles = self._extract_m3u8_formats_and_subtitles(
-            self._search_regex(r'(?:let|const|var)\s+source\s*=\s*["\']([^"\']+)', player, 'm3u8 url'),
-            display_id, 'mp4')
+            livestream_url, display_id, 'mp4', live=True)
 
         return {
             'id': display_id,

{"golden_diff": "diff --git a/yt_dlp/extractor/telecaribe.py b/yt_dlp/extractor/telecaribe.py\n--- a/yt_dlp/extractor/telecaribe.py\n+++ b/yt_dlp/extractor/telecaribe.py\n@@ -38,11 +38,23 @@\n         'params': {\n             'skip_download': 'Livestream',\n         }\n+    }, {\n+        'url': 'https://www.play.telecaribe.co/liveplus',\n+        'info_dict': {\n+            'id': 'liveplus',\n+            'title': r're:^Se\u00f1al en vivo Plus',\n+            'live_status': 'is_live',\n+            'ext': 'mp4',\n+        },\n+        'params': {\n+            'skip_download': 'Livestream',\n+        },\n+        'skip': 'Geo-restricted to Colombia',\n     }]\n \n     def _download_player_webpage(self, webpage, display_id):\n         page_id = self._search_regex(\n-            (r'window.firstPageId\\s*=\\s*[\"\\']([^\"\\']+)', r'<div[^>]+id\\s*=\\s*\"pageBackground_([^\"]+)'),\n+            (r'window\\.firstPageId\\s*=\\s*[\"\\']([^\"\\']+)', r'<div[^>]+id\\s*=\\s*\"pageBackground_([^\"]+)'),\n             webpage, 'page_id')\n \n         props = self._download_json(self._search_regex(\n@@ -59,14 +71,16 @@\n         webpage = self._download_webpage(url, display_id)\n         player = self._download_player_webpage(webpage, display_id)\n \n-        if display_id != 'live':\n+        livestream_url = self._search_regex(\n+            r'(?:let|const|var)\\s+source\\s*=\\s*[\"\\']([^\"\\']+)', player, 'm3u8 url', default=None)\n+\n+        if not livestream_url:\n             return self.playlist_from_matches(\n                 re.findall(r'<a[^>]+href\\s*=\\s*\"([^\"]+\\.mp4)', player), display_id,\n                 self._get_clean_title(self._og_search_title(webpage)))\n \n         formats, subtitles = self._extract_m3u8_formats_and_subtitles(\n-            self._search_regex(r'(?:let|const|var)\\s+source\\s*=\\s*[\"\\']([^\"\\']+)', player, 'm3u8 url'),\n-            display_id, 'mp4')\n+            livestream_url, display_id, 'mp4', live=True)\n \n         return {\n             'id': display_id,\n", "issue": "Telecaribeplus livestream\n### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE\n\n- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\\* field\n\n### Checklist\n\n- [X] I'm requesting a site-specific feature\n- [X] I've verified that I'm running yt-dlp version **2023.03.04** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)\n- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details\n- [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\n- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)\n- [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\n\n### Region\n\nColombia\n\n### Example URLs\n\nhttps://www.play.telecaribe.co/liveplus\n\n### Provide a description that is worded well enough to be understood\n\nThe site recently added the possibility of stream the plus version of the channel wich is not currently supported by yt-dlp\n\n### Provide verbose output that clearly demonstrates the problem\n\n- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)\n- [X] If using API, add `'verbose': True` to `YoutubeDL` params instead\n- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below\n\n### Complete Verbose Output\n\n```shell\n[debug] Command-line config: ['-vU', 'https://www.play.telecaribe.co/liveplus']\r\n[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8\r\n[debug] yt-dlp version nightly@2023.03.16.195558 [216bcb66d] (win_exe)\r\n[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)\r\n[debug] exe versions: ffmpeg n6.0-7-gadb4688bfb-20230316 (setts), ffprobe n6.0-7-gadb4688bfb-20230316\r\n[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4\r\n[debug] Proxy map: {}\r\n[debug] Loaded 1788 extractors\r\n[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest\r\nAvailable version: nightly@2023.03.21.231235, Current version: nightly@2023.03.16.195558\r\nCurrent Build Hash: f2d91d50f78f402321f3ecaaf951d67c23d7b40324a3192ff3a0486c2c1f7aa7\r\n[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/_update_spec\r\nUpdating to nightly@2023.03.21.231235 ...\r\n[debug] Downloading yt-dlp.exe from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/yt-dlp.exe\r\n[debug] Downloading SHA2-256SUMS from https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/SHA2-256SUMS\r\nUpdated yt-dlp to nightly@2023.03.21.231235\r\n[debug] Restarting: yt-dlp -vU \"https://www.play.telecaribe.co/liveplus\"\r\n[debug] Command-line config: ['-vU', 'https://www.play.telecaribe.co/liveplus']\r\n[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8\r\n[debug] yt-dlp version nightly@2023.03.21.231235 [c2e0fc40a] (win_exe)\r\n[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)\r\n[debug] exe versions: ffmpeg n6.0-7-gadb4688bfb-20230316 (setts), ffprobe n6.0-7-gadb4688bfb-20230316\r\n[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4\r\n[debug] Proxy map: {}\r\n[debug] Loaded 1788 extractors\r\n[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp-nightly-builds/releases/latest\r\nAvailable version: nightly@2023.03.21.231235, Current version: nightly@2023.03.21.231235\r\nCurrent Build Hash: 6dcf55afd207aa945cb97a2e435f42518808874992ef3f87e197b127d6e7736d\r\nyt-dlp is up to date (nightly@2023.03.21.231235)\r\n[TelecaribePlay] Extracting URL: https://www.play.telecaribe.co/liveplus\r\n[TelecaribePlay] liveplus: Downloading webpage\r\n[TelecaribePlay] liveplus: Downloading JSON metadata\r\n[TelecaribePlay] liveplus: Downloading webpage\r\n[download] Downloading playlist: Se\u00f1al en vivo Plus\r\n[TelecaribePlay] Playlist Se\u00f1al en vivo Plus: Downloading 0 items of 0\r\n[download] Finished downloading playlist: Se\u00f1al en vivo Plus\n```\n\n", "before_files": [{"content": "import re\n\nfrom .common import InfoExtractor\nfrom ..utils import traverse_obj\n\n\nclass TelecaribePlayIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?play\\.telecaribe\\.co/(?P<id>[\\w-]+)'\n    _TESTS = [{\n        'url': 'https://www.play.telecaribe.co/breicok',\n        'info_dict': {\n            'id': 'breicok',\n            'title': 'Breicok',\n        },\n        'playlist_count': 7,\n    }, {\n        'url': 'https://www.play.telecaribe.co/si-fue-gol-de-yepes',\n        'info_dict': {\n            'id': 'si-fue-gol-de-yepes',\n            'title': 'S\u00ed Fue Gol de Yepes',\n        },\n        'playlist_count': 6,\n    }, {\n        'url': 'https://www.play.telecaribe.co/ciudad-futura',\n        'info_dict': {\n            'id': 'ciudad-futura',\n            'title': 'Ciudad Futura',\n        },\n        'playlist_count': 10,\n    }, {\n        'url': 'https://www.play.telecaribe.co/live',\n        'info_dict': {\n            'id': 'live',\n            'title': r're:^Se\u00f1al en vivo',\n            'live_status': 'is_live',\n            'ext': 'mp4',\n        },\n        'params': {\n            'skip_download': 'Livestream',\n        }\n    }]\n\n    def _download_player_webpage(self, webpage, display_id):\n        page_id = self._search_regex(\n            (r'window.firstPageId\\s*=\\s*[\"\\']([^\"\\']+)', r'<div[^>]+id\\s*=\\s*\"pageBackground_([^\"]+)'),\n            webpage, 'page_id')\n\n        props = self._download_json(self._search_regex(\n            rf'<link[^>]+href\\s*=\\s*\"([^\"]+)\"[^>]+id\\s*=\\s*\"features_{page_id}\"',\n            webpage, 'json_props_url'), display_id)['props']['render']['compProps']\n\n        return self._download_webpage(traverse_obj(props, (..., 'url'))[-1], display_id)\n\n    def _get_clean_title(self, title):\n        return re.sub(r'\\s*\\|\\s*Telecaribe\\s*VOD', '', title or '').strip() or None\n\n    def _real_extract(self, url):\n        display_id = self._match_id(url)\n        webpage = self._download_webpage(url, display_id)\n        player = self._download_player_webpage(webpage, display_id)\n\n        if display_id != 'live':\n            return self.playlist_from_matches(\n                re.findall(r'<a[^>]+href\\s*=\\s*\"([^\"]+\\.mp4)', player), display_id,\n                self._get_clean_title(self._og_search_title(webpage)))\n\n        formats, subtitles = self._extract_m3u8_formats_and_subtitles(\n            self._search_regex(r'(?:let|const|var)\\s+source\\s*=\\s*[\"\\']([^\"\\']+)', player, 'm3u8 url'),\n            display_id, 'mp4')\n\n        return {\n            'id': display_id,\n            'title': self._get_clean_title(self._og_search_title(webpage)),\n            'formats': formats,\n            'subtitles': subtitles,\n            'is_live': True,\n        }\n", "path": "yt_dlp/extractor/telecaribe.py"}], "after_files": [{"content": "import re\n\nfrom .common import InfoExtractor\nfrom ..utils import traverse_obj\n\n\nclass TelecaribePlayIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?play\\.telecaribe\\.co/(?P<id>[\\w-]+)'\n    _TESTS = [{\n        'url': 'https://www.play.telecaribe.co/breicok',\n        'info_dict': {\n            'id': 'breicok',\n            'title': 'Breicok',\n        },\n        'playlist_count': 7,\n    }, {\n        'url': 'https://www.play.telecaribe.co/si-fue-gol-de-yepes',\n        'info_dict': {\n            'id': 'si-fue-gol-de-yepes',\n            'title': 'S\u00ed Fue Gol de Yepes',\n        },\n        'playlist_count': 6,\n    }, {\n        'url': 'https://www.play.telecaribe.co/ciudad-futura',\n        'info_dict': {\n            'id': 'ciudad-futura',\n            'title': 'Ciudad Futura',\n        },\n        'playlist_count': 10,\n    }, {\n        'url': 'https://www.play.telecaribe.co/live',\n        'info_dict': {\n            'id': 'live',\n            'title': r're:^Se\u00f1al en vivo',\n            'live_status': 'is_live',\n            'ext': 'mp4',\n        },\n        'params': {\n            'skip_download': 'Livestream',\n        }\n    }, {\n        'url': 'https://www.play.telecaribe.co/liveplus',\n        'info_dict': {\n            'id': 'liveplus',\n            'title': r're:^Se\u00f1al en vivo Plus',\n            'live_status': 'is_live',\n            'ext': 'mp4',\n        },\n        'params': {\n            'skip_download': 'Livestream',\n        },\n        'skip': 'Geo-restricted to Colombia',\n    }]\n\n    def _download_player_webpage(self, webpage, display_id):\n        page_id = self._search_regex(\n            (r'window\\.firstPageId\\s*=\\s*[\"\\']([^\"\\']+)', r'<div[^>]+id\\s*=\\s*\"pageBackground_([^\"]+)'),\n            webpage, 'page_id')\n\n        props = self._download_json(self._search_regex(\n            rf'<link[^>]+href\\s*=\\s*\"([^\"]+)\"[^>]+id\\s*=\\s*\"features_{page_id}\"',\n            webpage, 'json_props_url'), display_id)['props']['render']['compProps']\n\n        return self._download_webpage(traverse_obj(props, (..., 'url'))[-1], display_id)\n\n    def _get_clean_title(self, title):\n        return re.sub(r'\\s*\\|\\s*Telecaribe\\s*VOD', '', title or '').strip() or None\n\n    def _real_extract(self, url):\n        display_id = self._match_id(url)\n        webpage = self._download_webpage(url, display_id)\n        player = self._download_player_webpage(webpage, display_id)\n\n        livestream_url = self._search_regex(\n            r'(?:let|const|var)\\s+source\\s*=\\s*[\"\\']([^\"\\']+)', player, 'm3u8 url', default=None)\n\n        if not livestream_url:\n            return self.playlist_from_matches(\n                re.findall(r'<a[^>]+href\\s*=\\s*\"([^\"]+\\.mp4)', player), display_id,\n                self._get_clean_title(self._og_search_title(webpage)))\n\n        formats, subtitles = self._extract_m3u8_formats_and_subtitles(\n            livestream_url, display_id, 'mp4', live=True)\n\n        return {\n            'id': display_id,\n            'title': self._get_clean_title(self._og_search_title(webpage)),\n            'formats': formats,\n            'subtitles': subtitles,\n            'is_live': True,\n        }\n", "path": "yt_dlp/extractor/telecaribe.py"}]}