- m = re.match(self._VALID_URL, url, re.VERBOSE)
- if m.group('type').startswith('embed'):
- desktop_url = m.group('proto') + 'www' + m.group('urlmain')
- return self.url_result(desktop_url, 'TED')
- name = m.group('name')
- if m.group('type_talk'):
- return self._talk_info(url, name)
- elif m.group('type_watch'):
- return self._watch_info(url, name)
- else:
- return self._playlist_videos_info(url, name)
-
- def _playlist_videos_info(self, url, name):
- '''Returns the videos of the playlist'''
-
- webpage = self._download_webpage(url, name,
- 'Downloading playlist webpage')
-
- playlist_entries = []
- for entry in re.findall(r'(?s)<[^>]+data-ga-context=["\']playlist["\'][^>]*>', webpage):
- attrs = extract_attributes(entry)
- entry_url = compat_urlparse.urljoin(url, attrs['href'])
- playlist_entries.append(self.url_result(entry_url, self.ie_key()))
-
- final_url = self._og_search_url(webpage, fatal=False)
- playlist_id = (
- re.match(self._VALID_URL, final_url).group('playlist_id')
- if final_url else None)
-
- return self.playlist_result(
- playlist_entries, playlist_id=playlist_id,
- playlist_title=self._og_search_title(webpage, fatal=False),
- playlist_description=self._og_search_description(webpage))
-
- def _talk_info(self, url, video_name):
- webpage = self._download_webpage(url, video_name)
-
- info = self._extract_info(webpage)
-
- data = try_get(info, lambda x: x['__INITIAL_DATA__'], dict) or info
- talk_info = data['talks'][0]
-
- title = talk_info['title'].strip()
-
- downloads = talk_info.get('downloads') or {}
- native_downloads = downloads.get('nativeDownloads') or talk_info.get('nativeDownloads') or {}
-
- formats = [{
- 'url': format_url,
- 'format_id': format_id,
- } for (format_id, format_url) in native_downloads.items() if format_url is not None]
-
- subtitled_downloads = downloads.get('subtitledDownloads') or {}
- for lang, subtitled_download in subtitled_downloads.items():
- for q in self._NATIVE_FORMATS:
- q_url = subtitled_download.get(q)
- if not q_url:
- continue
- formats.append({
- 'url': q_url,
- 'format_id': '%s-%s' % (q, lang),
- 'language': lang,
- })
-
- if formats:
- for f in formats:
- finfo = self._NATIVE_FORMATS.get(f['format_id'].split('-')[0])
- if finfo:
- f.update(finfo)
-
- player_talk = talk_info['player_talks'][0]
-
- resources_ = player_talk.get('resources') or talk_info.get('resources')