|
|
@ -3,21 +3,17 @@ from __future__ import unicode_literals |
|
|
|
|
|
|
|
import json |
|
|
|
import os |
|
|
|
import re |
|
|
|
import subprocess |
|
|
|
import tempfile |
|
|
|
|
|
|
|
from .common import InfoExtractor |
|
|
|
from ..compat import ( |
|
|
|
compat_urlparse, |
|
|
|
compat_kwargs, |
|
|
|
) |
|
|
|
from ..utils import ( |
|
|
|
check_executable, |
|
|
|
determine_ext, |
|
|
|
encodeArgument, |
|
|
|
ExtractorError, |
|
|
|
get_element_by_id, |
|
|
|
get_exe_version, |
|
|
|
is_outdated_version, |
|
|
|
std_headers, |
|
|
@ -240,262 +236,3 @@ class PhantomJSwrapper(object): |
|
|
|
self._load_cookies() |
|
|
|
|
|
|
|
return (html, encodeArgument(out)) |
|
|
|
|
|
|
|
|
|
|
|
class OpenloadIE(InfoExtractor): |
|
|
|
_DOMAINS = r''' |
|
|
|
(?: |
|
|
|
openload\.(?:co|io|link|pw)| |
|
|
|
oload\.(?:tv|best|biz|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|online|monster|press|pw|life|live|space|services|website|vip)| |
|
|
|
oladblock\.(?:services|xyz|me)|openloed\.co |
|
|
|
) |
|
|
|
''' |
|
|
|
_VALID_URL = r'''(?x) |
|
|
|
https?:// |
|
|
|
(?P<host> |
|
|
|
(?:www\.)? |
|
|
|
%s |
|
|
|
)/ |
|
|
|
(?: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', |
|
|
|
'info_dict': { |
|
|
|
'id': 'kUEfGclsU9o', |
|
|
|
'ext': 'mp4', |
|
|
|
'title': 'skyrim_no-audio_1080.mp4', |
|
|
|
'thumbnail': r're:^https?://.*\.jpg$', |
|
|
|
}, |
|
|
|
}, { |
|
|
|
'url': 'https://openload.co/embed/rjC09fkPLYs', |
|
|
|
'info_dict': { |
|
|
|
'id': 'rjC09fkPLYs', |
|
|
|
'ext': 'mp4', |
|
|
|
'title': 'movie.mp4', |
|
|
|
'thumbnail': r're:^https?://.*\.jpg$', |
|
|
|
'subtitles': { |
|
|
|
'en': [{ |
|
|
|
'ext': 'vtt', |
|
|
|
}], |
|
|
|
}, |
|
|
|
}, |
|
|
|
'params': { |
|
|
|
'skip_download': True, # test subtitles only |
|
|
|
}, |
|
|
|
}, { |
|
|
|
'url': 'https://openload.co/embed/kUEfGclsU9o/skyrim_no-audio_1080.mp4', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://openload.io/f/ZAn6oz-VZGE/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://openload.co/f/_-ztPaZtMhM/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
# unavailable via https://openload.co/f/Sxz5sADo82g/, different layout |
|
|
|
# for title and ext |
|
|
|
'url': 'https://openload.co/embed/Sxz5sADo82g/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
# unavailable via https://openload.co/embed/e-Ixz9ZR5L0/ but available |
|
|
|
# via https://openload.co/f/e-Ixz9ZR5L0/ |
|
|
|
'url': 'https://openload.co/f/e-Ixz9ZR5L0/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.tv/embed/KnG-kKZdcfY/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'http://www.openload.link/f/KnG-kKZdcfY', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.stream/f/KnG-kKZdcfY', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.xyz/f/WwRBpzW8Wtk', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.win/f/kUEfGclsU9o', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.download/f/kUEfGclsU9o', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.cloud/f/4ZDnBXRWiB8', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
# Its title has not got its extension but url has it |
|
|
|
'url': 'https://oload.download/f/N4Otkw39VCw/Tomb.Raider.2018.HDRip.XviD.AC3-EVO.avi.mp4', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.cc/embed/5NEAbI2BDSk', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.icu/f/-_i4y_F_Hs8', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.fun/f/gb6G1H4sHXY', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.club/f/Nr1L-aZ2dbQ', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.info/f/5NEAbI2BDSk', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://openload.pw/f/WyKgK8s94N0', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.pw/f/WyKgK8s94N0', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.live/f/-Z58UZ-GR4M', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.space/f/IY4eZSst3u8/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.services/embed/bs1NWj1dCag/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.online/f/W8o2UfN1vNY/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.monster/f/W8o2UfN1vNY/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.press/embed/drTBl1aOTvk/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.website/embed/drTBl1aOTvk/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.life/embed/oOzZjNPw9Dc/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.biz/f/bEk3Gp8ARr4/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.best/embed/kkz9JgVZeWc/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oladblock.services/f/b8NWEgkqNLI/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oladblock.xyz/f/b8NWEgkqNLI/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oladblock.me/f/b8NWEgkqNLI/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://openloed.co/f/b8NWEgkqNLI/', |
|
|
|
'only_matching': True, |
|
|
|
}, { |
|
|
|
'url': 'https://oload.vip/f/kUEfGclsU9o', |
|
|
|
'only_matching': True, |
|
|
|
}] |
|
|
|
|
|
|
|
@classmethod |
|
|
|
def _extract_urls(cls, webpage): |
|
|
|
return re.findall( |
|
|
|
r'(?x)<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): |
|
|
|
phantom = PhantomJSwrapper(self, required_version='2.0') |
|
|
|
webpage, _ = phantom.get(page_url, html=webpage, video_id=video_id) |
|
|
|
return webpage |
|
|
|
|
|
|
|
def _real_extract(self, url): |
|
|
|
mobj = re.match(self._VALID_URL, url) |
|
|
|
host = mobj.group('host') |
|
|
|
video_id = mobj.group('id') |
|
|
|
|
|
|
|
url_pattern = 'https://%s/%%s/%s/' % (host, video_id) |
|
|
|
|
|
|
|
for path in (self._EMBED_WORD, self._STREAM_WORD): |
|
|
|
page_url = url_pattern % path |
|
|
|
last = path == self._STREAM_WORD |
|
|
|
webpage = self._download_webpage( |
|
|
|
page_url, video_id, 'Downloading %s webpage' % path, |
|
|
|
fatal=last) |
|
|
|
if not webpage: |
|
|
|
continue |
|
|
|
if 'File not found' in webpage or 'deleted by the owner' in webpage: |
|
|
|
if not last: |
|
|
|
continue |
|
|
|
raise ExtractorError('File not found', expected=True, video_id=video_id) |
|
|
|
break |
|
|
|
|
|
|
|
webpage = self._extract_decrypted_page(page_url, webpage, video_id) |
|
|
|
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, |
|
|
|
'title', default=None) or self._html_search_meta( |
|
|
|
'description', webpage, 'title', fatal=True) |
|
|
|
|
|
|
|
entries = self._parse_html5_media_entries(page_url, webpage, video_id) |
|
|
|
entry = entries[0] if entries else {} |
|
|
|
subtitles = entry.get('subtitles') |
|
|
|
|
|
|
|
return { |
|
|
|
'id': video_id, |
|
|
|
'title': title, |
|
|
|
'thumbnail': entry.get('thumbnail') or self._og_search_thumbnail(webpage, default=None), |
|
|
|
'url': video_url, |
|
|
|
'ext': determine_ext(title, None) or determine_ext(url, 'mp4'), |
|
|
|
'subtitles': subtitles, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class VerystreamIE(OpenloadIE): |
|
|
|
IE_NAME = 'verystream' |
|
|
|
|
|
|
|
_DOMAINS = r'(?:verystream\.com|woof\.tube)' |
|
|
|
_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): |
|
|
|
return webpage # for Verystream, the webpage is already decrypted |