From 94f3b62e958b2fd295d48d5d5e0a508dc013d250 Mon Sep 17 00:00:00 2001 From: Kevin G Date: Tue, 1 Jan 2019 14:23:18 -0800 Subject: [PATCH 1/5] [compoundmedia] Add new extractor --- youtube_dl/extractor/compoundmedia.py | 87 +++++++++++++++++++++++++++ youtube_dl/extractor/extractors.py | 1 + 2 files changed, 88 insertions(+) create mode 100644 youtube_dl/extractor/compoundmedia.py diff --git a/youtube_dl/extractor/compoundmedia.py b/youtube_dl/extractor/compoundmedia.py new file mode 100644 index 000000000..3e33dedd1 --- /dev/null +++ b/youtube_dl/extractor/compoundmedia.py @@ -0,0 +1,87 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from .common import InfoExtractor + +import re +import sys + +from ..utils import ( + ExtractorError, + urlencode_postdata, +) + +from .livestream import LivestreamIE + + +class CompoundMediaIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?compoundmedia\.com/shows/[^/]+/(?P[0-9]+)' + _LOGIN_URL = 'https://www.compoundmedia.com/api/login' + _METADATA_URL_PREFIX = 'https://www.compoundmedia.com/api/video/' + _NETRC_MACHINE = 'compoundmedia' + + # No tests because all videos require authentication + # _TEST = { + # 'url': 'https://www.compoundmedia.com/shows/tacs/1851', + # 'md5': '756a17ea88a671d9faafc6aa406abdb0', + # 'info_dict': { + # 'id': '1851', + # 'title': 'TACS 001 - The First Episode', + # } + # } + + def _real_extract(self, url): + video_id = self._match_id(url) + + username, password = self._get_login_info() + if username is None: + self.raise_login_required() + + data = { + 'email': username, + 'password': password, + } + + login_page, url_handle = self._download_json_handle( + self._LOGIN_URL, None, 'Logging in', + data=urlencode_postdata(data), headers={ + 'Content-Type': 'application/x-www-form-urlencoded', + 'Referer': self._LOGIN_URL, + }) + + if login_page.get('token') is None: + raise ExtractorError('Invalid username or password', expected=True) + + for header, cookies in url_handle.headers.items(): + if header.lower() != 'set-cookie': + continue + if sys.version_info[0] >= 3: + cookies = cookies.encode('iso-8859-1') + cookies = cookies.decode('utf-8') + cfduid = re.search( + r'__cfduid=(.+?);.*?\bdomain=(.+?)(?:[,;]|$)', cookies) + if cfduid: + value, domain = cfduid.groups() + self._set_cookie(domain, '__cfduid', value) + break + + metadata = self._download_json( + self._METADATA_URL_PREFIX + video_id, None, 'Requesting Metadata') + + url = metadata['m3u8'] + url = url.replace( + "https://livestreamapis.com/v3", "https://livestream.com") + url = url.replace(".m3u8", "/player") + + title = metadata['title'] + + self.to_screen("Title: " + title) + self.to_screen("Requesting " + url) + + livestreamie = LivestreamIE() + livestreamie.set_downloader(self._downloader) + livestreamdata = livestreamie._real_extract(url) + livestreamdata['id'] = video_id + livestreamdata['title'] = title + + return livestreamdata diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index d72f52e36..d39642766 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -232,6 +232,7 @@ from .commonprotocols import ( MmsIE, RtmpIE, ) +from .compoundmedia import CompoundMediaIE from .condenast import CondeNastIE from .corus import CorusIE from .cracked import CrackedIE From 24b0a51c2da24c58680edff188d5f1a44c3ac9a7 Mon Sep 17 00:00:00 2001 From: Kevin G Date: Tue, 1 Jan 2019 14:36:57 -0800 Subject: [PATCH 2/5] [compoundmedia] Use self.url_result instead of directly using IE --- youtube_dl/extractor/compoundmedia.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/youtube_dl/extractor/compoundmedia.py b/youtube_dl/extractor/compoundmedia.py index 3e33dedd1..0dcba21bf 100644 --- a/youtube_dl/extractor/compoundmedia.py +++ b/youtube_dl/extractor/compoundmedia.py @@ -11,8 +11,6 @@ from ..utils import ( urlencode_postdata, ) -from .livestream import LivestreamIE - class CompoundMediaIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?compoundmedia\.com/shows/[^/]+/(?P[0-9]+)' @@ -72,16 +70,9 @@ class CompoundMediaIE(InfoExtractor): url = url.replace( "https://livestreamapis.com/v3", "https://livestream.com") url = url.replace(".m3u8", "/player") - title = metadata['title'] self.to_screen("Title: " + title) self.to_screen("Requesting " + url) - livestreamie = LivestreamIE() - livestreamie.set_downloader(self._downloader) - livestreamdata = livestreamie._real_extract(url) - livestreamdata['id'] = video_id - livestreamdata['title'] = title - - return livestreamdata + return self.url_result(url, 'Livestream') From 7cb955cf10b10470571d7ed6c1f7f12ffac0845b Mon Sep 17 00:00:00 2001 From: Kevin G Date: Tue, 1 Jan 2019 14:38:55 -0800 Subject: [PATCH 3/5] [compoundmedia] Pull request feedback --- youtube_dl/extractor/compoundmedia.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/youtube_dl/extractor/compoundmedia.py b/youtube_dl/extractor/compoundmedia.py index 0dcba21bf..dad2bf1aa 100644 --- a/youtube_dl/extractor/compoundmedia.py +++ b/youtube_dl/extractor/compoundmedia.py @@ -18,16 +18,6 @@ class CompoundMediaIE(InfoExtractor): _METADATA_URL_PREFIX = 'https://www.compoundmedia.com/api/video/' _NETRC_MACHINE = 'compoundmedia' - # No tests because all videos require authentication - # _TEST = { - # 'url': 'https://www.compoundmedia.com/shows/tacs/1851', - # 'md5': '756a17ea88a671d9faafc6aa406abdb0', - # 'info_dict': { - # 'id': '1851', - # 'title': 'TACS 001 - The First Episode', - # } - # } - def _real_extract(self, url): video_id = self._match_id(url) @@ -69,10 +59,5 @@ class CompoundMediaIE(InfoExtractor): url = metadata['m3u8'] url = url.replace( "https://livestreamapis.com/v3", "https://livestream.com") - url = url.replace(".m3u8", "/player") - title = metadata['title'] - - self.to_screen("Title: " + title) - self.to_screen("Requesting " + url) return self.url_result(url, 'Livestream') From 3d7133febcae253ddba65a29d6af69a7183c62e3 Mon Sep 17 00:00:00 2001 From: Kevin G Date: Tue, 1 Jan 2019 14:39:45 -0800 Subject: [PATCH 4/5] [compoundmedia] Pull request feedback --- youtube_dl/extractor/compoundmedia.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/extractor/compoundmedia.py b/youtube_dl/extractor/compoundmedia.py index dad2bf1aa..ef0d91159 100644 --- a/youtube_dl/extractor/compoundmedia.py +++ b/youtube_dl/extractor/compoundmedia.py @@ -58,6 +58,6 @@ class CompoundMediaIE(InfoExtractor): url = metadata['m3u8'] url = url.replace( - "https://livestreamapis.com/v3", "https://livestream.com") + 'https://livestreamapis.com/v3', 'https://livestream.com') return self.url_result(url, 'Livestream') From 1f27d68da21a251b0c57e5e6dbba04a2f68414d2 Mon Sep 17 00:00:00 2001 From: Kevin G Date: Tue, 1 Jan 2019 14:41:30 -0800 Subject: [PATCH 5/5] [compoundmedia] Pull request feedback --- youtube_dl/extractor/compoundmedia.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/youtube_dl/extractor/compoundmedia.py b/youtube_dl/extractor/compoundmedia.py index ef0d91159..bd13463ec 100644 --- a/youtube_dl/extractor/compoundmedia.py +++ b/youtube_dl/extractor/compoundmedia.py @@ -3,9 +3,6 @@ from __future__ import unicode_literals from .common import InfoExtractor -import re -import sys - from ..utils import ( ExtractorError, urlencode_postdata, @@ -40,19 +37,6 @@ class CompoundMediaIE(InfoExtractor): if login_page.get('token') is None: raise ExtractorError('Invalid username or password', expected=True) - for header, cookies in url_handle.headers.items(): - if header.lower() != 'set-cookie': - continue - if sys.version_info[0] >= 3: - cookies = cookies.encode('iso-8859-1') - cookies = cookies.decode('utf-8') - cfduid = re.search( - r'__cfduid=(.+?);.*?\bdomain=(.+?)(?:[,;]|$)', cookies) - if cfduid: - value, domain = cfduid.groups() - self._set_cookie(domain, '__cfduid', value) - break - metadata = self._download_json( self._METADATA_URL_PREFIX + video_id, None, 'Requesting Metadata')