From 5a1630256979b7ac6601cd246d236531dbf4523d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 09:39:18 +0200 Subject: [PATCH 1/7] [atresplayer] fix authentication --- yt_dlp/extractor/atresplayer.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 8143eb4d7..4d0cb4f85 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -38,7 +38,6 @@ class AtresPlayerIE(InfoExtractor): 'only_matching': True, }, ] - _API_BASE = 'https://api.atresplayer.com/' def _real_initialize(self): self._login() @@ -56,23 +55,18 @@ class AtresPlayerIE(InfoExtractor): if username is None: return - self._request_webpage( - self._API_BASE + 'login', None, 'Downloading login page') - try: - target_url = self._download_json( - 'https://account.atresmedia.com/api/login', None, + self._download_webpage( + 'https://account.atresplayer.com/auth/v1/login', None, 'Logging in', headers={ 'Content-Type': 'application/x-www-form-urlencoded' }, data=urlencode_postdata({ 'username': username, 'password': password, - }))['targetUrl'] + })) except ExtractorError as e: self._handle_error(e, 400) - self._request_webpage(target_url, None, 'Following Target URL') - def _real_extract(self, url): display_id, video_id = self._match_valid_url(url).groups() From f576c41e5b45295ca282d19cd761d033effc9e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 09:40:14 +0200 Subject: [PATCH 2/7] [atresplayer] fix extraction --- yt_dlp/extractor/atresplayer.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 4d0cb4f85..4dc4b405d 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -70,9 +70,19 @@ class AtresPlayerIE(InfoExtractor): def _real_extract(self, url): display_id, video_id = self._match_valid_url(url).groups() + page = self._download_webpage(url, video_id, 'Downloading video page') + preloaded_state_regex = r'window\.__PRELOADED_STATE__\s*=\s*(\{(.*?)\});' + preloaded_state_text = self._html_search_regex(preloaded_state_regex, page, 'preloaded state') + preloaded_state = self._parse_json(preloaded_state_text, video_id) + link_info = next(iter(preloaded_state['links'].values())) + + try: + metadata = self._download_json(link_info['href'], video_id) + except ExtractorError as e: + self._handle_error(e, 403) + try: - episode = self._download_json( - self._API_BASE + 'client/v1/player/episode/' + video_id, video_id) + episode = self._download_json(metadata['urlVideo'], video_id) except ExtractorError as e: self._handle_error(e, 403) From 408965e75d5124a3f857b17aabbce976e1175f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 09:41:10 +0200 Subject: [PATCH 3/7] [atresplayer] fix 'Too many values to unpack' --- yt_dlp/extractor/atresplayer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 4dc4b405d..548998b8d 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -96,11 +96,11 @@ class AtresPlayerIE(InfoExtractor): continue src_type = source.get('type') if src_type == 'application/vnd.apple.mpegurl': - formats, subtitles = self._extract_m3u8_formats( + formats, subtitles = self._extract_m3u8_formats_and_subtitles( src, video_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=False) elif src_type == 'application/dash+xml': - formats, subtitles = self._extract_mpd_formats( + formats, subtitles = self._extract_mpd_formats_and_subtitles( src, video_id, mpd_id='dash', fatal=False) self._sort_formats(formats) From fc57c90cfeb6da41a75add2f2fd56bc30f20c817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 09:42:12 +0200 Subject: [PATCH 4/7] [atresplayer] handle HTTP 400 on login as authentication failure --- yt_dlp/extractor/atresplayer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 548998b8d..78f513cc1 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -65,6 +65,8 @@ class AtresPlayerIE(InfoExtractor): 'password': password, })) except ExtractorError as e: + if isinstance(e.cause, compat_HTTPError) and e.cause.code == 400: + raise ExtractorError('Authentication failure', expected=True) self._handle_error(e, 400) def _real_extract(self, url): From 53edeb43018d32baca93d344a6571219f805ad28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 09:42:43 +0200 Subject: [PATCH 5/7] [atresplayer] relax valid URL regex --- yt_dlp/extractor/atresplayer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 78f513cc1..20512cb79 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -12,7 +12,7 @@ from ..utils import ( class AtresPlayerIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?atresplayer\.com/[^/]+/[^/]+/[^/]+/[^/]+/(?P.+?)_(?P[0-9a-f]{24})' + _VALID_URL = r'https?://(?:www\.)?atresplayer\.com/[^/]+/[^/]+/[^/]+(?:/[^/]+)?/(?P.+?)_(?P[0-9a-f]{24})' _NETRC_MACHINE = 'atresplayer' _TESTS = [ { From 09427cd91ec229d21263f1fc933b835251bf903c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 12:14:54 +0200 Subject: [PATCH 6/7] [atresplayer] handle invalid_request response (auth fail) inside handle_error --- yt_dlp/extractor/atresplayer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 20512cb79..937bce037 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -47,6 +47,8 @@ class AtresPlayerIE(InfoExtractor): error = self._parse_json(e.cause.read(), None) if error.get('error') == 'required_registered': self.raise_login_required() + if error.get('error') == 'invalid_request': + raise ExtractorError('Authentication failed', expected=True) raise ExtractorError(error['error_description'], expected=True) raise @@ -65,8 +67,6 @@ class AtresPlayerIE(InfoExtractor): 'password': password, })) except ExtractorError as e: - if isinstance(e.cause, compat_HTTPError) and e.cause.code == 400: - raise ExtractorError('Authentication failure', expected=True) self._handle_error(e, 400) def _real_extract(self, url): From a427f0fa6c1b7c80b5fb230adbad751fd40d6ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Sola?= Date: Mon, 4 Oct 2021 12:16:09 +0200 Subject: [PATCH 7/7] [atresplayer] fix formats and subtitles being overwritten for every source --- yt_dlp/extractor/atresplayer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/atresplayer.py b/yt_dlp/extractor/atresplayer.py index 937bce037..a3c16280b 100644 --- a/yt_dlp/extractor/atresplayer.py +++ b/yt_dlp/extractor/atresplayer.py @@ -98,12 +98,16 @@ class AtresPlayerIE(InfoExtractor): continue src_type = source.get('type') if src_type == 'application/vnd.apple.mpegurl': - formats, subtitles = self._extract_m3u8_formats_and_subtitles( + new_formats, new_subtitles = self._extract_m3u8_formats_and_subtitles( src, video_id, 'mp4', 'm3u8_native', m3u8_id='hls', fatal=False) elif src_type == 'application/dash+xml': - formats, subtitles = self._extract_mpd_formats_and_subtitles( + new_formats, new_subtitles = self._extract_mpd_formats_and_subtitles( src, video_id, mpd_id='dash', fatal=False) + if new_formats: + formats.extend(new_formats) + if new_subtitles: + subtitles = self._merge_subtitles(subtitles, new_subtitles) self._sort_formats(formats) heartbeat = episode.get('heartbeat') or {}