2014-01-17 03:52:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  __future__  import  unicode_literals  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  json  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 18:03:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . common  import  InfoExtractor  
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-10 23:36:28 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  . . compat  import  compat_str  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . . utils  import  int_or_none  
						 
					
						
							
								
									
										
										
										
											2013-11-05 12:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:52:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 18:03:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  TEDIE ( InfoExtractor ) :  
						 
					
						
							
								
									
										
										
										
											2014-03-20 16:33:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ''' (?x) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( ? P < proto > https ? : / / ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-05 13:11:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( ? P < type > www | embed ( ? : - ssl ) ? ) ( ? P < urlmain > \. ted \. com / 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ? P < type_playlist > playlists ( ? : / \d + ) ? )  # We have a playlist 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ( ? P < type_talk > talks ) )  # We have a simple talk 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( ? P < type_watch > watch ) / [ ^ / ] + / [ ^ / ] + 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( / lang / ( . * ? ) ) ?  # The url may contain the language 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        / ( ? P < name > [ \w - ] + )  # Here goes the name and then ".html" 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 16:33:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        . * ) $ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:52:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.ted.com/talks/dan_dennett_on_our_consciousness.html ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-06-12 20:33:53 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' md5 ' :  ' fc94ac279feebbce69f21c0c6ee82810 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:52:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 14:27:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  ' 102 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  ' The illusion of consciousness ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' description ' :  ( ' Philosopher Dan Dennett makes a compelling  ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:39:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ' argument that not only don \' t we understand our own  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' consciousness, but that half the time our brains are  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ' actively fooling us. ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader ' :  ' Dan Dennett ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-07 13:07:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' width ' :  854 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 09:30:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' duration ' :  1308 , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-27 20:46:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.ted.com/watch/ted-institute/ted-bcg/vishal-sikka-the-beauty-and-power-of-algorithms ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' md5 ' :  ' 226f4fb9c62380d11b7995efa4c87994 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' vishal-sikka-the-beauty-and-power-of-algorithms ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Vishal Sikka: The beauty and power of algorithms ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnail ' :  ' re:^https?://.+ \ .jpg ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' Adaptive, intelligent, and consistent, algorithms are emerging as the ultimate app for everything from matching consumers to products to assessing medical diagnoses. Vishal Sikka shares his appreciation for the algorithm, charting both its inherent beauty and its growing power. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-14 15:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.ted.com/talks/gabby_giffords_and_mark_kelly_be_passionate_be_courageous_be_your_best ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' 1972 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-22 19:49:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-14 15:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  ' Be passionate. Be courageous. Be your best. ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' Gabby Giffords and Mark Kelly ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-22 19:49:41 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' description ' :  ' md5:5174aed4d0f16021b704120360f72b92 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 09:30:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' duration ' :  1128 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-14 15:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-08-28 00:58:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.ted.com/playlists/who_are_the_hackers ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' 10 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Who are the hackers? ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' playlist_mincount ' :  6 , 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-15 12:24:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # contains a youtube video 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' https://www.ted.com/talks/douglas_adams_parrots_the_universe_and_everything ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' add_ie ' :  [ ' Youtube ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' _ZG8HBuDjgc ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' Douglas Adams: Parrots the Universe and Everything ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' md5:01ad1e199c49ac640cb1196c0e9016af ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' University of California Television (UCTV) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  ' UCtelevision ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' upload_date ' :  ' 20080522 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-21 00:14:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # YouTube video 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' url ' :  ' http://www.ted.com/talks/jeffrey_kluger_the_sibling_bond ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' add_ie ' :  [ ' Youtube ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  ' aFBIPO-P7LM ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' ext ' :  ' mp4 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  ' The hidden power of siblings: Jeff Kluger at TEDxAsheville ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  ' md5:3d7a4f50d95ca5dd67104e2a20f43fe1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  ' TEDx Talks ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader_id ' :  ' TEDxTalks ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' upload_date ' :  ' 20111216 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' params ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' skip_download ' :  True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-07 13:07:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _NATIVE_FORMATS  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' low ' :  { ' preference ' :  1 ,  ' width ' :  320 ,  ' height ' :  180 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' medium ' :  { ' preference ' :  2 ,  ' width ' :  512 ,  ' height ' :  288 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ' high ' :  { ' preference ' :  3 ,  ' width ' :  854 ,  ' height ' :  480 } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_info ( self ,  webpage ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        info_json  =  self . _search_regex ( r ' q \ ( " \ w+.init " ,( { .+}) \ )</script> ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:39:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                       webpage ,  ' info json ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  json . loads ( info_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        m  =  re . match ( self . _VALID_URL ,  url ,  re . VERBOSE ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-01-05 13:11:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  m . group ( ' type ' ) . startswith ( ' embed ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 16:33:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            desktop_url  =  m . group ( ' proto ' )  +  ' www '  +  m . group ( ' urlmain ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . url_result ( desktop_url ,  ' TED ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        name  =  m . group ( ' name ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  m . group ( ' type_talk ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  self . _talk_info ( url ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  m . group ( ' type_watch ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . _watch_info ( url ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  self . _playlist_videos_info ( url ,  name ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _playlist_videos_info ( self ,  url ,  name ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ''' Returns the videos of the playlist ''' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 14:33:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  name , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-23 21:39:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                         ' Downloading playlist webpage ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        info  =  self . _extract_info ( webpage ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        playlist_info  =  info [ ' playlist ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 14:33:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        playlist_entries  =  [ 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 12:34:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . url_result ( ' http://www.ted.com/talks/ '  +  talk [ ' slug ' ] ,  self . ie_key ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  talk  in  info [ ' talks ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 14:33:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . playlist_result ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            playlist_entries , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            playlist_id = compat_str ( playlist_info [ ' id ' ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            playlist_title = playlist_info [ ' title ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:27:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _talk_info ( self ,  url ,  video_name ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  video_name ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 21:55:53 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        self . report_extraction ( video_name ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 19:48:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 13:22:10 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        talk_info  =  self . _extract_info ( webpage ) [ ' talks ' ] [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 19:48:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-21 00:14:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        external  =  talk_info . get ( ' external ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  external : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            service  =  external [ ' service ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . to_screen ( ' Found video from  %s '  %  service ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ext_url  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  service . lower ( )  ==  ' youtube ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ext_url  =  external . get ( ' code ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-15 12:24:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' _type ' :  ' url ' , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-21 00:14:38 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' url ' :  ext_url  or  external [ ' uri ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-15 12:24:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        formats  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  format_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' format_id ' :  format_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' format ' :  format_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-14 15:23:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  for  ( format_id ,  format_url )  in  talk_info [ ' nativeDownloads ' ] . items ( )  if  format_url  is  not  None ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  f  in  formats : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                finfo  =  self . _NATIVE_FORMATS . get ( f [ ' format_id ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  finfo : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    f . update ( finfo ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-10 23:36:28 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  format_id ,  resources  in  talk_info [ ' resources ' ] . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  format_id  ==  ' h264 ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  resource  in  resources : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    bitrate  =  int_or_none ( resource . get ( ' bitrate ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  resource [ ' file ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' format_id ' :  ' %s - %s k '  %  ( format_id ,  bitrate ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' tbr ' :  bitrate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elif  format_id  ==  ' rtmp ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                streamer  =  talk_info . get ( ' streamer ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  not  streamer : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  resource  in  resources : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' format_id ' :  ' %s - %s '  %  ( format_id ,  resource . get ( ' name ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  streamer , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' play_path ' :  resource [ ' file ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ext ' :  ' flv ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' width ' :  int_or_none ( resource . get ( ' width ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' height ' :  int_or_none ( resource . get ( ' height ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' tbr ' :  int_or_none ( resource . get ( ' bitrate ' ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elif  format_id  ==  ' hls ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                formats . extend ( self . _extract_m3u8_formats ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    resources . get ( ' stream ' ) ,  video_name ,  ' mp4 ' ,  m3u8_id = format_id ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        audio_download  =  talk_info . get ( ' audioDownload ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  audio_download : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' url ' :  audio_download , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' format_id ' :  ' audio ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        self . _sort_formats ( formats ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-05 14:27:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_id  =  compat_str ( talk_info [ ' id ' ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 19:48:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-16 11:24:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        thumbnail  =  talk_info [ ' thumb ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  thumbnail . startswith ( ' http ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            thumbnail  =  ' http:// '  +  thumbnail 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-15 14:06:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 19:48:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  video_id , 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-29 05:12:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  talk_info [ ' title ' ] . strip ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader ' :  talk_info [ ' speaker ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-16 11:24:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' thumbnail ' :  thumbnail , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' description ' :  self . _og_search_description ( webpage ) , 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-21 22:33:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' subtitles ' :  self . _get_subtitles ( video_id ,  talk_info ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-04 10:32:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' formats ' :  formats , 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-12 09:30:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' duration ' :  talk_info . get ( ' duration ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-04 10:32:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 18:03:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _get_subtitles ( self ,  video_id ,  talk_info ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        languages  =  [ lang [ ' languageCode ' ]  for  lang  in  talk_info . get ( ' languages ' ,  [ ] ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  languages : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sub_lang_list  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  l  in  languages : 
							 
						 
					
						
							
								
									
										
										
										
											2015-02-15 18:03:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                sub_lang_list [ l ]  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  ' http://www.ted.com/talks/subtitles/id/ %s /lang/ %s /format/ %s '  %  ( video_id ,  l ,  ext ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ext ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ext  in  [ ' ted ' ,  ' srt ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-04 21:47:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  sub_lang_list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _watch_info ( self ,  url ,  name ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webpage  =  self . _download_webpage ( url ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        config_json  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 21:17:11 +06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            r ' " pages \ .jwplayer " \ s*, \ s*( { .+?}) \ s* \ ) \ s*</script> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webpage ,  ' config ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        config  =  json . loads ( config_json ) [ ' config ' ] 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        video_url  =  config [ ' video ' ] [ ' url ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        thumbnail  =  config . get ( ' image ' ,  { } ) . get ( ' url ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        title  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r " (?s)<h1(?: \ s+class= ' [^ ' ]+ ' )?>(.+?)</h1> " ,  webpage ,  ' title ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        description  =  self . _html_search_regex ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-21 12:37:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' (?s)<h4 class= " [^ " ]+ "  id= " h3--about-this-talk " >.*?</h4>(.*?)</div> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r ' (?s)<p><strong>About this talk:</strong> \ s+(.*?)</p> ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-27 02:22:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            webpage ,  ' description ' ,  fatal = False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  video_url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  title , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnail ' :  thumbnail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  description , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }