Repository: yt-dlp/yt-dlp

Issue:
revoir.tv5monde.com not download
### 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 **2022.09.01** ([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

Dania

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

Starting from 2022-09-20 **https://revoir.tv5monde.com** not downloading with yt-dlp.
Sample link https://revoir.tv5monde.com/toutes-les-videos/documentaires/dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere


### 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
C:\Users\Internet>yt-dlp -vU https://revoir.tv5monde.com/toutes-les-videos/documentaires/dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere
[debug] Command-line config: ['-vU', 'https://revoir.tv5monde.com/toutes-les-videos/documentaires/dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere']
[debug] Encodings: locale cp1251, fs utf-8, pref cp1251, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.09.01 [5d7c7d6] (win32_exe)
[debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.19044-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: none
[debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.06.15, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3
[debug] Proxy map: {}
[debug] Loaded 1670 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.09.01, Current version: 2022.09.01
yt-dlp is up to date (2022.09.01)
[debug] [TV5MondePlus] Extracting URL: https://revoir.tv5monde.com/toutes-les-videos/documentaires/dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere
[TV5MondePlus] dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere: Downloading webpage
[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: best/bestvideo+bestaudio
[info] 6890f99d-a79a-1025-0667-14ba542c7f74: Downloading 1 format(s): unknown_video
[debug] Invoking http downloader on "tap:mgd:prd:106669611?application=revoir"
[download] Got error: <urlopen error unknown url type: tap>. Retrying (1/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (2/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (3/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (4/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (5/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (6/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (7/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (8/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (9/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (10/10)...
[download] Got error: <urlopen error unknown url type: tap>. Giving up after 10 retries
  File "yt_dlp\__main__.py", line 18, in <module>
  File "yt_dlp\__init__.py", line 962, in main
  File "yt_dlp\__init__.py", line 954, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3293, in download
  File "yt_dlp\YoutubeDL.py", line 3268, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1448, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1459, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1556, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1614, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2712, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3171, in process_info
  File "yt_dlp\YoutubeDL.py", line 2895, in dl
  File "yt_dlp\downloader\common.py", line 443, in download
  File "yt_dlp\downloader\http.py", line 369, in real_download
  File "yt_dlp\utils.py", line 5794, in __iter__
  File "yt_dlp\downloader\common.py", line 388, in report_retry
  File "yt_dlp\utils.py", line 5801, in report_retry
  File "yt_dlp\downloader\common.py", line 391, in <lambda>
  File "yt_dlp\YoutubeDL.py", line 994, in report_error
  File "yt_dlp\YoutubeDL.py", line 923, in trouble
```



Discussion:
Two changes:
* the video player loader data can have an item like `{url: 'tap:mgd:prd:106669611?application=revoir' type='application/deferred'}`, which resolves via `'https://api.tv5monde.com/player/asset/tap%3Amgd%3Aprd%3A106669611%3Fapplication%3Drevoir/resolve' to a new list of video formats;
* video formats can also be .mpd/DASH.

This is a patch for yt-dlp (though `urllib.parse` might be preferred to the compat module):
```diff
--- old/yt_dlp/extractor/tv5mondeplus.py
+++ new/yt_dlp/extractor/tv5mondeplus.py
@@ -1,8 +1,10 @@
 from .common import InfoExtractor
+from ..compat import compat_urllib_parse
 from ..utils import (
     determine_ext,
     extract_attributes,
     int_or_none,
+    mimetype2ext,
     parse_duration,
     try_get,
 )
@@ -63,20 +65,34 @@
         video_files = self._parse_json(
             vpl_data['data-broadcast'], display_id)
         formats = []
-        for video_file in video_files:
-            v_url = video_file.get('url')
-            if not v_url:
-                continue
-            video_format = video_file.get('format') or determine_ext(v_url)
-            if video_format == 'm3u8':
-                formats.extend(self._extract_m3u8_formats(
-                    v_url, display_id, 'mp4', 'm3u8_native',
-                    m3u8_id='hls', fatal=False))
-            else:
-                formats.append({
-                    'url': v_url,
-                    'format_id': video_format,
-                })
+
+        def process_video_files(v):
+            for video_file in v:
+                v_url = video_file.get('url')
+                if not v_url:
+                    continue
+                if video_file.get('type') == 'application/deferred':
+                    video_file = self._download_json(
+                        'https://api.tv5monde.com/player/asset/%s/resolve' % (compat_urllib_parse.quote(v_url), ),
+                        display_id, note='Downloading asset metadata', fatal=False) or []
+                    process_video_files(video_file)
+                    continue
+                video_format = video_file.get('format') or mimetype2ext(video_file.get('type')) or determine_ext(v_url)
+                if video_format == 'm3u8':
+                    formats.extend(self._extract_m3u8_formats(
+                        v_url, display_id, 'mp4', 'm3u8_native',
+                        m3u8_id='hls', fatal=False))
+                elif video_format == 'mpd':
+                    formats.extend(self._extract_mpd_formats(
+                        v_url, display_id, fatal=False))
+                else:
+                    formats.append({
+                        'url': v_url,
+                        'format_id': video_format,
+                    })
+
+        process_video_files(video_files)
+
         self._sort_formats(formats)
 
         metadata = self._parse_json(
```
I won't be able to apply this patch myself.
They must make changes to the yt-dl.exe file
No doubt this will happen.

There should also be a check for expired content, whose URLs redirect (307) to the home page.

```diff
-        webpage = self._download_webpage(url, display_id)
+        webpage, urlh = self._download_webpage_handle(url, display_id)
+
+        if urlh.geturl().endswith('.tv5monde.com/'):
+            raise ExtractorError('Redirect to home page - content no longer available?')
```

The content is not expired.
https://revoir.tv5monde.com/toutes-les-videos/documentaires/dora-maar-entre-ombre-et-lumiere-dora-maar-entre-ombre-et-lumiere
Indeed, but this test URL in the extractor code is.
```shellsession
$ wget -nv -S --method=HEAD 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/vestiaires-caro-actrice'
  HTTP/1.1 307 Temporary Redirect
...
2022-09-21 10:50:28 URL: https://revoir.tv5monde.com/ 200 OK
$
```
[yt-dlp 2022.10.04](https://github.com/yt-dlp/yt-dlp/releases/tag/2022.10.04) revoir.tv5monde.com not download

Microsoft Windows [Version 10.0.19044.2006]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

C:\Users\Internet>yt-dlp -vU https://revoir.tv5monde.com/toutes-les-videos/cinema/as-de-trefle
[debug] Command-line config: ['-vU', 'https://revoir.tv5monde.com/toutes-les-videos/cinema/as-de-trefle']
[debug] Encodings: locale cp1251, fs utf-8, pref cp1251, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.10.04 [4e0511f] (win32_exe)
[debug] Python 3.8.10 (CPython 64bit) - Windows-10-10.0.19044-SP0
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: none
[debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.09.24, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3
[debug] Proxy map: {}
[debug] Loaded 1690 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.10.04, Current version: 2022.10.04
yt-dlp is up to date (2022.10.04)
[debug] [TV5MondePlus] Extracting URL: https://revoir.tv5monde.com/toutes-les-videos/cinema/as-de-trefle
[TV5MondePlus] as-de-trefle: Downloading webpage
[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: best/bestvideo+bestaudio
[info] 2523d88d-c651-8434-a1f3-56696bbc1f3f: Downloading 1 format(s): unknown_video
[debug] Invoking http downloader on "tap:mgd:prd:106978184?application=revoir"
[download] Got error: <urlopen error unknown url type: tap>. Retrying (1/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (2/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (3/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (4/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (5/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (6/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (7/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (8/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (9/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (10/10)...
[download] Got error: <urlopen error unknown url type: tap>. Giving up after 10 retries
  File "yt_dlp\__main__.py", line 18, in <module>
  File "yt_dlp\__init__.py", line 966, in main
  File "yt_dlp\__init__.py", line 958, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3318, in download
  File "yt_dlp\YoutubeDL.py", line 3293, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1466, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1477, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1574, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1632, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2733, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3196, in process_info
  File "yt_dlp\YoutubeDL.py", line 2920, in dl
  File "yt_dlp\downloader\common.py", line 446, in download
  File "yt_dlp\downloader\http.py", line 369, in real_download
  File "yt_dlp\utils.py", line 5862, in __iter__
  File "yt_dlp\downloader\common.py", line 391, in report_retry
  File "yt_dlp\utils.py", line 5869, in report_retry
  File "yt_dlp\downloader\common.py", line 394, in <lambda>
  File "yt_dlp\YoutubeDL.py", line 996, in report_error
  File "yt_dlp\YoutubeDL.py", line 925, in trouble
The new update didn't fix the issue.

Microsoft Windows [Version 10.0.19045.2251]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

C:\Users\Internet>yt-dlp -vU https://revoir.tv5monde.com/toutes-les-videos/cinema/les-jours-venus
[debug] Command-line config: ['-vU', 'https://revoir.tv5monde.com/toutes-les-videos/cinema/les-jours-venus']
[debug] Encodings: locale cp1251, fs utf-8, pref cp1251, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.11.11 [8b64402] (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 5.1.2-full_build-www.gyan.dev (setts)
[debug] Optional libraries: Cryptodome-3.15.0, brotli-1.0.9, certifi-2022.09.24, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1723 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.11.11, Current version: 2022.11.11
yt-dlp is up to date (2022.11.11)
[debug] [TV5MondePlus] Extracting URL: https://revoir.tv5monde.com/toutes-les-videos/cinema/les-jours-venus
[TV5MondePlus] les-jours-venus: Downloading webpage
[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] ead7fb50-45a8-5612-24d3-adc369854ff6: Downloading 1 format(s): unknown_video
[debug] Invoking http downloader on "tap:mgd:prd:106925881?application=revoir"
[download] Got error: <urlopen error unknown url type: tap>. Retrying (1/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (2/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (3/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (4/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (5/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (6/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (7/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (8/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (9/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (10/10)...
[download] Got error: <urlopen error unknown url type: tap>. Giving up after 10 retries
  File "yt_dlp\__main__.py", line 17, in <module>
  File "yt_dlp\__init__.py", line 968, in main
  File "yt_dlp\__init__.py", line 958, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3322, in download
  File "yt_dlp\YoutubeDL.py", line 3297, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1474, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1485, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1582, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1641, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2737, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3200, in process_info
  File "yt_dlp\YoutubeDL.py", line 2924, in dl
  File "yt_dlp\downloader\common.py", line 446, in download
  File "yt_dlp\downloader\http.py", line 369, in real_download
  File "yt_dlp\utils.py", line 5921, in __iter__
  File "yt_dlp\downloader\common.py", line 391, in report_retry
  File "yt_dlp\utils.py", line 5928, in report_retry
  File "yt_dlp\downloader\common.py", line 394, in <lambda>
  File "yt_dlp\YoutubeDL.py", line 1004, in report_error
  File "yt_dlp\YoutubeDL.py", line 933, in trouble
I don't think the update has yet been released for this issue.
open issue => not fixed
[yt-dlp 2023.01.02] not fixed error https://revoir.tv5monde.com/toutes-les-videos/cinema/a-la-mode
**Will this bug be fixed someday?**

Microsoft Windows [Version 10.0.19045.2364]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

C:\Users\Internet>yt-dlp -vU https://revoir.tv5monde.com/toutes-les-videos/cinema/a-la-mode
[debug] Command-line config: ['-vU', 'https://revoir.tv5monde.com/toutes-les-videos/cinema/a-la-mode']
[debug] User config: []
[debug] System config: []
[debug] Encodings: locale cp1251, fs utf-8, pref cp1251, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2023.01.02 [d83b0ad] (win32_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 5.1.2-full_build-www.gyan.dev (setts)
[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 1754 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.01.02, Current version: 2023.01.02
yt-dlp is up to date (2023.01.02)
[TV5MondePlus] Extracting URL: https://revoir.tv5monde.com/toutes-les-videos/cinema/a-la-mode
[TV5MondePlus] a-la-mode: Downloading webpage
[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] bd37a175-483c-1815-1ee6-d6ac6f2c2ae8: Downloading 1 format(s): unknown_video
[debug] Invoking http downloader on "tap:mgd:prd:107066753?application=revoir"
[download] Got error: <urlopen error unknown url type: tap>. Retrying (1/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (2/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (3/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (4/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (5/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (6/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (7/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (8/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (9/10)...
[download] Got error: <urlopen error unknown url type: tap>. Retrying (10/10)...
[download] Got error: <urlopen error unknown url type: tap>. Giving up after 10 retries
  File "yt_dlp\__main__.py", line 17, in <module>
  File "yt_dlp\__init__.py", line 970, in main
  File "yt_dlp\__init__.py", line 960, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3353, in download
  File "yt_dlp\YoutubeDL.py", line 3328, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1486, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1497, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1594, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1653, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2767, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3231, in process_info
  File "yt_dlp\YoutubeDL.py", line 2954, in dl
  File "yt_dlp\downloader\common.py", line 444, in download
  File "yt_dlp\downloader\http.py", line 369, in real_download
  File "yt_dlp\utils.py", line 6040, in __iter__
  File "yt_dlp\downloader\common.py", line 389, in report_retry
  File "yt_dlp\utils.py", line 6047, in report_retry
  File "yt_dlp\downloader\common.py", line 392, in <lambda>
  File "yt_dlp\YoutubeDL.py", line 1007, in report_error
  File "yt_dlp\YoutubeDL.py", line 936, in trouble
See comment above.
[yt-dlp 2023.01.02] not fixed error https://revoir.tv5monde.com/toutes-les-videos/cinema/a-la-mode
**Will this bug be fixed someday?**

Resolving patch:
diff --git a/yt_dlp/extractor/tv5mondeplus.py b/yt_dlp/extractor/tv5mondeplus.py
--- a/yt_dlp/extractor/tv5mondeplus.py
+++ b/yt_dlp/extractor/tv5mondeplus.py
@@ -1,10 +1,14 @@
+import urllib.parse
+
 from .common import InfoExtractor
 from ..utils import (
     determine_ext,
     extract_attributes,
     int_or_none,
     parse_duration,
+    traverse_obj,
     try_get,
+    url_or_none,
 )
 
 
@@ -12,6 +16,36 @@ class TV5MondePlusIE(InfoExtractor):
     IE_DESC = 'TV5MONDE+'
     _VALID_URL = r'https?://(?:www\.)?(?:tv5mondeplus|revoir\.tv5monde)\.com/toutes-les-videos/[^/]+/(?P<id>[^/?#]+)'
     _TESTS = [{
+        # movie
+        'url': 'https://revoir.tv5monde.com/toutes-les-videos/cinema/les-novices',
+        'md5': 'c86f60bf8b75436455b1b205f9745955',
+        'info_dict': {
+            'id': 'ZX0ipMyFQq_6D4BA7b',
+            'display_id': 'les-novices',
+            'ext': 'mp4',
+            'title': 'Les novices',
+            'description': 'md5:2e7c33ba3ad48dabfcc2a956b88bde2b',
+            'upload_date': '20230821',
+            'thumbnail': 'https://revoir.tv5monde.com/uploads/media/video_thumbnail/0738/60/01e952b7ccf36b7c6007ec9131588954ab651de9.jpeg',
+            'duration': 5177,
+            'episode': 'Les novices',
+        },
+    }, {
+        # series episode
+        'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/opj-les-dents-de-la-terre-2',
+        'info_dict': {
+            'id': 'wJ0eeEPozr_6D4BA7b',
+            'display_id': 'opj-les-dents-de-la-terre-2',
+            'ext': 'mp4',
+            'title': "OPJ - Les dents de la Terre (2)",
+            'description': 'md5:288f87fd68d993f814e66e60e5302d9d',
+            'upload_date': '20230823',
+            'series': 'OPJ',
+            'episode': 'Les dents de la Terre (2)',
+            'duration': 2877,
+            'thumbnail': 'https://dl-revoir.tv5monde.com/images/1a/5753448.jpg'
+        },
+    }, {
         # movie
         'url': 'https://revoir.tv5monde.com/toutes-les-videos/cinema/ceux-qui-travaillent',
         'md5': '32fa0cde16a4480d1251502a66856d5f',
@@ -23,6 +57,7 @@ class TV5MondePlusIE(InfoExtractor):
             'description': 'md5:570e8bb688036ace873b2d50d24c026d',
             'upload_date': '20210819',
         },
+        'skip': 'no longer available',
     }, {
         # series episode
         'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/vestiaires-caro-actrice',
@@ -39,6 +74,7 @@ class TV5MondePlusIE(InfoExtractor):
         'params': {
             'skip_download': True,
         },
+        'skip': 'no longer available',
     }, {
         'url': 'https://revoir.tv5monde.com/toutes-les-videos/series-fictions/neuf-jours-en-hiver-neuf-jours-en-hiver',
         'only_matching': True,
@@ -63,20 +99,45 @@ def _real_extract(self, url):
         video_files = self._parse_json(
             vpl_data['data-broadcast'], display_id)
         formats = []
-        for video_file in video_files:
-            v_url = video_file.get('url')
-            if not v_url:
-                continue
-            video_format = video_file.get('format') or determine_ext(v_url)
-            if video_format == 'm3u8':
-                formats.extend(self._extract_m3u8_formats(
-                    v_url, display_id, 'mp4', 'm3u8_native',
-                    m3u8_id='hls', fatal=False))
-            else:
-                formats.append({
-                    'url': v_url,
-                    'format_id': video_format,
-                })
+        video_id = None
+
+        def process_video_files(v):
+            nonlocal video_id
+            for video_file in v:
+                v_url = video_file.get('url')
+                if not v_url:
+                    continue
+                if video_file.get('type') == 'application/deferred':
+                    d_param = urllib.parse.quote(v_url)
+                    token = video_file.get('token')
+                    if not token:
+                        continue
+                    deferred_json = self._download_json(
+                        f'https://api.tv5monde.com/player/asset/{d_param}/resolve?condenseKS=true', display_id,
+                        note='Downloading deferred info', headers={'Authorization': f'Bearer {token}'}, fatal=False)
+                    v_url = traverse_obj(deferred_json, (0, 'url', {url_or_none}))
+                    if not v_url:
+                        continue
+                    # data-guid from the webpage isn't stable, use the material id from the json urls
+                    video_id = self._search_regex(
+                        r'materials/([\da-zA-Z]{10}_[\da-fA-F]{7})/', v_url, 'video id', default=None)
+                    process_video_files(deferred_json)
+
+                video_format = video_file.get('format') or determine_ext(v_url)
+                if video_format == 'm3u8':
+                    formats.extend(self._extract_m3u8_formats(
+                        v_url, display_id, 'mp4', 'm3u8_native',
+                        m3u8_id='hls', fatal=False))
+                elif video_format == 'mpd':
+                    formats.extend(self._extract_mpd_formats(
+                        v_url, display_id, fatal=False))
+                else:
+                    formats.append({
+                        'url': v_url,
+                        'format_id': video_format,
+                    })
+
+        process_video_files(video_files)
 
         metadata = self._parse_json(
             vpl_data['data-metadata'], display_id)
@@ -100,10 +161,11 @@ def _real_extract(self, url):
         if upload_date:
             upload_date = upload_date.replace('_', '')
 
-        video_id = self._search_regex(
-            (r'data-guid=["\']([\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})',
-             r'id_contenu["\']\s:\s*(\d+)'), webpage, 'video id',
-            default=display_id)
+        if not video_id:
+            video_id = self._search_regex(
+                (r'data-guid=["\']([\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12})',
+                 r'id_contenu["\']\s:\s*(\d+)'), webpage, 'video id',
+                default=display_id)
 
         return {
             'id': video_id,


Test patch: