Skip to content

Commit

Permalink
[openload] Add support for verystream.com (closes #20701) (#20967)
Browse files Browse the repository at this point in the history
  • Loading branch information
ealgase authored and Sergey M committed May 10, 2019
1 parent 027ffdc commit 4eec112
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 24 deletions.
5 changes: 4 additions & 1 deletion youtube_dl/extractor/extractors.py
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,10 @@
OoyalaIE,
OoyalaExternalIE,
)
from .openload import OpenloadIE
from .openload import (
OpenloadIE,
VerystreamIE,
)
from .ora import OraTVIE
from .orf import (
ORFTVthekIE,
Expand Down
11 changes: 10 additions & 1 deletion youtube_dl/extractor/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@
from .videa import VideaIE
from .twentymin import TwentyMinutenIE
from .ustream import UstreamIE
from .openload import OpenloadIE
from .openload import (
OpenloadIE,
VerystreamIE,
)
from .videopress import VideoPressIE
from .rutube import RutubeIE
from .limelight import LimelightBaseIE
Expand Down Expand Up @@ -3017,6 +3020,12 @@ def _real_extract(self, url):
return self.playlist_from_matches(
openload_urls, video_id, video_title, ie=OpenloadIE.ie_key())

# Look for Verystream embeds
verystream_urls = VerystreamIE._extract_urls(webpage)
if verystream_urls:
return self.playlist_from_matches(
verystream_urls, video_id, video_title, ie=VerystreamIE.ie_key())

# Look for VideoPress embeds
videopress_urls = VideoPressIE._extract_urls(webpage)
if videopress_urls:
Expand Down
86 changes: 64 additions & 22 deletions youtube_dl/extractor/openload.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,10 @@ class OpenloadIE(InfoExtractor):
(?:f|embed)/
(?P<id>[a-zA-Z0-9-_]+)
''' % _DOMAINS

_EMBED_WORD = 'embed'
_STREAM_WORD = 'f'
_REDIR_WORD = 'stream'
_URL_IDS = ('streamurl', 'streamuri', 'streamurj')
_TESTS = [{
'url': 'https://openload.co/f/kUEfGclsU9o',
'md5': 'bf1c059b004ebc7a256f89408e65c36e',
Expand Down Expand Up @@ -1948,11 +1951,16 @@ class OpenloadIE(InfoExtractor):
'69.0.3497.28',
)

@staticmethod
def _extract_urls(webpage):
@classmethod
def _extract_urls(cls, webpage):
return re.findall(
r'<iframe[^>]+src=["\']((?:https?://)?%s/embed/[a-zA-Z0-9-_]+)'
% OpenloadIE._DOMAINS, webpage)
r'<iframe[^>]+src=["\']((?:https?://)?%s/%s/[a-zA-Z0-9-_]+)'
% (cls._DOMAINS, cls._EMBED_WORD), webpage)

def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
phantom = PhantomJSwrapper(self, required_version='2.0')
webpage, _ = phantom.get(page_url, html=webpage, video_id=video_id, headers=headers)
return webpage

def _real_extract(self, url):
mobj = re.match(self._VALID_URL, url)
Expand All @@ -1964,9 +1972,9 @@ def _real_extract(self, url):
'User-Agent': self._USER_AGENT_TPL % random.choice(self._CHROME_VERSIONS),
}

for path in ('embed', 'f'):
for path in (self._EMBED_WORD, self._STREAM_WORD):
page_url = url_pattern % path
last = path == 'f'
last = path == self._STREAM_WORD
webpage = self._download_webpage(
page_url, video_id, 'Downloading %s webpage' % path,
headers=headers, fatal=last)
Expand All @@ -1978,21 +1986,20 @@ def _real_extract(self, url):
raise ExtractorError('File not found', expected=True, video_id=video_id)
break

phantom = PhantomJSwrapper(self, required_version='2.0')
webpage, _ = phantom.get(page_url, html=webpage, video_id=video_id, headers=headers)

decoded_id = (get_element_by_id('streamurl', webpage) or
get_element_by_id('streamuri', webpage) or
get_element_by_id('streamurj', webpage) or
self._search_regex(
(r'>\s*([\w-]+~\d{10,}~\d+\.\d+\.0\.0~[\w-]+)\s*<',
r'>\s*([\w~-]+~\d+\.\d+\.\d+\.\d+~[\w~-]+)',
r'>\s*([\w-]+~\d{10,}~(?:[a-f\d]+:){2}:~[\w-]+)\s*<',
r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)\s*<',
r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)'), webpage,
'stream URL'))

video_url = 'https://%s/stream/%s?mime=true' % (host, decoded_id)
webpage = self._extract_decrypted_page(page_url, webpage, video_id, headers)
for element_id in self._URL_IDS:
decoded_id = get_element_by_id(element_id, webpage)
if decoded_id:
break
if not decoded_id:
decoded_id = self._search_regex(
(r'>\s*([\w-]+~\d{10,}~\d+\.\d+\.0\.0~[\w-]+)\s*<',
r'>\s*([\w~-]+~\d+\.\d+\.\d+\.\d+~[\w~-]+)',
r'>\s*([\w-]+~\d{10,}~(?:[a-f\d]+:){2}:~[\w-]+)\s*<',
r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)\s*<',
r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)'), webpage,
'stream URL')
video_url = 'https://%s/%s/%s?mime=true' % (host, self._REDIR_WORD, decoded_id)

title = self._og_search_title(webpage, default=None) or self._search_regex(
r'<span[^>]+class=["\']title["\'][^>]*>([^<]+)', webpage,
Expand All @@ -2012,3 +2019,38 @@ def _real_extract(self, url):
'subtitles': subtitles,
'http_headers': headers,
}


class VerystreamIE(OpenloadIE):
IE_NAME = 'verystream'

_DOMAINS = r'(?:verystream\.com)'
_VALID_URL = r'''(?x)
https?://
(?P<host>
(?:www\.)?
%s
)/
(?:stream|e)/
(?P<id>[a-zA-Z0-9-_]+)
''' % _DOMAINS
_EMBED_WORD = 'e'
_STREAM_WORD = 'stream'
_REDIR_WORD = 'gettoken'
_URL_IDS = ('videolink', )
_TESTS = [{
'url': 'https://verystream.com/stream/c1GWQ9ngBBx/',
'md5': 'd3e8c5628ccb9970b65fd65269886795',
'info_dict': {
'id': 'c1GWQ9ngBBx',
'ext': 'mp4',
'title': 'Big Buck Bunny.mp4',
'thumbnail': r're:^https?://.*\.jpg$',
},
}, {
'url': 'https://verystream.com/e/c1GWQ9ngBBx/',
'only_matching': True,
}]

def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
return webpage # for Verystream, the webpage is already decrypted

0 comments on commit 4eec112

Please sign in to comment.