aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbashonly <88596187+bashonly@users.noreply.github.com>2024-06-13 17:44:20 -0500
committerGitHub <noreply@github.com>2024-06-13 22:44:20 +0000
commit3690c2f59827c79a1bbe388a7c1ae75db7477db2 (patch)
tree7fa315ac27d8198c9a1e7c243196796c89294515
parent081708d6074dfbb907e25af61ba530bba0d4b31d (diff)
[ie/francetv] Detect and raise errors for DRM (#10165)
Closes #10163 Authored by: bashonly
-rw-r--r--yt_dlp/extractor/francetv.py24
1 files changed, 19 insertions, 5 deletions
diff --git a/yt_dlp/extractor/francetv.py b/yt_dlp/extractor/francetv.py
index de2bec25a..ab08f1c6b 100644
--- a/yt_dlp/extractor/francetv.py
+++ b/yt_dlp/extractor/francetv.py
@@ -5,6 +5,7 @@ from .common import InfoExtractor
from .dailymotion import DailymotionIE
from ..networking import HEADRequest
from ..utils import (
+ clean_html,
determine_ext,
filter_dict,
format_field,
@@ -82,6 +83,7 @@ class FranceTVIE(InfoExtractor):
def _extract_video(self, video_id, hostname=None):
is_live = None
videos = []
+ drm_formats = False
title = None
subtitle = None
episode_number = None
@@ -99,13 +101,12 @@ class FranceTVIE(InfoExtractor):
'device_type': device_type,
'browser': browser,
'domain': hostname,
- }), fatal=False)
+ }), fatal=False, expected_status=422) # 422 json gives detailed error code/message
if not dinfo:
continue
- video = traverse_obj(dinfo, ('video', {dict}))
- if video:
+ if video := traverse_obj(dinfo, ('video', {dict})):
videos.append(video)
if duration is None:
duration = video.get('duration')
@@ -113,9 +114,19 @@ class FranceTVIE(InfoExtractor):
is_live = video.get('is_live')
if spritesheets is None:
spritesheets = video.get('spritesheets')
+ elif code := traverse_obj(dinfo, ('code', {int})):
+ if code == 2009:
+ self.raise_geo_restricted(countries=self._GEO_COUNTRIES)
+ elif code in (2015, 2017):
+ # 2015: L'accès à cette vidéo est impossible. (DRM-only)
+ # 2017: Cette vidéo n'est pas disponible depuis le site web mobile (b/c DRM)
+ drm_formats = True
+ continue
+ self.report_warning(
+ f'{self.IE_NAME} said: {code} "{clean_html(dinfo.get("message"))}"')
+ continue
- meta = traverse_obj(dinfo, ('meta', {dict}))
- if meta:
+ if meta := traverse_obj(dinfo, ('meta', {dict})):
if title is None:
title = meta.get('title')
# meta['pre_title'] contains season and episode number for series in format "S<ID> E<ID>"
@@ -128,6 +139,9 @@ class FranceTVIE(InfoExtractor):
if timestamp is None:
timestamp = parse_iso8601(meta.get('broadcasted_at'))
+ if not videos and drm_formats:
+ self.report_drm(video_id)
+
formats, subtitles, video_url = [], {}, None
for video in traverse_obj(videos, lambda _, v: url_or_none(v['url'])):
video_url = video['url']