| 
														
															@@ -5,11 +5,13 @@ import re 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 from .common import InfoExtractor 
														 | 
														
														 | 
														
															 from .common import InfoExtractor 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 from ..utils import ( 
														 | 
														
														 | 
														
															 from ..utils import ( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    dict_get, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     ExtractorError, 
														 | 
														
														 | 
														
															     ExtractorError, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     float_or_none, 
														 | 
														
														 | 
														
															     float_or_none, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     int_or_none, 
														 | 
														
														 | 
														
															     int_or_none, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parse_duration, 
														 | 
														
														 | 
														
															     parse_duration, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     parse_iso8601, 
														 | 
														
														 | 
														
															     parse_iso8601, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    try_get, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     unescapeHTML, 
														 | 
														
														 | 
														
															     unescapeHTML, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 ) 
														 | 
														
														 | 
														
															 ) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 from ..compat import ( 
														 | 
														
														 | 
														
															 from ..compat import ( 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -643,6 +645,24 @@ class BBCIE(BBCCoUkIE): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             # rtmp download 
														 | 
														
														 | 
														
															             # rtmp download 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             'skip_download': True, 
														 | 
														
														 | 
														
															             'skip_download': True, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    }, { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        # single video embedded with Morph 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        'url': 'http://www.bbc.co.uk/sport/live/olympics/36895975', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        'info_dict': { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'id': 'p041vhd0', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'ext': 'mp4', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'title': "Nigeria v Japan - Men's First Round", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'description': 'Live coverage of the first round from Group B at the Amazonia Arena.', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'duration': 7980, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'uploader': 'BBC Sport', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'uploader_id': 'bbc_sport', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        }, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        'params': { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            # m3u8 download 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'skip_download': True, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            'proxy': '5.101.173.158:8080', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        }, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        'skip': 'Georestricted to UK', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     }, { 
														 | 
														
														 | 
														
															     }, { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         # single video with playlist.sxml URL in playlist param 
														 | 
														
														 | 
														
															         # single video with playlist.sxml URL in playlist param 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         'url': 'http://www.bbc.com/sport/0/football/33653409', 
														 | 
														
														 | 
														
															         'url': 'http://www.bbc.com/sport/0/football/33653409', 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -864,6 +884,50 @@ class BBCIE(BBCCoUkIE): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 'subtitles': subtitles, 
														 | 
														
														 | 
														
															                 'subtitles': subtitles, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             } 
														 | 
														
														 | 
														
															             } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        # Morph based embed (e.g. http://www.bbc.co.uk/sport/live/olympics/36895975) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        # There are several setPayload calls may be present but the video 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        # seems to be always related to the first one 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        morph_payload = self._parse_json( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            self._search_regex( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                r'Morph\.setPayload\([^,]+,\s*({.+?})\);', 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                webpage, 'morph payload', default='{}'), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            playlist_id, fatal=False) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if morph_payload: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            components = try_get(morph_payload, lambda x: x['body']['components'], list) or [] 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            for component in components: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                if not isinstance(component, dict): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                lead_media = try_get(component, lambda x: x['props']['leadMedia'], dict) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                if not lead_media: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                identifiers = lead_media.get('identifiers') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                if not identifiers or not isinstance(identifiers, dict): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                programme_id = identifiers.get('vpid') or identifiers.get('playablePid') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                if not programme_id: 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    continue 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                title = lead_media.get('title') or self._og_search_title(webpage) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                formats, subtitles = self._download_media_selector(programme_id) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                self._sort_formats(formats) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                description = lead_media.get('summary') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                uploader = lead_media.get('masterBrand') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                uploader_id = lead_media.get('mid') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                duration = None 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                duration_d = lead_media.get('duration') 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                if isinstance(duration_d, dict): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    duration = parse_duration(dict_get( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                        duration_d, ('rawDuration', 'formattedDuration', 'spokenDuration'))) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                return { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'id': programme_id, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'title': title, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'description': description, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'duration': duration, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'uploader': uploader, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'uploader_id': uploader_id, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'formats': formats, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    'subtitles': subtitles, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         def extract_all(pattern): 
														 | 
														
														 | 
														
															         def extract_all(pattern): 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             return list(filter(None, map( 
														 | 
														
														 | 
														
															             return list(filter(None, map( 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 lambda s: self._parse_json(s, playlist_id, fatal=False), 
														 | 
														
														 | 
														
															                 lambda s: self._parse_json(s, playlist_id, fatal=False), 
														 |