From 62ffe36dff50e16ff5346d689dac7c5ada8e9c33 Mon Sep 17 00:00:00 2001 From: Elyse <26639800+elyse0@users.noreply.github.com> Date: Sat, 11 Mar 2023 10:14:23 -0600 Subject: [PATCH 1/4] [ettutv] Add extractor --- yt_dlp/extractor/_extractors.py | 1 + yt_dlp/extractor/ettu.py | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 yt_dlp/extractor/ettu.py diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index 01281b5a15c..79cba07b7f6 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -527,6 +527,7 @@ ) from .elonet import ElonetIE from .elpais import ElPaisIE +from .ettu import EttuTvIE from .embedly import EmbedlyIE from .engadget import EngadgetIE from .epicon import ( diff --git a/yt_dlp/extractor/ettu.py b/yt_dlp/extractor/ettu.py new file mode 100644 index 00000000000..4e8bb09f490 --- /dev/null +++ b/yt_dlp/extractor/ettu.py @@ -0,0 +1,60 @@ +from .common import InfoExtractor +from ..utils import traverse_obj, unified_timestamp + + +class EttuTvIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?ettu\.tv/[^?#]+/playerpage/(?P[0-9]+)' + + _TESTS = [{ + 'url': 'https://www.ettu.tv/en-int/playerpage/1573849', + 'md5': '5874b7639a2aa866d1f6c3a4037c7c09', + 'info_dict': { + 'id': '1573849', + 'title': 'Ni Xia Lian - Shao Jieni', + 'description': 'ITTF Europe Top 16 Cup', + 'timestamp': 1677348600, + 'upload_date': '20230225', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'ext': 'mp4', + }, + }, { + 'url': 'https://www.ettu.tv/en-int/playerpage/1573753', + 'md5': '1fc094bf96cf2d5ec0f434d3a6dec9aa', + 'info_dict': { + 'id': '1573753', + 'title': 'Qiu Dang - Jorgic Darko', + 'description': 'ITTF Europe Top 16 Cup', + 'timestamp': 1677423600, + 'upload_date': '20230226', + 'thumbnail': r're:^https?://.*\.(?:jpg|png)', + 'ext': 'mp4', + }, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + + player_settings = self._download_json( + f'https://www.ettu.tv/api/v3/contents/{video_id}/player-settings', video_id, query={ + 'language': 'en', + 'showTitle': 'true', + 'device': 'desktop', + }) + + stream_response = self._download_json(player_settings['streamAccess'], video_id, data={}) + + formats, subtitles = self._extract_m3u8_formats_and_subtitles( + stream_response['data']['stream'], video_id, 'mp4') + + return { + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + **traverse_obj(player_settings, { + 'title': 'title', + 'description': ('metaInformation', 'competition'), + 'thumbnail': 'image', + 'timestamp': ('date', {unified_timestamp}), + 'is_live': 'isLivestream', + }) + } From 3e20f18aff4b4bdba8ce49bc7017b4bb16358f4e Mon Sep 17 00:00:00 2001 From: Elyse <26639800+elyse0@users.noreply.github.com> Date: Mon, 20 Mar 2023 14:49:25 -0600 Subject: [PATCH 2/4] Rename file from ettu to ettutv --- yt_dlp/extractor/_extractors.py | 2 +- yt_dlp/extractor/{ettu.py => ettutv.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename yt_dlp/extractor/{ettu.py => ettutv.py} (100%) diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index 79cba07b7f6..30863ec62bf 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -527,7 +527,7 @@ ) from .elonet import ElonetIE from .elpais import ElPaisIE -from .ettu import EttuTvIE +from .ettutv import EttuTvIE from .embedly import EmbedlyIE from .engadget import EngadgetIE from .epicon import ( diff --git a/yt_dlp/extractor/ettu.py b/yt_dlp/extractor/ettutv.py similarity index 100% rename from yt_dlp/extractor/ettu.py rename to yt_dlp/extractor/ettutv.py From 9b39974873238cf4b235c481659c346dadaa639a Mon Sep 17 00:00:00 2001 From: Elyse <26639800+elyse0@users.noreply.github.com> Date: Tue, 21 Mar 2023 12:27:39 -0600 Subject: [PATCH 3/4] Sort import --- yt_dlp/extractor/_extractors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index 30863ec62bf..83873d18de3 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -527,7 +527,6 @@ ) from .elonet import ElonetIE from .elpais import ElPaisIE -from .ettutv import EttuTvIE from .embedly import EmbedlyIE from .engadget import EngadgetIE from .epicon import ( @@ -554,6 +553,7 @@ ESPNCricInfoIE, ) from .esri import EsriVideoIE +from .ettutv import EttuTvIE from .europa import EuropaIE, EuroParlWebstreamIE from .europeantour import EuropeanTourIE from .eurosport import EurosportIE From 65db08abad5e44421c2630d4fd3458724de4b8a6 Mon Sep 17 00:00:00 2001 From: bashonly <88596187+bashonly@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:42:32 +0000 Subject: [PATCH 4/4] Apply suggestions from code review --- yt_dlp/extractor/ettutv.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yt_dlp/extractor/ettutv.py b/yt_dlp/extractor/ettutv.py index 4e8bb09f490..46d7255438c 100644 --- a/yt_dlp/extractor/ettutv.py +++ b/yt_dlp/extractor/ettutv.py @@ -1,5 +1,5 @@ from .common import InfoExtractor -from ..utils import traverse_obj, unified_timestamp +from ..utils import bool_or_none, traverse_obj, unified_timestamp, url_or_none class EttuTvIE(InfoExtractor): @@ -53,8 +53,8 @@ def _real_extract(self, url): **traverse_obj(player_settings, { 'title': 'title', 'description': ('metaInformation', 'competition'), - 'thumbnail': 'image', + 'thumbnail': ('image', {url_or_none}), 'timestamp': ('date', {unified_timestamp}), - 'is_live': 'isLivestream', + 'is_live': ('isLivestream', {bool_or_none}), }) }