|
@ -1,5 +1,6 @@ |
|
|
from __future__ import unicode_literals |
|
|
from __future__ import unicode_literals |
|
|
|
|
|
|
|
|
|
|
|
import re |
|
|
import json |
|
|
import json |
|
|
import random |
|
|
import random |
|
|
import collections |
|
|
import collections |
|
@ -14,6 +15,7 @@ from ..utils import ( |
|
|
ExtractorError, |
|
|
ExtractorError, |
|
|
int_or_none, |
|
|
int_or_none, |
|
|
parse_duration, |
|
|
parse_duration, |
|
|
|
|
|
qualities, |
|
|
sanitized_Request, |
|
|
sanitized_Request, |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
@ -140,15 +142,28 @@ class PluralsightIE(PluralsightBaseIE): |
|
|
'low': {'width': 640, 'height': 480}, |
|
|
'low': {'width': 640, 'height': 480}, |
|
|
'medium': {'width': 848, 'height': 640}, |
|
|
'medium': {'width': 848, 'height': 640}, |
|
|
'high': {'width': 1024, 'height': 768}, |
|
|
'high': {'width': 1024, 'height': 768}, |
|
|
|
|
|
'high-widescreen': {'width': 1280, 'height': 720}, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QUALITIES_PREFERENCE = ('low', 'medium', 'high', 'high-widescreen',) |
|
|
|
|
|
quality_key = qualities(QUALITIES_PREFERENCE) |
|
|
|
|
|
|
|
|
AllowedQuality = collections.namedtuple('AllowedQuality', ['ext', 'qualities']) |
|
|
AllowedQuality = collections.namedtuple('AllowedQuality', ['ext', 'qualities']) |
|
|
|
|
|
|
|
|
ALLOWED_QUALITIES = ( |
|
|
ALLOWED_QUALITIES = ( |
|
|
AllowedQuality('webm', ('high',)), |
|
|
|
|
|
AllowedQuality('mp4', ('low', 'medium', 'high',)), |
|
|
|
|
|
|
|
|
AllowedQuality('webm', ['high', ]), |
|
|
|
|
|
AllowedQuality('mp4', ['low', 'medium', 'high', ]), |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
# Some courses also offer widescreen resolution for high quality (see |
|
|
|
|
|
# https://github.com/rg3/youtube-dl/issues/7766) |
|
|
|
|
|
widescreen = True if re.search( |
|
|
|
|
|
r'courseSupportsWidescreenVideoFormats\s*:\s*true', webpage) else False |
|
|
|
|
|
best_quality = 'high-widescreen' if widescreen else 'high' |
|
|
|
|
|
if widescreen: |
|
|
|
|
|
for allowed_quality in ALLOWED_QUALITIES: |
|
|
|
|
|
allowed_quality.qualities.append(best_quality) |
|
|
|
|
|
|
|
|
# In order to minimize the number of calls to ViewClip API and reduce |
|
|
# In order to minimize the number of calls to ViewClip API and reduce |
|
|
# the probability of being throttled or banned by Pluralsight we will request |
|
|
# the probability of being throttled or banned by Pluralsight we will request |
|
|
# only single format until formats listing was explicitly requested. |
|
|
# only single format until formats listing was explicitly requested. |
|
@ -164,12 +179,12 @@ class PluralsightIE(PluralsightBaseIE): |
|
|
if req_ext == allowed_quality.ext and req_quality in allowed_quality.qualities: |
|
|
if req_ext == allowed_quality.ext and req_quality in allowed_quality.qualities: |
|
|
return (AllowedQuality(req_ext, (req_quality, )), ) |
|
|
return (AllowedQuality(req_ext, (req_quality, )), ) |
|
|
req_ext = 'webm' if self._downloader.params.get('prefer_free_formats') else 'mp4' |
|
|
req_ext = 'webm' if self._downloader.params.get('prefer_free_formats') else 'mp4' |
|
|
return (AllowedQuality(req_ext, ('high', )), ) |
|
|
|
|
|
|
|
|
return (AllowedQuality(req_ext, (best_quality, )), ) |
|
|
allowed_qualities = guess_allowed_qualities() |
|
|
allowed_qualities = guess_allowed_qualities() |
|
|
|
|
|
|
|
|
formats = [] |
|
|
formats = [] |
|
|
for ext, qualities in allowed_qualities: |
|
|
|
|
|
for quality in qualities: |
|
|
|
|
|
|
|
|
for ext, qualities_ in allowed_qualities: |
|
|
|
|
|
for quality in qualities_: |
|
|
f = QUALITIES[quality].copy() |
|
|
f = QUALITIES[quality].copy() |
|
|
clip_post = { |
|
|
clip_post = { |
|
|
'a': author, |
|
|
'a': author, |
|
@ -205,6 +220,7 @@ class PluralsightIE(PluralsightBaseIE): |
|
|
'url': clip_url, |
|
|
'url': clip_url, |
|
|
'ext': ext, |
|
|
'ext': ext, |
|
|
'format_id': format_id, |
|
|
'format_id': format_id, |
|
|
|
|
|
'quality': quality_key(quality), |
|
|
}) |
|
|
}) |
|
|
formats.append(f) |
|
|
formats.append(f) |
|
|
self._sort_formats(formats) |
|
|
self._sort_formats(formats) |
|
|