[pluralsight] Add support for widescreen videos (Closes #7766)

This commit is contained in:
Sergey M․ 2015-12-06 01:39:28 +06:00
parent cb160dd531
commit 756926ff00

View File

@ -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('webm', ['high', ]),
AllowedQuality('mp4', ('low', 'medium', '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 ext, qualities_ in allowed_qualities:
for quality in 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)