2013-07-08 01:13:55 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# coding: utf-8  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  xml . etree . ElementTree  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . common  import  InfoExtractor  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . . utils  import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    determine_ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unified_strdate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  DreiSatIE ( InfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    IE_NAME  =  ' 3sat ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' (?:http://)?(?:www \ .)?3sat.de/mediathek/index.php \ ?(?:(?:mode|display)=[^&]+&)*obj=(?P<id>[0-9]+)$ ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TEST  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u " url " :  u " http://www.3sat.de/mediathek/index.php?obj=36983 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u ' file ' :  u ' 36983.webm ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u ' md5 ' :  u ' 57c97d0469d71cf874f6815aa2b7c944 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        u ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " title " :  u " Kaffeeland Schweiz " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " description " :  u " Über 80 Kaffeeröstereien liefern in der Schweiz das Getränk, in das das Land so vernarrt ist: Mehr als 1000 Tassen trinkt ein Schweizer pro Jahr. SCHWEIZWEIT nimmt die Kaffeekultur unter die... " ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " uploader " :  u " 3sat " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            u " upload_date " :  u " 20130622 " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_id  =  mobj . group ( ' id ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        details_url  =  ' http://www.3sat.de/mediathek/xmlservice/web/beitragsDetails?ak=web&id= %s '  %  video_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        details_xml  =  self . _download_webpage ( details_url ,  video_id ,  note = u ' Downloading video details ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        details_doc  =  xml . etree . ElementTree . fromstring ( details_xml . encode ( ' utf-8 ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        thumbnail_els  =  details_doc . findall ( ' .//teaserimage ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        thumbnails  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' width ' :  te . attrib [ ' key ' ] . partition ( ' x ' ) [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' height ' :  te . attrib [ ' key ' ] . partition ( ' x ' ) [ 2 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  te . text , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  for  te  in  thumbnail_els ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        information_el  =  details_doc . find ( ' .//information ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_title  =  information_el . find ( ' ./title ' ) . text 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_description  =  information_el . find ( ' ./detail ' ) . text 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        details_el  =  details_doc . find ( ' .//details ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_uploader  =  details_el . find ( ' ./channel ' ) . text 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        upload_date  =  unified_strdate ( details_el . find ( ' ./airtime ' ) . text ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        format_els  =  details_doc . findall ( ' .//formitaet ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        formats  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' format_id ' :  fe . attrib [ ' basetype ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' width ' :  int ( fe . find ( ' ./width ' ) . text ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' height ' :  int ( fe . find ( ' ./height ' ) . text ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' url ' :  fe . find ( ' ./url ' ) . text , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 14:45:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' ext ' :  determine_ext ( fe . find ( ' ./url ' ) . text ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-08 01:13:55 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            ' filesize ' :  int ( fe . find ( ' ./filesize ' ) . text ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' video_bitrate ' :  int ( fe . find ( ' ./videoBitrate ' ) . text ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' 3sat_qualityname ' :  fe . find ( ' ./quality ' ) . text , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  for  fe  in  format_els 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  fe . find ( ' ./url ' ) . text . startswith ( ' http://www.metafilegenerator.de/ ' ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  _sortkey ( format ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            qidx  =  [ ' low ' ,  ' med ' ,  ' high ' ,  ' veryhigh ' ] . index ( format [ ' 3sat_qualityname ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            prefer_http  =  1  if  ' rtmp '  in  format [ ' url ' ]  else  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ( qidx ,  prefer_http ,  format [ ' video_bitrate ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        formats . sort ( key = _sortkey ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        info  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-11 12:12:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' _type ' :  ' video ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-08 01:13:55 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            ' id ' :  video_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  video_title , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' formats ' :  formats , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' description ' :  video_description , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnails ' :  thumbnails , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnail ' :  thumbnails [ - 1 ] [ ' url ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' uploader ' :  video_uploader , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' upload_date ' :  upload_date , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # TODO: Remove when #980 has been merged 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 14:45:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        info . update ( formats [ - 1 ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-08 01:13:55 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 14:45:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  info