@@ -45,12 +45,12 @@ for test in gettestcases(): | |||||
RESULT = ('.' + domain + '\n' in LIST or '\n' + domain + '\n' in LIST) | RESULT = ('.' + domain + '\n' in LIST or '\n' + domain + '\n' in LIST) | ||||
if RESULT and ('info_dict' not in test or 'age_limit' not in test['info_dict'] or | |||||
test['info_dict']['age_limit'] != 18): | |||||
if RESULT and ('info_dict' not in test or 'age_limit' not in test['info_dict'] | |||||
or test['info_dict']['age_limit'] != 18): | |||||
print('\nPotential missing age_limit check: {0}'.format(test['name'])) | print('\nPotential missing age_limit check: {0}'.format(test['name'])) | ||||
elif not RESULT and ('info_dict' in test and 'age_limit' in test['info_dict'] and | |||||
test['info_dict']['age_limit'] == 18): | |||||
elif not RESULT and ('info_dict' in test and 'age_limit' in test['info_dict'] | |||||
and test['info_dict']['age_limit'] == 18): | |||||
print('\nPotential false negative: {0}'.format(test['name'])) | print('\nPotential false negative: {0}'.format(test['name'])) | ||||
else: | else: | ||||
@@ -3,4 +3,4 @@ universal = True | |||||
[flake8] | [flake8] | ||||
exclude = youtube_dl/extractor/__init__.py,devscripts/buildserver.py,devscripts/lazy_load_template.py,devscripts/make_issue_template.py,setup.py,build,.git,venv | exclude = youtube_dl/extractor/__init__.py,devscripts/buildserver.py,devscripts/lazy_load_template.py,devscripts/make_issue_template.py,setup.py,build,.git,venv | ||||
ignore = E402,E501,E731,E741 | |||||
ignore = E402,E501,E731,E741,W503 |
@@ -44,16 +44,16 @@ class TestAES(unittest.TestCase): | |||||
def test_decrypt_text(self): | def test_decrypt_text(self): | ||||
password = intlist_to_bytes(self.key).decode('utf-8') | password = intlist_to_bytes(self.key).decode('utf-8') | ||||
encrypted = base64.b64encode( | encrypted = base64.b64encode( | ||||
intlist_to_bytes(self.iv[:8]) + | |||||
b'\x17\x15\x93\xab\x8d\x80V\xcdV\xe0\t\xcdo\xc2\xa5\xd8ksM\r\xe27N\xae' | |||||
intlist_to_bytes(self.iv[:8]) | |||||
+ b'\x17\x15\x93\xab\x8d\x80V\xcdV\xe0\t\xcdo\xc2\xa5\xd8ksM\r\xe27N\xae' | |||||
).decode('utf-8') | ).decode('utf-8') | ||||
decrypted = (aes_decrypt_text(encrypted, password, 16)) | decrypted = (aes_decrypt_text(encrypted, password, 16)) | ||||
self.assertEqual(decrypted, self.secret_msg) | self.assertEqual(decrypted, self.secret_msg) | ||||
password = intlist_to_bytes(self.key).decode('utf-8') | password = intlist_to_bytes(self.key).decode('utf-8') | ||||
encrypted = base64.b64encode( | encrypted = base64.b64encode( | ||||
intlist_to_bytes(self.iv[:8]) + | |||||
b'\x0b\xe6\xa4\xd9z\x0e\xb8\xb9\xd0\xd4i_\x85\x1d\x99\x98_\xe5\x80\xe7.\xbf\xa5\x83' | |||||
intlist_to_bytes(self.iv[:8]) | |||||
+ b'\x0b\xe6\xa4\xd9z\x0e\xb8\xb9\xd0\xd4i_\x85\x1d\x99\x98_\xe5\x80\xe7.\xbf\xa5\x83' | |||||
).decode('utf-8') | ).decode('utf-8') | ||||
decrypted = (aes_decrypt_text(encrypted, password, 32)) | decrypted = (aes_decrypt_text(encrypted, password, 32)) | ||||
self.assertEqual(decrypted, self.secret_msg) | self.assertEqual(decrypted, self.secret_msg) | ||||
@@ -34,8 +34,8 @@ def _make_testfunc(testfile): | |||||
def test_func(self): | def test_func(self): | ||||
as_file = os.path.join(TEST_DIR, testfile) | as_file = os.path.join(TEST_DIR, testfile) | ||||
swf_file = os.path.join(TEST_DIR, test_id + '.swf') | swf_file = os.path.join(TEST_DIR, test_id + '.swf') | ||||
if ((not os.path.exists(swf_file)) or | |||||
os.path.getmtime(swf_file) < os.path.getmtime(as_file)): | |||||
if ((not os.path.exists(swf_file)) | |||||
or os.path.getmtime(swf_file) < os.path.getmtime(as_file)): | |||||
# Recompile | # Recompile | ||||
try: | try: | ||||
subprocess.check_call([ | subprocess.check_call([ | ||||
@@ -400,9 +400,9 @@ class YoutubeDL(object): | |||||
else: | else: | ||||
raise | raise | ||||
if (sys.platform != 'win32' and | |||||
sys.getfilesystemencoding() in ['ascii', 'ANSI_X3.4-1968'] and | |||||
not params.get('restrictfilenames', False)): | |||||
if (sys.platform != 'win32' | |||||
and sys.getfilesystemencoding() in ['ascii', 'ANSI_X3.4-1968'] | |||||
and not params.get('restrictfilenames', False)): | |||||
# Unicode filesystem API will throw errors (#1474, #13027) | # Unicode filesystem API will throw errors (#1474, #13027) | ||||
self.report_warning( | self.report_warning( | ||||
'Assuming --restrict-filenames since file system encoding ' | 'Assuming --restrict-filenames since file system encoding ' | ||||
@@ -440,9 +440,9 @@ class YoutubeDL(object): | |||||
if re.match(r'^-[0-9A-Za-z_-]{10}$', a)] | if re.match(r'^-[0-9A-Za-z_-]{10}$', a)] | ||||
if idxs: | if idxs: | ||||
correct_argv = ( | correct_argv = ( | ||||
['youtube-dl'] + | |||||
[a for i, a in enumerate(argv) if i not in idxs] + | |||||
['--'] + [argv[i] for i in idxs] | |||||
['youtube-dl'] | |||||
+ [a for i, a in enumerate(argv) if i not in idxs] | |||||
+ ['--'] + [argv[i] for i in idxs] | |||||
) | ) | ||||
self.report_warning( | self.report_warning( | ||||
'Long argument string detected. ' | 'Long argument string detected. ' | ||||
@@ -850,8 +850,8 @@ class YoutubeDL(object): | |||||
if result_type in ('url', 'url_transparent'): | if result_type in ('url', 'url_transparent'): | ||||
ie_result['url'] = sanitize_url(ie_result['url']) | ie_result['url'] = sanitize_url(ie_result['url']) | ||||
extract_flat = self.params.get('extract_flat', False) | extract_flat = self.params.get('extract_flat', False) | ||||
if ((extract_flat == 'in_playlist' and 'playlist' in extra_info) or | |||||
extract_flat is True): | |||||
if ((extract_flat == 'in_playlist' and 'playlist' in extra_info) | |||||
or extract_flat is True): | |||||
if self.params.get('forcejson', False): | if self.params.get('forcejson', False): | ||||
self.to_stdout(json.dumps(ie_result)) | self.to_stdout(json.dumps(ie_result)) | ||||
return ie_result | return ie_result | ||||
@@ -1619,9 +1619,9 @@ class YoutubeDL(object): | |||||
# https://github.com/ytdl-org/youtube-dl/issues/10083). | # https://github.com/ytdl-org/youtube-dl/issues/10083). | ||||
incomplete_formats = ( | incomplete_formats = ( | ||||
# All formats are video-only or | # All formats are video-only or | ||||
all(f.get('vcodec') != 'none' and f.get('acodec') == 'none' for f in formats) or | |||||
all(f.get('vcodec') != 'none' and f.get('acodec') == 'none' for f in formats) | |||||
# all formats are audio-only | # all formats are audio-only | ||||
all(f.get('vcodec') == 'none' and f.get('acodec') != 'none' for f in formats)) | |||||
or all(f.get('vcodec') == 'none' and f.get('acodec') != 'none' for f in formats)) | |||||
ctx = { | ctx = { | ||||
'formats': formats, | 'formats': formats, | ||||
@@ -1947,8 +1947,8 @@ class YoutubeDL(object): | |||||
else: | else: | ||||
assert fixup_policy in ('ignore', 'never') | assert fixup_policy in ('ignore', 'never') | ||||
if (info_dict.get('requested_formats') is None and | |||||
info_dict.get('container') == 'm4a_dash'): | |||||
if (info_dict.get('requested_formats') is None | |||||
and info_dict.get('container') == 'm4a_dash'): | |||||
if fixup_policy == 'warn': | if fixup_policy == 'warn': | ||||
self.report_warning( | self.report_warning( | ||||
'%s: writing DASH m4a. ' | '%s: writing DASH m4a. ' | ||||
@@ -1967,9 +1967,9 @@ class YoutubeDL(object): | |||||
else: | else: | ||||
assert fixup_policy in ('ignore', 'never') | assert fixup_policy in ('ignore', 'never') | ||||
if (info_dict.get('protocol') == 'm3u8_native' or | |||||
info_dict.get('protocol') == 'm3u8' and | |||||
self.params.get('hls_prefer_native')): | |||||
if (info_dict.get('protocol') == 'm3u8_native' | |||||
or info_dict.get('protocol') == 'm3u8' | |||||
and self.params.get('hls_prefer_native')): | |||||
if fixup_policy == 'warn': | if fixup_policy == 'warn': | ||||
self.report_warning('%s: malformed AAC bitstream detected.' % ( | self.report_warning('%s: malformed AAC bitstream detected.' % ( | ||||
info_dict['id'])) | info_dict['id'])) | ||||
@@ -1995,10 +1995,10 @@ class YoutubeDL(object): | |||||
def download(self, url_list): | def download(self, url_list): | ||||
"""Download a given list of URLs.""" | """Download a given list of URLs.""" | ||||
outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL) | outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL) | ||||
if (len(url_list) > 1 and | |||||
outtmpl != '-' and | |||||
'%' not in outtmpl and | |||||
self.params.get('max_downloads') != 1): | |||||
if (len(url_list) > 1 | |||||
and outtmpl != '-' | |||||
and '%' not in outtmpl | |||||
and self.params.get('max_downloads') != 1): | |||||
raise SameFileError(outtmpl) | raise SameFileError(outtmpl) | ||||
for url in url_list: | for url in url_list: | ||||
@@ -2143,8 +2143,8 @@ class YoutubeDL(object): | |||||
if res: | if res: | ||||
res += ', ' | res += ', ' | ||||
res += '%s container' % fdict['container'] | res += '%s container' % fdict['container'] | ||||
if (fdict.get('vcodec') is not None and | |||||
fdict.get('vcodec') != 'none'): | |||||
if (fdict.get('vcodec') is not None | |||||
and fdict.get('vcodec') != 'none'): | |||||
if res: | if res: | ||||
res += ', ' | res += ', ' | ||||
res += fdict['vcodec'] | res += fdict['vcodec'] | ||||
@@ -230,14 +230,14 @@ def _real_main(argv=None): | |||||
if opts.allsubtitles and not opts.writeautomaticsub: | if opts.allsubtitles and not opts.writeautomaticsub: | ||||
opts.writesubtitles = True | opts.writesubtitles = True | ||||
outtmpl = ((opts.outtmpl is not None and opts.outtmpl) or | |||||
(opts.format == '-1' and opts.usetitle and '%(title)s-%(id)s-%(format)s.%(ext)s') or | |||||
(opts.format == '-1' and '%(id)s-%(format)s.%(ext)s') or | |||||
(opts.usetitle and opts.autonumber and '%(autonumber)s-%(title)s-%(id)s.%(ext)s') or | |||||
(opts.usetitle and '%(title)s-%(id)s.%(ext)s') or | |||||
(opts.useid and '%(id)s.%(ext)s') or | |||||
(opts.autonumber and '%(autonumber)s-%(id)s.%(ext)s') or | |||||
DEFAULT_OUTTMPL) | |||||
outtmpl = ((opts.outtmpl is not None and opts.outtmpl) | |||||
or (opts.format == '-1' and opts.usetitle and '%(title)s-%(id)s-%(format)s.%(ext)s') | |||||
or (opts.format == '-1' and '%(id)s-%(format)s.%(ext)s') | |||||
or (opts.usetitle and opts.autonumber and '%(autonumber)s-%(title)s-%(id)s.%(ext)s') | |||||
or (opts.usetitle and '%(title)s-%(id)s.%(ext)s') | |||||
or (opts.useid and '%(id)s.%(ext)s') | |||||
or (opts.autonumber and '%(autonumber)s-%(id)s.%(ext)s') | |||||
or DEFAULT_OUTTMPL) | |||||
if not os.path.splitext(outtmpl)[1] and opts.extractaudio: | if not os.path.splitext(outtmpl)[1] and opts.extractaudio: | ||||
parser.error('Cannot download a video and extract audio into the same' | parser.error('Cannot download a video and extract audio into the same' | ||||
' file! Use "{0}.%(ext)s" instead of "{0}" as the output' | ' file! Use "{0}.%(ext)s" instead of "{0}" as the output' | ||||
@@ -2649,9 +2649,9 @@ else: | |||||
try: | try: | ||||
args = shlex.split('中文') | args = shlex.split('中文') | ||||
assert (isinstance(args, list) and | |||||
isinstance(args[0], compat_str) and | |||||
args[0] == '中文') | |||||
assert (isinstance(args, list) | |||||
and isinstance(args[0], compat_str) | |||||
and args[0] == '中文') | |||||
compat_shlex_split = shlex.split | compat_shlex_split = shlex.split | ||||
except (AssertionError, UnicodeEncodeError): | except (AssertionError, UnicodeEncodeError): | ||||
# Working around shlex issue with unicode strings on some python 2 | # Working around shlex issue with unicode strings on some python 2 | ||||
@@ -330,15 +330,15 @@ class FileDownloader(object): | |||||
""" | """ | ||||
nooverwrites_and_exists = ( | nooverwrites_and_exists = ( | ||||
self.params.get('nooverwrites', False) and | |||||
os.path.exists(encodeFilename(filename)) | |||||
self.params.get('nooverwrites', False) | |||||
and os.path.exists(encodeFilename(filename)) | |||||
) | ) | ||||
if not hasattr(filename, 'write'): | if not hasattr(filename, 'write'): | ||||
continuedl_and_exists = ( | continuedl_and_exists = ( | ||||
self.params.get('continuedl', True) and | |||||
os.path.isfile(encodeFilename(filename)) and | |||||
not self.params.get('nopart', False) | |||||
self.params.get('continuedl', True) | |||||
and os.path.isfile(encodeFilename(filename)) | |||||
and not self.params.get('nopart', False) | |||||
) | ) | ||||
# Check file already present | # Check file already present | ||||
@@ -238,8 +238,8 @@ def write_metadata_tag(stream, metadata): | |||||
def remove_encrypted_media(media): | def remove_encrypted_media(media): | ||||
return list(filter(lambda e: 'drmAdditionalHeaderId' not in e.attrib and | |||||
'drmAdditionalHeaderSetId' not in e.attrib, | |||||
return list(filter(lambda e: 'drmAdditionalHeaderId' not in e.attrib | |||||
and 'drmAdditionalHeaderSetId' not in e.attrib, | |||||
media)) | media)) | ||||
@@ -267,8 +267,8 @@ class F4mFD(FragmentFD): | |||||
media = doc.findall(_add_ns('media')) | media = doc.findall(_add_ns('media')) | ||||
if not media: | if not media: | ||||
self.report_error('No media found') | self.report_error('No media found') | ||||
for e in (doc.findall(_add_ns('drmAdditionalHeader')) + | |||||
doc.findall(_add_ns('drmAdditionalHeaderSet'))): | |||||
for e in (doc.findall(_add_ns('drmAdditionalHeader')) | |||||
+ doc.findall(_add_ns('drmAdditionalHeaderSet'))): | |||||
# If id attribute is missing it's valid for all media nodes | # If id attribute is missing it's valid for all media nodes | ||||
# without drmAdditionalHeaderId or drmAdditionalHeaderSetId attribute | # without drmAdditionalHeaderId or drmAdditionalHeaderSetId attribute | ||||
if 'id' not in e.attrib: | if 'id' not in e.attrib: | ||||
@@ -219,8 +219,8 @@ class FragmentFD(FileDownloader): | |||||
frag_total_bytes = s.get('total_bytes') or 0 | frag_total_bytes = s.get('total_bytes') or 0 | ||||
if not ctx['live']: | if not ctx['live']: | ||||
estimated_size = ( | estimated_size = ( | ||||
(ctx['complete_frags_downloaded_bytes'] + frag_total_bytes) / | |||||
(state['fragment_index'] + 1) * total_frags) | |||||
(ctx['complete_frags_downloaded_bytes'] + frag_total_bytes) | |||||
/ (state['fragment_index'] + 1) * total_frags) | |||||
state['total_bytes_estimate'] = estimated_size | state['total_bytes_estimate'] = estimated_size | ||||
if s['status'] == 'finished': | if s['status'] == 'finished': | ||||
@@ -76,12 +76,12 @@ class HlsFD(FragmentFD): | |||||
return fd.real_download(filename, info_dict) | return fd.real_download(filename, info_dict) | ||||
def is_ad_fragment_start(s): | def is_ad_fragment_start(s): | ||||
return (s.startswith('#ANVATO-SEGMENT-INFO') and 'type=ad' in s or | |||||
s.startswith('#UPLYNK-SEGMENT') and s.endswith(',ad')) | |||||
return (s.startswith('#ANVATO-SEGMENT-INFO') and 'type=ad' in s | |||||
or s.startswith('#UPLYNK-SEGMENT') and s.endswith(',ad')) | |||||
def is_ad_fragment_end(s): | def is_ad_fragment_end(s): | ||||
return (s.startswith('#ANVATO-SEGMENT-INFO') and 'type=master' in s or | |||||
s.startswith('#UPLYNK-SEGMENT') and s.endswith(',segment')) | |||||
return (s.startswith('#ANVATO-SEGMENT-INFO') and 'type=master' in s | |||||
or s.startswith('#UPLYNK-SEGMENT') and s.endswith(',segment')) | |||||
media_frags = 0 | media_frags = 0 | ||||
ad_frags = 0 | ad_frags = 0 | ||||
@@ -46,8 +46,8 @@ class HttpFD(FileDownloader): | |||||
is_test = self.params.get('test', False) | is_test = self.params.get('test', False) | ||||
chunk_size = self._TEST_FILE_SIZE if is_test else ( | chunk_size = self._TEST_FILE_SIZE if is_test else ( | ||||
info_dict.get('downloader_options', {}).get('http_chunk_size') or | |||||
self.params.get('http_chunk_size') or 0) | |||||
info_dict.get('downloader_options', {}).get('http_chunk_size') | |||||
or self.params.get('http_chunk_size') or 0) | |||||
ctx.open_mode = 'wb' | ctx.open_mode = 'wb' | ||||
ctx.resume_len = 0 | ctx.resume_len = 0 | ||||
@@ -123,11 +123,11 @@ class HttpFD(FileDownloader): | |||||
content_len = int_or_none(content_range_m.group(3)) | content_len = int_or_none(content_range_m.group(3)) | ||||
accept_content_len = ( | accept_content_len = ( | ||||
# Non-chunked download | # Non-chunked download | ||||
not ctx.chunk_size or | |||||
not ctx.chunk_size | |||||
# Chunked download and requested piece or | # Chunked download and requested piece or | ||||
# its part is promised to be served | # its part is promised to be served | ||||
content_range_end == range_end or | |||||
content_len < range_end) | |||||
or content_range_end == range_end | |||||
or content_len < range_end) | |||||
if accept_content_len: | if accept_content_len: | ||||
ctx.data_len = content_len | ctx.data_len = content_len | ||||
return | return | ||||
@@ -152,8 +152,8 @@ class HttpFD(FileDownloader): | |||||
raise | raise | ||||
else: | else: | ||||
# Examine the reported length | # Examine the reported length | ||||
if (content_length is not None and | |||||
(ctx.resume_len - 100 < int(content_length) < ctx.resume_len + 100)): | |||||
if (content_length is not None | |||||
and (ctx.resume_len - 100 < int(content_length) < ctx.resume_len + 100)): | |||||
# The file had already been fully downloaded. | # The file had already been fully downloaded. | ||||
# Explanation to the above condition: in issue #175 it was revealed that | # Explanation to the above condition: in issue #175 it was revealed that | ||||
# YouTube sometimes adds or removes a few bytes from the end of the file, | # YouTube sometimes adds or removes a few bytes from the end of the file, | ||||
@@ -59,9 +59,9 @@ class AddAnimeIE(InfoExtractor): | |||||
parsed_url = compat_urllib_parse_urlparse(url) | parsed_url = compat_urllib_parse_urlparse(url) | ||||
av_val = av_res + len(parsed_url.netloc) | av_val = av_res + len(parsed_url.netloc) | ||||
confirm_url = ( | confirm_url = ( | ||||
parsed_url.scheme + '://' + parsed_url.netloc + | |||||
action + '?' + | |||||
compat_urllib_parse_urlencode({ | |||||
parsed_url.scheme + '://' + parsed_url.netloc | |||||
+ action + '?' | |||||
+ compat_urllib_parse_urlencode({ | |||||
'jschl_vc': vc, 'jschl_answer': compat_str(av_val)})) | 'jschl_vc': vc, 'jschl_answer': compat_str(av_val)})) | ||||
self._download_webpage( | self._download_webpage( | ||||
confirm_url, video_id, | confirm_url, video_id, | ||||
@@ -32,8 +32,8 @@ class BlinkxIE(InfoExtractor): | |||||
video_id = self._match_id(url) | video_id = self._match_id(url) | ||||
display_id = video_id[:8] | display_id = video_id[:8] | ||||
api_url = ('https://apib4.blinkx.com/api.php?action=play_video&' + | |||||
'video=%s' % video_id) | |||||
api_url = ('https://apib4.blinkx.com/api.php?action=play_video&' | |||||
+ 'video=%s' % video_id) | |||||
data_json = self._download_webpage(api_url, display_id) | data_json = self._download_webpage(api_url, display_id) | ||||
data = json.loads(data_json)['api']['results'][0] | data = json.loads(data_json)['api']['results'][0] | ||||
duration = None | duration = None | ||||
@@ -542,11 +542,11 @@ class InfoExtractor(object): | |||||
raise ExtractorError('An extractor error has occurred.', cause=e) | raise ExtractorError('An extractor error has occurred.', cause=e) | ||||
def __maybe_fake_ip_and_retry(self, countries): | def __maybe_fake_ip_and_retry(self, countries): | ||||
if (not self._downloader.params.get('geo_bypass_country', None) and | |||||
self._GEO_BYPASS and | |||||
self._downloader.params.get('geo_bypass', True) and | |||||
not self._x_forwarded_for_ip and | |||||
countries): | |||||
if (not self._downloader.params.get('geo_bypass_country', None) | |||||
and self._GEO_BYPASS | |||||
and self._downloader.params.get('geo_bypass', True) | |||||
and not self._x_forwarded_for_ip | |||||
and countries): | |||||
country_code = random.choice(countries) | country_code = random.choice(countries) | ||||
self._x_forwarded_for_ip = GeoUtils.random_ipv4(country_code) | self._x_forwarded_for_ip = GeoUtils.random_ipv4(country_code) | ||||
if self._x_forwarded_for_ip: | if self._x_forwarded_for_ip: | ||||
@@ -682,8 +682,8 @@ class InfoExtractor(object): | |||||
def __check_blocked(self, content): | def __check_blocked(self, content): | ||||
first_block = content[:512] | first_block = content[:512] | ||||
if ('<title>Access to this site is blocked</title>' in content and | |||||
'Websense' in first_block): | |||||
if ('<title>Access to this site is blocked</title>' in content | |||||
and 'Websense' in first_block): | |||||
msg = 'Access to this webpage has been blocked by Websense filtering software in your network.' | msg = 'Access to this webpage has been blocked by Websense filtering software in your network.' | ||||
blocked_iframe = self._html_search_regex( | blocked_iframe = self._html_search_regex( | ||||
r'<iframe src="([^"]+)"', content, | r'<iframe src="([^"]+)"', content, | ||||
@@ -701,8 +701,8 @@ class InfoExtractor(object): | |||||
if block_msg: | if block_msg: | ||||
msg += ' (Message: "%s")' % block_msg.replace('\n', ' ') | msg += ' (Message: "%s")' % block_msg.replace('\n', ' ') | ||||
raise ExtractorError(msg, expected=True) | raise ExtractorError(msg, expected=True) | ||||
if ('<title>TTK :: Доступ к ресурсу ограничен</title>' in content and | |||||
'blocklist.rkn.gov.ru' in content): | |||||
if ('<title>TTK :: Доступ к ресурсу ограничен</title>' in content | |||||
and 'blocklist.rkn.gov.ru' in content): | |||||
raise ExtractorError( | raise ExtractorError( | ||||
'Access to this webpage has been blocked by decision of the Russian government. ' | 'Access to this webpage has been blocked by decision of the Russian government. ' | ||||
'Visit http://blocklist.rkn.gov.ru/ for a block reason.', | 'Visit http://blocklist.rkn.gov.ru/ for a block reason.', | ||||
@@ -1709,8 +1709,8 @@ class InfoExtractor(object): | |||||
continue | continue | ||||
else: | else: | ||||
tbr = float_or_none( | tbr = float_or_none( | ||||
last_stream_inf.get('AVERAGE-BANDWIDTH') or | |||||
last_stream_inf.get('BANDWIDTH'), scale=1000) | |||||
last_stream_inf.get('AVERAGE-BANDWIDTH') | |||||
or last_stream_inf.get('BANDWIDTH'), scale=1000) | |||||
format_id = [] | format_id = [] | ||||
if m3u8_id: | if m3u8_id: | ||||
format_id.append(m3u8_id) | format_id.append(m3u8_id) | ||||
@@ -2504,8 +2504,8 @@ class InfoExtractor(object): | |||||
if str_or_none(s_attr.get(lbl)) | if str_or_none(s_attr.get(lbl)) | ||||
] | ] | ||||
width = int_or_none(s_attr.get('width')) | width = int_or_none(s_attr.get('width')) | ||||
height = (int_or_none(s_attr.get('height')) or | |||||
int_or_none(s_attr.get('res'))) | |||||
height = (int_or_none(s_attr.get('height')) | |||||
or int_or_none(s_attr.get('res'))) | |||||
if not width or not height: | if not width or not height: | ||||
for lbl in labels: | for lbl in labels: | ||||
resolution = parse_resolution(lbl) | resolution = parse_resolution(lbl) | ||||
@@ -2847,8 +2847,8 @@ class InfoExtractor(object): | |||||
return not any_restricted | return not any_restricted | ||||
def extract_subtitles(self, *args, **kwargs): | def extract_subtitles(self, *args, **kwargs): | ||||
if (self._downloader.params.get('writesubtitles', False) or | |||||
self._downloader.params.get('listsubtitles')): | |||||
if (self._downloader.params.get('writesubtitles', False) | |||||
or self._downloader.params.get('listsubtitles')): | |||||
return self._get_subtitles(*args, **kwargs) | return self._get_subtitles(*args, **kwargs) | ||||
return {} | return {} | ||||
@@ -2873,8 +2873,8 @@ class InfoExtractor(object): | |||||
return ret | return ret | ||||
def extract_automatic_captions(self, *args, **kwargs): | def extract_automatic_captions(self, *args, **kwargs): | ||||
if (self._downloader.params.get('writeautomaticsub', False) or | |||||
self._downloader.params.get('listsubtitles')): | |||||
if (self._downloader.params.get('writeautomaticsub', False) | |||||
or self._downloader.params.get('listsubtitles')): | |||||
return self._get_automatic_captions(*args, **kwargs) | return self._get_automatic_captions(*args, **kwargs) | ||||
return {} | return {} | ||||
@@ -2882,9 +2882,9 @@ class InfoExtractor(object): | |||||
raise NotImplementedError('This method must be implemented by subclasses') | raise NotImplementedError('This method must be implemented by subclasses') | ||||
def mark_watched(self, *args, **kwargs): | def mark_watched(self, *args, **kwargs): | ||||
if (self._downloader.params.get('mark_watched', False) and | |||||
(self._get_login_info()[0] is not None or | |||||
self._downloader.params.get('cookiefile') is not None)): | |||||
if (self._downloader.params.get('mark_watched', False) | |||||
and (self._get_login_info()[0] is not None | |||||
or self._downloader.params.get('cookiefile') is not None)): | |||||
self._mark_watched(*args, **kwargs) | self._mark_watched(*args, **kwargs) | ||||
def _mark_watched(self, *args, **kwargs): | def _mark_watched(self, *args, **kwargs): | ||||
@@ -45,8 +45,8 @@ class DailyMailIE(InfoExtractor): | |||||
sources_url = (try_get( | sources_url = (try_get( | ||||
video_data, | video_data, | ||||
(lambda x: x['plugins']['sources']['url'], | (lambda x: x['plugins']['sources']['url'], | ||||
lambda x: x['sources']['url']), compat_str) or | |||||
'http://www.dailymail.co.uk/api/player/%s/video-sources.json' % video_id) | |||||
lambda x: x['sources']['url']), compat_str) | |||||
or 'http://www.dailymail.co.uk/api/player/%s/video-sources.json' % video_id) | |||||
video_sources = self._download_json(sources_url, video_id) | video_sources = self._download_json(sources_url, video_id) | ||||
body = video_sources.get('body') | body = video_sources.get('body') | ||||
@@ -70,8 +70,8 @@ class DctpTvIE(InfoExtractor): | |||||
endpoint = next( | endpoint = next( | ||||
server['endpoint'] | server['endpoint'] | ||||
for server in servers | for server in servers | ||||
if url_or_none(server.get('endpoint')) and | |||||
'cloudfront' in server['endpoint']) | |||||
if url_or_none(server.get('endpoint')) | |||||
and 'cloudfront' in server['endpoint']) | |||||
else: | else: | ||||
endpoint = 'rtmpe://s2pqqn4u96e4j8.cloudfront.net/cfx/st/' | endpoint = 'rtmpe://s2pqqn4u96e4j8.cloudfront.net/cfx/st/' | ||||
@@ -82,8 +82,8 @@ class ExpressenIE(InfoExtractor): | |||||
title = info.get('titleRaw') or data['title'] | title = info.get('titleRaw') or data['title'] | ||||
description = info.get('descriptionRaw') | description = info.get('descriptionRaw') | ||||
thumbnail = info.get('socialMediaImage') or data.get('image') | thumbnail = info.get('socialMediaImage') or data.get('image') | ||||
duration = int_or_none(info.get('videoTotalSecondsDuration') or | |||||
data.get('totalSecondsDuration')) | |||||
duration = int_or_none(info.get('videoTotalSecondsDuration') | |||||
or data.get('totalSecondsDuration')) | |||||
timestamp = unified_timestamp(info.get('publishDate')) | timestamp = unified_timestamp(info.get('publishDate')) | ||||
return { | return { | ||||
@@ -94,8 +94,8 @@ class FrontendMastersPageBaseIE(FrontendMastersBaseIE): | |||||
chapter_number = None | chapter_number = None | ||||
index = lesson.get('index') | index = lesson.get('index') | ||||
element_index = lesson.get('elementIndex') | element_index = lesson.get('elementIndex') | ||||
if (isinstance(index, int) and isinstance(element_index, int) and | |||||
index < element_index): | |||||
if (isinstance(index, int) and isinstance(element_index, int) | |||||
and index < element_index): | |||||
chapter_number = element_index - index | chapter_number = element_index - index | ||||
chapter = (chapters[chapter_number - 1] | chapter = (chapters[chapter_number - 1] | ||||
if chapter_number - 1 < len(chapters) else None) | if chapter_number - 1 < len(chapters) else None) | ||||
@@ -2549,11 +2549,11 @@ class GenericIE(InfoExtractor): | |||||
return self.url_result(mobj.group('url')) | return self.url_result(mobj.group('url')) | ||||
# Look for Ooyala videos | # Look for Ooyala videos | ||||
mobj = (re.search(r'player\.ooyala\.com/[^"?]+[?#][^"]*?(?:embedCode|ec)=(?P<ec>[^"&]+)', webpage) or | |||||
re.search(r'OO\.Player\.create\([\'"].*?[\'"],\s*[\'"](?P<ec>.{32})[\'"]', webpage) or | |||||
re.search(r'OO\.Player\.create\.apply\(\s*OO\.Player\s*,\s*op\(\s*\[\s*[\'"][^\'"]*[\'"]\s*,\s*[\'"](?P<ec>.{32})[\'"]', webpage) or | |||||
re.search(r'SBN\.VideoLinkset\.ooyala\([\'"](?P<ec>.{32})[\'"]\)', webpage) or | |||||
re.search(r'data-ooyala-video-id\s*=\s*[\'"](?P<ec>.{32})[\'"]', webpage)) | |||||
mobj = (re.search(r'player\.ooyala\.com/[^"?]+[?#][^"]*?(?:embedCode|ec)=(?P<ec>[^"&]+)', webpage) | |||||
or re.search(r'OO\.Player\.create\([\'"].*?[\'"],\s*[\'"](?P<ec>.{32})[\'"]', webpage) | |||||
or re.search(r'OO\.Player\.create\.apply\(\s*OO\.Player\s*,\s*op\(\s*\[\s*[\'"][^\'"]*[\'"]\s*,\s*[\'"](?P<ec>.{32})[\'"]', webpage) | |||||
or re.search(r'SBN\.VideoLinkset\.ooyala\([\'"](?P<ec>.{32})[\'"]\)', webpage) | |||||
or re.search(r'data-ooyala-video-id\s*=\s*[\'"](?P<ec>.{32})[\'"]', webpage)) | |||||
if mobj is not None: | if mobj is not None: | ||||
embed_token = self._search_regex( | embed_token = self._search_regex( | ||||
r'embedToken[\'"]?\s*:\s*[\'"]([^\'"]+)', | r'embedToken[\'"]?\s*:\s*[\'"]([^\'"]+)', | ||||
@@ -3221,8 +3221,8 @@ class GenericIE(InfoExtractor): | |||||
else: | else: | ||||
formats.append({ | formats.append({ | ||||
'url': src, | 'url': src, | ||||
'ext': (mimetype2ext(src_type) or | |||||
ext if ext in KNOWN_EXTENSIONS else 'mp4'), | |||||
'ext': (mimetype2ext(src_type) | |||||
or ext if ext in KNOWN_EXTENSIONS else 'mp4'), | |||||
}) | }) | ||||
if formats: | if formats: | ||||
self._sort_formats(formats) | self._sort_formats(formats) | ||||
@@ -155,8 +155,8 @@ class HeiseIE(InfoExtractor): | |||||
'id': video_id, | 'id': video_id, | ||||
'title': title, | 'title': title, | ||||
'description': description, | 'description': description, | ||||
'thumbnail': (xpath_text(doc, './/{http://rss.jwpcdn.com/}image') or | |||||
self._og_search_thumbnail(webpage)), | |||||
'thumbnail': (xpath_text(doc, './/{http://rss.jwpcdn.com/}image') | |||||
or self._og_search_thumbnail(webpage)), | |||||
'timestamp': parse_iso8601( | 'timestamp': parse_iso8601( | ||||
self._html_search_meta('date', webpage)), | self._html_search_meta('date', webpage)), | ||||
'formats': formats, | 'formats': formats, | ||||
@@ -58,8 +58,8 @@ class HitboxIE(InfoExtractor): | |||||
title = video_meta.get('media_status') | title = video_meta.get('media_status') | ||||
alt_title = video_meta.get('media_title') | alt_title = video_meta.get('media_title') | ||||
description = clean_html( | description = clean_html( | ||||
video_meta.get('media_description') or | |||||
video_meta.get('media_description_md')) | |||||
video_meta.get('media_description') | |||||
or video_meta.get('media_description_md')) | |||||
duration = float_or_none(video_meta.get('media_duration')) | duration = float_or_none(video_meta.get('media_duration')) | ||||
uploader = video_meta.get('media_user_name') | uploader = video_meta.get('media_user_name') | ||||
views = int_or_none(video_meta.get('media_views')) | views = int_or_none(video_meta.get('media_views')) | ||||
@@ -47,8 +47,8 @@ class HitRecordIE(InfoExtractor): | |||||
tags = [ | tags = [ | ||||
t['text'] | t['text'] | ||||
for t in tags_list | for t in tags_list | ||||
if isinstance(t, dict) and t.get('text') and | |||||
isinstance(t['text'], compat_str)] | |||||
if isinstance(t, dict) and t.get('text') | |||||
and isinstance(t['text'], compat_str)] | |||||
return { | return { | ||||
'id': video_id, | 'id': video_id, | ||||
@@ -77,13 +77,13 @@ class HKETVIE(InfoExtractor): | |||||
title = ( | title = ( | ||||
self._html_search_meta( | self._html_search_meta( | ||||
('ed_title', 'search.ed_title'), webpage, default=None) or | |||||
self._search_regex( | |||||
('ed_title', 'search.ed_title'), webpage, default=None) | |||||
or self._search_regex( | |||||
r'data-favorite_title_(?:eng|chi)=(["\'])(?P<id>(?:(?!\1).)+)\1', | r'data-favorite_title_(?:eng|chi)=(["\'])(?P<id>(?:(?!\1).)+)\1', | ||||
webpage, 'title', default=None, group='url') or | |||||
self._html_search_regex( | |||||
r'<h1>([^<]+)</h1>', webpage, 'title', default=None) or | |||||
self._og_search_title(webpage) | |||||
webpage, 'title', default=None, group='url') | |||||
or self._html_search_regex( | |||||
r'<h1>([^<]+)</h1>', webpage, 'title', default=None) | |||||
or self._og_search_title(webpage) | |||||
) | ) | ||||
file_id = self._search_regex( | file_id = self._search_regex( | ||||
@@ -60,8 +60,8 @@ class HRTiBaseIE(InfoExtractor): | |||||
language=self._APP_LANGUAGE, | language=self._APP_LANGUAGE, | ||||
application_id=self._APP_PUBLICATION_ID) | application_id=self._APP_PUBLICATION_ID) | ||||
self._login_url = (modules['user']['resources']['login']['uri'] + | |||||
'/format/json').format(session_id=self._session_id) | |||||
self._login_url = (modules['user']['resources']['login']['uri'] | |||||
+ '/format/json').format(session_id=self._session_id) | |||||
self._logout_url = modules['user']['resources']['logout']['uri'] | self._logout_url = modules['user']['resources']['logout']['uri'] | ||||
@@ -122,9 +122,9 @@ class InfoQIE(BokeCCBaseIE): | |||||
formats = self._extract_bokecc_formats(webpage, video_id) | formats = self._extract_bokecc_formats(webpage, video_id) | ||||
else: | else: | ||||
formats = ( | formats = ( | ||||
self._extract_rtmp_video(webpage) + | |||||
self._extract_http_video(webpage) + | |||||
self._extract_http_audio(webpage, video_id)) | |||||
self._extract_rtmp_video(webpage) | |||||
+ self._extract_http_video(webpage) | |||||
+ self._extract_http_audio(webpage, video_id)) | |||||
self._sort_formats(formats) | self._sort_formats(formats) | ||||
@@ -383,9 +383,9 @@ class IqiyiIE(InfoExtractor): | |||||
self._sleep(5, video_id) | self._sleep(5, video_id) | ||||
self._sort_formats(formats) | self._sort_formats(formats) | ||||
title = (get_element_by_id('widget-videotitle', webpage) or | |||||
clean_html(get_element_by_attribute('class', 'mod-play-tit', webpage)) or | |||||
self._html_search_regex(r'<span[^>]+data-videochanged-title="word"[^>]*>([^<]+)</span>', webpage, 'title')) | |||||
title = (get_element_by_id('widget-videotitle', webpage) | |||||
or clean_html(get_element_by_attribute('class', 'mod-play-tit', webpage)) | |||||
or self._html_search_regex(r'<span[^>]+data-videochanged-title="word"[^>]*>([^<]+)</span>', webpage, 'title')) | |||||
return { | return { | ||||
'id': video_id, | 'id': video_id, | ||||
@@ -77,10 +77,10 @@ class ITVIE(InfoExtractor): | |||||
return etree.SubElement(element, _add_ns(name)) | return etree.SubElement(element, _add_ns(name)) | ||||
production_id = ( | production_id = ( | ||||
params.get('data-video-autoplay-id') or | |||||
'%s#001' % ( | |||||
params.get('data-video-episode-id') or | |||||
video_id.replace('a', '/'))) | |||||
params.get('data-video-autoplay-id') | |||||
or '%s#001' % ( | |||||
params.get('data-video-episode-id') | |||||
or video_id.replace('a', '/'))) | |||||
req_env = etree.Element(_add_ns('soapenv:Envelope')) | req_env = etree.Element(_add_ns('soapenv:Envelope')) | ||||
_add_sub_element(req_env, 'soapenv:Header') | _add_sub_element(req_env, 'soapenv:Header') | ||||
@@ -118,8 +118,8 @@ class KalturaIE(InfoExtractor): | |||||
(?P<q2>['"])_?(?P<partner_id>(?:(?!(?P=q2)).)+)(?P=q2),.*? | (?P<q2>['"])_?(?P<partner_id>(?:(?!(?P=q2)).)+)(?P=q2),.*? | ||||
(?P<q3>['"])entry_?[Ii]d(?P=q3)\s*:\s* | (?P<q3>['"])entry_?[Ii]d(?P=q3)\s*:\s* | ||||
(?P<q4>['"])(?P<id>(?:(?!(?P=q4)).)+)(?P=q4)(?:,|\s*\}) | (?P<q4>['"])(?P<id>(?:(?!(?P=q4)).)+)(?P=q4)(?:,|\s*\}) | ||||
""", webpage) or | |||||
re.search( | |||||
""", webpage) | |||||
or re.search( | |||||
r'''(?xs) | r'''(?xs) | ||||
(?P<q1>["']) | (?P<q1>["']) | ||||
(?:https?:)?//cdnapi(?:sec)?\.kaltura\.com(?::\d+)?/(?:(?!(?P=q1)).)*\b(?:p|partner_id)/(?P<partner_id>\d+)(?:(?!(?P=q1)).)* | (?:https?:)?//cdnapi(?:sec)?\.kaltura\.com(?::\d+)?/(?:(?!(?P=q1)).)*\b(?:p|partner_id)/(?P<partner_id>\d+)(?:(?!(?P=q1)).)* | ||||
@@ -132,8 +132,8 @@ class KalturaIE(InfoExtractor): | |||||
\[\s*(?P<q2_1>["'])entry_?[Ii]d(?P=q2_1)\s*\]\s*=\s* | \[\s*(?P<q2_1>["'])entry_?[Ii]d(?P=q2_1)\s*\]\s*=\s* | ||||
) | ) | ||||
(?P<q3>["'])(?P<id>(?:(?!(?P=q3)).)+)(?P=q3) | (?P<q3>["'])(?P<id>(?:(?!(?P=q3)).)+)(?P=q3) | ||||
''', webpage) or | |||||
re.search( | |||||
''', webpage) | |||||
or re.search( | |||||
r'''(?xs) | r'''(?xs) | ||||
<(?:iframe[^>]+src|meta[^>]+\bcontent)=(?P<q1>["']) | <(?:iframe[^>]+src|meta[^>]+\bcontent)=(?P<q1>["']) | ||||
(?:https?:)?//(?:(?:www|cdnapi(?:sec)?)\.)?kaltura\.com/(?:(?!(?P=q1)).)*\b(?:p|partner_id)/(?P<partner_id>\d+) | (?:https?:)?//(?:(?:www|cdnapi(?:sec)?)\.)?kaltura\.com/(?:(?!(?P=q1)).)*\b(?:p|partner_id)/(?P<partner_id>\d+) | ||||
@@ -47,8 +47,8 @@ class KarriereVideosIE(InfoExtractor): | |||||
webpage = self._download_webpage(url, video_id) | webpage = self._download_webpage(url, video_id) | ||||
title = (self._html_search_meta('title', webpage, default=None) or | |||||
self._search_regex(r'<h1 class="title">([^<]+)</h1>', webpage, 'video title')) | |||||
title = (self._html_search_meta('title', webpage, default=None) | |||||
or self._search_regex(r'<h1 class="title">([^<]+)</h1>', webpage, 'video title')) | |||||
video_id = self._search_regex( | video_id = self._search_regex( | ||||
r'/config/video/(.+?)\.xml', webpage, 'video id') | r'/config/video/(.+?)\.xml', webpage, 'video id') | ||||
@@ -80,8 +80,8 @@ class MotherlessIE(InfoExtractor): | |||||
video_url = (self._html_search_regex( | video_url = (self._html_search_regex( | ||||
(r'setup\(\{\s*["\']file["\']\s*:\s*(["\'])(?P<url>(?:(?!\1).)+)\1', | (r'setup\(\{\s*["\']file["\']\s*:\s*(["\'])(?P<url>(?:(?!\1).)+)\1', | ||||
r'fileurl\s*=\s*(["\'])(?P<url>(?:(?!\1).)+)\1'), | r'fileurl\s*=\s*(["\'])(?P<url>(?:(?!\1).)+)\1'), | ||||
webpage, 'video URL', default=None, group='url') or | |||||
'http://cdn4.videos.motherlessmedia.com/videos/%s.mp4?fs=opencloud' % video_id) | |||||
webpage, 'video URL', default=None, group='url') | |||||
or 'http://cdn4.videos.motherlessmedia.com/videos/%s.mp4?fs=opencloud' % video_id) | |||||
age_limit = self._rta_search(webpage) | age_limit = self._rta_search(webpage) | ||||
view_count = str_to_int(self._html_search_regex( | view_count = str_to_int(self._html_search_regex( | ||||
r'<strong>Views</strong>\s+([^<]+)<', | r'<strong>Views</strong>\s+([^<]+)<', | ||||
@@ -84,8 +84,8 @@ class NDTVIE(InfoExtractor): | |||||
# '__title' does not contain extra words such as sub-site name, "Video" etc. | # '__title' does not contain extra words such as sub-site name, "Video" etc. | ||||
title = compat_urllib_parse_unquote_plus( | title = compat_urllib_parse_unquote_plus( | ||||
self._search_regex(r"__title\s*=\s*'([^']+)'", webpage, 'title', default=None) or | |||||
self._og_search_title(webpage)) | |||||
self._search_regex(r"__title\s*=\s*'([^']+)'", webpage, 'title', default=None) | |||||
or self._og_search_title(webpage)) | |||||
filename = self._search_regex( | filename = self._search_regex( | ||||
r"(?:__)?filename\s*[:=]\s*'([^']+)'", webpage, 'video filename') | r"(?:__)?filename\s*[:=]\s*'([^']+)'", webpage, 'video filename') | ||||
@@ -180,8 +180,8 @@ class AppleDailyIE(NextMediaIE): | |||||
_URL_PATTERN = r'\{url: \'(.+)\'\}' | _URL_PATTERN = r'\{url: \'(.+)\'\}' | ||||
def _fetch_title(self, page): | def _fetch_title(self, page): | ||||
return (self._html_search_regex(r'<h1 id="h1">([^<>]+)</h1>', page, 'news title', default=None) or | |||||
self._html_search_meta('description', page, 'news title')) | |||||
return (self._html_search_regex(r'<h1 id="h1">([^<>]+)</h1>', page, 'news title', default=None) | |||||
or self._html_search_meta('description', page, 'news title')) | |||||
def _fetch_thumbnail(self, page): | def _fetch_thumbnail(self, page): | ||||
return self._html_search_regex(r"setInitialImage\(\'([^']+)'\)", page, 'video thumbnail', fatal=False) | return self._html_search_regex(r"setInitialImage\(\'([^']+)'\)", page, 'video thumbnail', fatal=False) | ||||
@@ -369,14 +369,14 @@ class NiconicoIE(InfoExtractor): | |||||
video_detail = watch_api_data.get('videoDetail', {}) | video_detail = watch_api_data.get('videoDetail', {}) | ||||
thumbnail = ( | thumbnail = ( | ||||
get_video_info(['thumbnail_url', 'thumbnailURL']) or | |||||
self._html_search_meta('image', webpage, 'thumbnail', default=None) or | |||||
video_detail.get('thumbnail')) | |||||
get_video_info(['thumbnail_url', 'thumbnailURL']) | |||||
or self._html_search_meta('image', webpage, 'thumbnail', default=None) | |||||
or video_detail.get('thumbnail')) | |||||
description = get_video_info('description') | description = get_video_info('description') | ||||
timestamp = (parse_iso8601(get_video_info('first_retrieve')) or | |||||
unified_timestamp(get_video_info('postedDateTime'))) | |||||
timestamp = (parse_iso8601(get_video_info('first_retrieve')) | |||||
or unified_timestamp(get_video_info('postedDateTime'))) | |||||
if not timestamp: | if not timestamp: | ||||
match = self._html_search_meta('datePublished', webpage, 'date published', default=None) | match = self._html_search_meta('datePublished', webpage, 'date published', default=None) | ||||
if match: | if match: | ||||
@@ -395,9 +395,9 @@ class NiconicoIE(InfoExtractor): | |||||
view_count = int_or_none(match.replace(',', '')) | view_count = int_or_none(match.replace(',', '')) | ||||
view_count = view_count or video_detail.get('viewCount') | view_count = view_count or video_detail.get('viewCount') | ||||
comment_count = (int_or_none(get_video_info('comment_num')) or | |||||
video_detail.get('commentCount') or | |||||
try_get(api_data, lambda x: x['thread']['commentCount'])) | |||||
comment_count = (int_or_none(get_video_info('comment_num')) | |||||
or video_detail.get('commentCount') | |||||
or try_get(api_data, lambda x: x['thread']['commentCount'])) | |||||
if not comment_count: | if not comment_count: | ||||
match = self._html_search_regex( | match = self._html_search_regex( | ||||
r'>Comments: <strong[^>]*>([^<]+)</strong>', | r'>Comments: <strong[^>]*>([^<]+)</strong>', | ||||
@@ -406,11 +406,11 @@ class NiconicoIE(InfoExtractor): | |||||
comment_count = int_or_none(match.replace(',', '')) | comment_count = int_or_none(match.replace(',', '')) | ||||
duration = (parse_duration( | duration = (parse_duration( | ||||
get_video_info('length') or | |||||
self._html_search_meta( | |||||
'video:duration', webpage, 'video duration', default=None)) or | |||||
video_detail.get('length') or | |||||
get_video_info('duration')) | |||||
get_video_info('length') | |||||
or self._html_search_meta( | |||||
'video:duration', webpage, 'video duration', default=None)) | |||||
or video_detail.get('length') | |||||
or get_video_info('duration')) | |||||
webpage_url = get_video_info('watch_url') or url | webpage_url = get_video_info('watch_url') or url | ||||
@@ -45,8 +45,8 @@ class NRKBaseIE(InfoExtractor): | |||||
entries = [] | entries = [] | ||||
conviva = data.get('convivaStatistics') or {} | conviva = data.get('convivaStatistics') or {} | ||||
live = (data.get('mediaElementType') == 'Live' or | |||||
data.get('isLive') is True or conviva.get('isLive')) | |||||
live = (data.get('mediaElementType') == 'Live' | |||||
or data.get('isLive') is True or conviva.get('isLive')) | |||||
def make_title(t): | def make_title(t): | ||||
return self._live_title(t) if live else t | return self._live_title(t) if live else t | ||||
@@ -31,8 +31,8 @@ class OoyalaBaseIE(InfoExtractor): | |||||
title = metadata['title'] | title = metadata['title'] | ||||
auth_data = self._download_json( | auth_data = self._download_json( | ||||
self._AUTHORIZATION_URL_TEMPLATE % (pcode, embed_code) + | |||||
compat_urllib_parse_urlencode({ | |||||
self._AUTHORIZATION_URL_TEMPLATE % (pcode, embed_code) | |||||
+ compat_urllib_parse_urlencode({ | |||||
'domain': domain, | 'domain': domain, | ||||
'supportedFormats': supportedformats or 'mp4,rtmp,m3u8,hds,dash,smooth', | 'supportedFormats': supportedformats or 'mp4,rtmp,m3u8,hds,dash,smooth', | ||||
'embedToken': embed_token, | 'embedToken': embed_token, | ||||
@@ -43,9 +43,9 @@ def cookie_to_dict(cookie): | |||||
if cookie.discard is not None: | if cookie.discard is not None: | ||||
cookie_dict['discard'] = cookie.discard | cookie_dict['discard'] = cookie.discard | ||||
try: | try: | ||||
if (cookie.has_nonstandard_attr('httpOnly') or | |||||
cookie.has_nonstandard_attr('httponly') or | |||||
cookie.has_nonstandard_attr('HttpOnly')): | |||||
if (cookie.has_nonstandard_attr('httpOnly') | |||||
or cookie.has_nonstandard_attr('httponly') | |||||
or cookie.has_nonstandard_attr('HttpOnly')): | |||||
cookie_dict['httponly'] = True | cookie_dict['httponly'] = True | ||||
except TypeError: | except TypeError: | ||||
pass | pass | ||||
@@ -50,8 +50,8 @@ class PodomaticIE(InfoExtractor): | |||||
video_id = mobj.group('id') | video_id = mobj.group('id') | ||||
channel = mobj.group('channel') or mobj.group('channel_2') | channel = mobj.group('channel') or mobj.group('channel_2') | ||||
json_url = (('%s://%s.podomatic.com/entry/embed_params/%s' + | |||||
'?permalink=true&rtmp=0') % | |||||
json_url = (('%s://%s.podomatic.com/entry/embed_params/%s' | |||||
+ '?permalink=true&rtmp=0') % | |||||
(mobj.group('proto'), channel, video_id)) | (mobj.group('proto'), channel, video_id)) | ||||
data_json = self._download_webpage( | data_json = self._download_webpage( | ||||
json_url, video_id, 'Downloading video info') | json_url, video_id, 'Downloading video info') | ||||
@@ -91,8 +91,8 @@ class RuutuIE(InfoExtractor): | |||||
extract_formats(child) | extract_formats(child) | ||||
elif child.tag.endswith('File'): | elif child.tag.endswith('File'): | ||||
video_url = child.text | video_url = child.text | ||||
if (not video_url or video_url in processed_urls or | |||||
any(p in video_url for p in ('NOT_USED', 'NOT-USED'))): | |||||
if (not video_url or video_url in processed_urls | |||||
or any(p in video_url for p in ('NOT_USED', 'NOT-USED'))): | |||||
continue | continue | ||||
processed_urls.append(video_url) | processed_urls.append(video_url) | ||||
ext = determine_ext(video_url) | ext = determine_ext(video_url) | ||||
@@ -55,8 +55,8 @@ class SBSIE(InfoExtractor): | |||||
raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True) | raise ExtractorError('%s said: %s' % (self.IE_NAME, error_message), expected=True) | ||||
urls = player_params['releaseUrls'] | urls = player_params['releaseUrls'] | ||||
theplatform_url = (urls.get('progressive') or urls.get('html') or | |||||
urls.get('standard') or player_params['relatedItemsURL']) | |||||
theplatform_url = (urls.get('progressive') or urls.get('html') | |||||
or urls.get('standard') or player_params['relatedItemsURL']) | |||||
return { | return { | ||||
'_type': 'url_transparent', | '_type': 'url_transparent', | ||||
@@ -275,8 +275,8 @@ class VevoIE(VevoBaseIE): | |||||
genres = video_info.get('genres') | genres = video_info.get('genres') | ||||
genre = ( | genre = ( | ||||
genres[0] if genres and isinstance(genres, list) and | |||||
isinstance(genres[0], compat_str) else None) | |||||
genres[0] if genres and isinstance(genres, list) | |||||
and isinstance(genres[0], compat_str) else None) | |||||
is_explicit = video_info.get('isExplicit') | is_explicit = video_info.get('isExplicit') | ||||
if is_explicit is True: | if is_explicit is True: | ||||
@@ -443,8 +443,8 @@ class VKIE(VKBaseIE): | |||||
format_url = url_or_none(format_url) | format_url = url_or_none(format_url) | ||||
if not format_url or not format_url.startswith(('http', '//', 'rtmp')): | if not format_url or not format_url.startswith(('http', '//', 'rtmp')): | ||||
continue | continue | ||||
if (format_id.startswith(('url', 'cache')) or | |||||
format_id in ('extra_data', 'live_mp4', 'postlive_mp4')): | |||||
if (format_id.startswith(('url', 'cache')) | |||||
or format_id in ('extra_data', 'live_mp4', 'postlive_mp4')): | |||||
height = int_or_none(self._search_regex( | height = int_or_none(self._search_regex( | ||||
r'^(?:url|cache)(\d+)', format_id, 'height', default=None)) | r'^(?:url|cache)(\d+)', format_id, 'height', default=None)) | ||||
formats.append({ | formats.append({ | ||||
@@ -70,9 +70,9 @@ class YandexVideoIE(InfoExtractor): | |||||
description = content.get('description') | description = content.get('description') | ||||
thumbnail = content.get('thumbnail') | thumbnail = content.get('thumbnail') | ||||
timestamp = (int_or_none(content.get('release_date')) or | |||||
int_or_none(content.get('release_date_ut')) or | |||||
int_or_none(content.get('start_time'))) | |||||
timestamp = (int_or_none(content.get('release_date')) | |||||
or int_or_none(content.get('release_date_ut')) | |||||
or int_or_none(content.get('start_time'))) | |||||
duration = int_or_none(content.get('duration')) | duration = int_or_none(content.get('duration')) | ||||
series = content.get('program_title') | series = content.get('program_title') | ||||
age_limit = int_or_none(content.get('restriction_age')) | age_limit = int_or_none(content.get('restriction_age')) | ||||
@@ -258,8 +258,8 @@ class YoukuShowIE(InfoExtractor): | |||||
transform_source=lambda s: js_to_json(strip_jsonp(s))).get('html') | transform_source=lambda s: js_to_json(strip_jsonp(s))).get('html') | ||||
if playlist_data is None: | if playlist_data is None: | ||||
return [None, None] | return [None, None] | ||||
drama_list = (get_element_by_class('p-drama-grid', playlist_data) or | |||||
get_element_by_class('p-drama-half-row', playlist_data)) | |||||
drama_list = (get_element_by_class('p-drama-grid', playlist_data) | |||||
or get_element_by_class('p-drama-half-row', playlist_data)) | |||||
if drama_list is None: | if drama_list is None: | ||||
raise ExtractorError('No episodes found') | raise ExtractorError('No episodes found') | ||||
video_urls = re.findall(r'<a[^>]+href="([^"]+)"', drama_list) | video_urls = re.findall(r'<a[^>]+href="([^"]+)"', drama_list) | ||||
@@ -2052,8 +2052,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | |||||
url_or_none(try_get( | url_or_none(try_get( | ||||
player_response, | player_response, | ||||
lambda x: x['streamingData']['hlsManifestUrl'], | lambda x: x['streamingData']['hlsManifestUrl'], | ||||
compat_str)) or | |||||
url_or_none(try_get( | |||||
compat_str)) | |||||
or url_or_none(try_get( | |||||
video_info, lambda x: x['hlsvp'][0], compat_str))) | video_info, lambda x: x['hlsvp'][0], compat_str))) | ||||
if manifest_url: | if manifest_url: | ||||
formats = [] | formats = [] | ||||
@@ -2102,10 +2102,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | |||||
self._downloader.report_warning('unable to extract uploader nickname') | self._downloader.report_warning('unable to extract uploader nickname') | ||||
channel_id = ( | channel_id = ( | ||||
str_or_none(video_details.get('channelId')) or | |||||
self._html_search_meta( | |||||
'channelId', video_webpage, 'channel id', default=None) or | |||||
self._search_regex( | |||||
str_or_none(video_details.get('channelId')) | |||||
or self._html_search_meta( | |||||
'channelId', video_webpage, 'channel id', default=None) | |||||
or self._search_regex( | |||||
r'data-channel-external-id=(["\'])(?P<id>(?:(?!\1).)+)\1', | r'data-channel-external-id=(["\'])(?P<id>(?:(?!\1).)+)\1', | ||||
video_webpage, 'channel id', default=None, group='id')) | video_webpage, 'channel id', default=None, group='id')) | ||||
channel_url = 'http://www.youtube.com/channel/%s' % channel_id if channel_id else None | channel_url = 'http://www.youtube.com/channel/%s' % channel_id if channel_id else None | ||||
@@ -2564,9 +2564,9 @@ class YoutubePlaylistIE(YoutubePlaylistBaseInfoExtractor): | |||||
search_title = lambda class_name: get_element_by_attribute('class', class_name, webpage) | search_title = lambda class_name: get_element_by_attribute('class', class_name, webpage) | ||||
title_span = ( | title_span = ( | ||||
search_title('playlist-title') or | |||||
search_title('title long-title') or | |||||
search_title('title')) | |||||
search_title('playlist-title') | |||||
or search_title('title long-title') | |||||
or search_title('title')) | |||||
title = clean_html(title_span) | title = clean_html(title_span) | ||||
return self.playlist_result(url_results, playlist_id, title) | return self.playlist_result(url_results, playlist_id, title) | ||||
@@ -86,8 +86,8 @@ class ZattooPlatformBaseIE(InfoExtractor): | |||||
return next( | return next( | ||||
chan['cid'] for chan in channel_list | chan['cid'] for chan in channel_list | ||||
if chan.get('cid') and ( | if chan.get('cid') and ( | ||||
chan.get('display_alias') == channel_name or | |||||
chan.get('cid') == channel_name)) | |||||
chan.get('display_alias') == channel_name | |||||
or chan.get('cid') == channel_name)) | |||||
except StopIteration: | except StopIteration: | ||||
raise ExtractorError('Could not extract channel id') | raise ExtractorError('Could not extract channel id') | ||||
@@ -221,9 +221,9 @@ class FFmpegPostProcessor(PostProcessor): | |||||
# avconv does not have repeat option | # avconv does not have repeat option | ||||
if self.basename == 'ffmpeg': | if self.basename == 'ffmpeg': | ||||
cmd += [encodeArgument('-loglevel'), encodeArgument('repeat+info')] | cmd += [encodeArgument('-loglevel'), encodeArgument('repeat+info')] | ||||
cmd += (files_cmd + | |||||
[encodeArgument(o) for o in opts] + | |||||
[encodeFilename(self._ffmpeg_filename_argument(out_path), True)]) | |||||
cmd += (files_cmd | |||||
+ [encodeArgument(o) for o in opts] | |||||
+ [encodeFilename(self._ffmpeg_filename_argument(out_path), True)]) | |||||
if self._downloader.params.get('verbose', False): | if self._downloader.params.get('verbose', False): | ||||
self._downloader.to_screen('[debug] ffmpeg command line: %s' % shell_quote(cmd)) | self._downloader.to_screen('[debug] ffmpeg command line: %s' % shell_quote(cmd)) | ||||
@@ -326,8 +326,8 @@ class FFmpegExtractAudioPP(FFmpegPostProcessor): | |||||
information['ext'] = extension | information['ext'] = extension | ||||
# If we download foo.mp3 and convert it to... foo.mp3, then don't delete foo.mp3, silly. | # If we download foo.mp3 and convert it to... foo.mp3, then don't delete foo.mp3, silly. | ||||
if (new_path == path or | |||||
(self._nopostoverwrites and os.path.exists(encodeFilename(new_path)))): | |||||
if (new_path == path | |||||
or (self._nopostoverwrites and os.path.exists(encodeFilename(new_path)))): | |||||
self._downloader.to_screen('[ffmpeg] Post-process file %s exists, skipping' % new_path) | self._downloader.to_screen('[ffmpeg] Post-process file %s exists, skipping' % new_path) | ||||
return [], information | return [], information | ||||
@@ -64,8 +64,8 @@ class XAttrMetadataPP(PostProcessor): | |||||
except XAttrMetadataError as e: | except XAttrMetadataError as e: | ||||
if e.reason == 'NO_SPACE': | if e.reason == 'NO_SPACE': | ||||
self._downloader.report_warning( | self._downloader.report_warning( | ||||
'There\'s no disk space left, disk quota exceeded or filesystem xattr limit exceeded. ' + | |||||
(('Some ' if num_written else '') + 'extended attributes are not written.').capitalize()) | |||||
'There\'s no disk space left, disk quota exceeded or filesystem xattr limit exceeded. ' | |||||
+ (('Some ' if num_written else '') + 'extended attributes are not written.').capitalize()) | |||||
elif e.reason == 'VALUE_TOO_LONG': | elif e.reason == 'VALUE_TOO_LONG': | ||||
self._downloader.report_warning( | self._downloader.report_warning( | ||||
'Unable to write extended attributes due to too long values.') | 'Unable to write extended attributes due to too long values.') | ||||
@@ -861,8 +861,8 @@ class XAttrMetadataError(YoutubeDLError): | |||||
self.msg = msg | self.msg = msg | ||||
# Parsing code and msg | # Parsing code and msg | ||||
if (self.code in (errno.ENOSPC, errno.EDQUOT) or | |||||
'No space left' in self.msg or 'Disk quota excedded' in self.msg): | |||||
if (self.code in (errno.ENOSPC, errno.EDQUOT) | |||||
or 'No space left' in self.msg or 'Disk quota excedded' in self.msg): | |||||
self.reason = 'NO_SPACE' | self.reason = 'NO_SPACE' | ||||
elif self.code == errno.E2BIG or 'Argument list too long' in self.msg: | elif self.code == errno.E2BIG or 'Argument list too long' in self.msg: | ||||
self.reason = 'VALUE_TOO_LONG' | self.reason = 'VALUE_TOO_LONG' | ||||
@@ -1453,8 +1453,8 @@ def _windows_write_string(s, out): | |||||
def not_a_console(handle): | def not_a_console(handle): | ||||
if handle == INVALID_HANDLE_VALUE or handle is None: | if handle == INVALID_HANDLE_VALUE or handle is None: | ||||
return True | return True | ||||
return ((GetFileType(handle) & ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR or | |||||
GetConsoleMode(handle, ctypes.byref(ctypes.wintypes.DWORD())) == 0) | |||||
return ((GetFileType(handle) & ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR | |||||
or GetConsoleMode(handle, ctypes.byref(ctypes.wintypes.DWORD())) == 0) | |||||
if not_a_console(h): | if not_a_console(h): | ||||
return False | return False | ||||
@@ -1490,8 +1490,8 @@ def write_string(s, out=None, encoding=None): | |||||
if _windows_write_string(s, out): | if _windows_write_string(s, out): | ||||
return | return | ||||
if ('b' in getattr(out, 'mode', '') or | |||||
sys.version_info[0] < 3): # Python 2 lies about mode of sys.stderr | |||||
if ('b' in getattr(out, 'mode', '') | |||||
or sys.version_info[0] < 3): # Python 2 lies about mode of sys.stderr | |||||
byt = s.encode(encoding or preferredencoding(), 'ignore') | byt = s.encode(encoding or preferredencoding(), 'ignore') | ||||
out.write(byt) | out.write(byt) | ||||
elif hasattr(out, 'buffer'): | elif hasattr(out, 'buffer'): | ||||
@@ -2328,10 +2328,10 @@ def merge_dicts(*dicts): | |||||
for k, v in a_dict.items(): | for k, v in a_dict.items(): | ||||
if v is None: | if v is None: | ||||
continue | continue | ||||
if (k not in merged or | |||||
(isinstance(v, compat_str) and v and | |||||
isinstance(merged[k], compat_str) and | |||||
not merged[k])): | |||||
if (k not in merged | |||||
or (isinstance(v, compat_str) and v | |||||
and isinstance(merged[k], compat_str) | |||||
and not merged[k])): | |||||
merged[k] = v | merged[k] = v | ||||
return merged | return merged | ||||
@@ -2657,14 +2657,14 @@ def _match_one(filter_part, dct): | |||||
if m: | if m: | ||||
op = COMPARISON_OPERATORS[m.group('op')] | op = COMPARISON_OPERATORS[m.group('op')] | ||||
actual_value = dct.get(m.group('key')) | actual_value = dct.get(m.group('key')) | ||||
if (m.group('quotedstrval') is not None or | |||||
m.group('strval') is not None or | |||||
if (m.group('quotedstrval') is not None | |||||
or m.group('strval') is not None | |||||
# If the original field is a string and matching comparisonvalue is | # If the original field is a string and matching comparisonvalue is | ||||
# a number we should respect the origin of the original field | # a number we should respect the origin of the original field | ||||
# and process comparison value as a string (see | # and process comparison value as a string (see | ||||
# https://github.com/ytdl-org/youtube-dl/issues/11082). | # https://github.com/ytdl-org/youtube-dl/issues/11082). | ||||
actual_value is not None and m.group('intval') is not None and | |||||
isinstance(actual_value, compat_str)): | |||||
or actual_value is not None and m.group('intval') is not None | |||||
and isinstance(actual_value, compat_str)): | |||||
if m.group('op') not in ('=', '!='): | if m.group('op') not in ('=', '!='): | ||||
raise ValueError( | raise ValueError( | ||||
'Operator %s does not support string values!' % m.group('op')) | 'Operator %s does not support string values!' % m.group('op')) | ||||
@@ -3973,9 +3973,9 @@ def write_xattr(path, key, value): | |||||
executable = 'xattr' | executable = 'xattr' | ||||
opts = ['-w', key, value] | opts = ['-w', key, value] | ||||
cmd = ([encodeFilename(executable, True)] + | |||||
[encodeArgument(o) for o in opts] + | |||||
[encodeFilename(path, True)]) | |||||
cmd = ([encodeFilename(executable, True)] | |||||
+ [encodeArgument(o) for o in opts] | |||||
+ [encodeFilename(path, True)]) | |||||
try: | try: | ||||
p = subprocess.Popen( | p = subprocess.Popen( | ||||