X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=inline;f=youtube_dl%2Fextractor%2Fpluralsight.py;h=0ffd41ecd3b73bdaaba3b27cd1638cdf0383103e;hb=df46b19cb82b90807693d0d25ac5d817546dd63b;hp=039e6eeb0a1dae38f4c6f5efd67982ee97e45de3;hpb=9df6b03caf45e7144a288d31caae0bf0472a48f7;p=youtube-dl diff --git a/youtube_dl/extractor/pluralsight.py b/youtube_dl/extractor/pluralsight.py index 039e6eeb0..0ffd41ecd 100644 --- a/youtube_dl/extractor/pluralsight.py +++ b/youtube_dl/extractor/pluralsight.py @@ -4,7 +4,6 @@ import collections import json import os import random -import re from .common import InfoExtractor from ..compat import ( @@ -12,6 +11,7 @@ from ..compat import ( compat_urlparse, ) from ..utils import ( + dict_get, ExtractorError, float_or_none, int_or_none, @@ -120,14 +120,17 @@ class PluralsightIE(PluralsightBaseIE): @staticmethod def _convert_subtitles(duration, subs): srt = '' + TIME_OFFSET_KEYS = ('displayTimeOffset', 'DisplayTimeOffset') + TEXT_KEYS = ('text', 'Text') for num, current in enumerate(subs): current = subs[num] - start, text = float_or_none( - current.get('DisplayTimeOffset')), current.get('Text') + start, text = ( + float_or_none(dict_get(current, TIME_OFFSET_KEYS)), + dict_get(current, TEXT_KEYS)) if start is None or text is None: continue end = duration if num == len(subs) - 1 else float_or_none( - subs[num + 1].get('DisplayTimeOffset')) + dict_get(subs[num + 1], TIME_OFFSET_KEYS)) if end is None: continue srt += os.linesep.join( @@ -242,9 +245,9 @@ class PluralsightIE(PluralsightBaseIE): 'quality': '%dx%d' % (f['width'], f['height']), } format_id = '%s-%s' % (ext, quality) - clip_url = self._download_webpage( + viewclip = self._download_json( '%s/video/clips/viewclip' % self._API_BASE, display_id, - 'Downloading %s URL' % format_id, fatal=False, + 'Downloading %s viewclip JSON' % format_id, fatal=False, data=json.dumps(clip_post).encode('utf-8'), headers={'Content-Type': 'application/json;charset=utf-8'}) @@ -258,15 +261,28 @@ class PluralsightIE(PluralsightBaseIE): random.randint(2, 5), display_id, '%(video_id)s: Waiting for %(timeout)s seconds to avoid throttling') - if not clip_url: + if not viewclip: continue - f.update({ - 'url': clip_url, - 'ext': ext, - 'format_id': format_id, - 'quality': quality_key(quality), - }) - formats.append(f) + + clip_urls = viewclip.get('urls') + if not isinstance(clip_urls, list): + continue + + for clip_url_data in clip_urls: + clip_url = clip_url_data.get('url') + if not clip_url: + continue + cdn = clip_url_data.get('cdn') + clip_f = f.copy() + clip_f.update({ + 'url': clip_url, + 'ext': ext, + 'format_id': '%s-%s' % (format_id, cdn) if cdn else format_id, + 'quality': quality_key(quality), + 'source_preference': int_or_none(clip_url_data.get('rank')), + }) + formats.append(clip_f) + self._sort_formats(formats) duration = int_or_none(