2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# encoding: utf-8  
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  __future__  import  unicode_literals  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  json  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  re  
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  itertools  
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . common  import  InfoExtractor  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  . . utils  import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    compat_str , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-21 17:06:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urlparse , 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    compat_urllib_parse , 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ExtractorError , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unified_strdate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  SoundcloudIE ( InfoExtractor ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    """ Information extractor for soundcloud.com 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       To  access  the  media ,  the  uid  of  the  song  and  a  stream  token 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       must  be  extracted  from  the  page  source  and  the  script  must  make 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       a  request  to  media . soundcloud . com / crossdomain . xml .  Then 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       the  media  can  be  grabbed  by  requesting  from  an  url  composed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       of  the  stream  token  and  uid 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ''' ^(?:https?://)? 
 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-19 16:39:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ( ? : ( ? : ( ? : www \. | m \. ) ? soundcloud \. com / 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 19:57:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? P < uploader > [ \w \d - ] + ) / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ( ? ! sets / ) ( ? P < title > [ \w \d - ] + ) / ? 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            ( ? P < token > [ ^ ? ] + ? ) ? ( ? : [ ? ] . * ) ? $ ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                       | ( ? : api \. soundcloud \. com / tracks / ( ? P < track_id > \d + ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 16:18:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                       | ( ? P < player > ( ? : w | player | p . ) \. soundcloud \. com / player / ? . * ? url = . * ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' soundcloud ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' file ' :  ' 62986583.mp3 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' md5 ' :  ' ebef0a451b909710ed1d7787dddbf0d7 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " upload_date " :  " 20121011 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " description " :  " No Downloads untill we record the finished version this weekend, i was too pumped n i had to post it , earl is prolly gonna b hella p.o ' d " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " uploader " :  " E.T. ExTerrestrial Music " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " title " :  " Lostin Powers - She so Heavy (SneakPreview) Adrian Ackers Blueprint 1 " 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # not streamable song 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://soundcloud.com/the-concept-band/goldrushed-mastered?in=the-concept-band/sets/the-royal-concept-ep ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 47127627 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp3 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Goldrushed ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' The Royal Concept ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20120521 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' params ' :  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                # rtmp 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' skip_download ' :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # private link 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://soundcloud.com/jaimemf/youtube-dl-test-video-a-y-baw/s-8Pjrp ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' md5 ' :  ' aa0dd32bfea9b0c5ef4f02aacd080604 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 123998367 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' mp3 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Youtube - Dl Test Video  \' \'  Ä↭ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' jaimeMF ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' test chars:   \" \' / \\ ä↭ ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20131209 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-10 13:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # downloadable song 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' url ' :  ' https://soundcloud.com/simgretina/just-your-problem-baby-1 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' md5 ' :  ' 56a8b69568acaa967b4c49f9d1d52d19 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' info_dict ' :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  ' 105614606 ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' ext ' :  ' wav ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  ' Just Your Problem Baby (Acapella) ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' description ' :  ' Vocals ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' uploader ' :  ' Sim Gretina ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' upload_date ' :  ' 20130815 ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-10 13:04:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _CLIENT_ID  =  ' b45b1aa10f1ac2941910a7f0d10f8e28 ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 13:16:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _IPHONE_CLIENT_ID  =  ' 376f225bf427445fc4bfb6b99b72e0bf ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  suitable ( cls ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  re . match ( cls . _VALID_URL ,  url ,  flags = re . VERBOSE )  is  not  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  report_resolve ( self ,  video_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Report information extraction. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . to_screen ( u ' %s : Resolving id '  %  video_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @classmethod 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _resolv_url ( cls ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ' http://api.soundcloud.com/resolve.json?url= '  +  url  +  ' &client_id= '  +  cls . _CLIENT_ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _extract_info_dict ( self ,  info ,  full_title = None ,  quiet = False ,  secret_token = None ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        track_id  =  compat_str ( info [ ' id ' ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        name  =  full_title  or  track_id 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  quiet : 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . report_extraction ( name ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        thumbnail  =  info [ ' artwork_url ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  thumbnail  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            thumbnail  =  thumbnail . replace ( ' -large ' ,  ' -t500x500 ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ext  =  ' mp3 ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        result  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' id ' :  track_id , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' uploader ' :  info [ ' user ' ] [ ' username ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' upload_date ' :  unified_strdate ( info [ ' created_at ' ] ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' title ' :  info [ ' title ' ] , 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' description ' :  info [ ' description ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' thumbnail ' :  thumbnail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  info . get ( ' downloadable ' ,  False ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 13:16:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # We can build a direct link to the song 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            format_url  =  ( 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' https://api.soundcloud.com/tracks/ {0} /download?client_id= {1} ' . format ( 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    track_id ,  self . _CLIENT_ID ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            result [ ' formats ' ]  =  [ { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' format_id ' :  ' download ' , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' ext ' :  info . get ( ' original_format ' ,  ' mp3 ' ) , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' url ' :  format_url , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 22:34:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' vcodec ' :  ' none ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 13:16:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # We have to retrieve the url 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            streams_url  =  ( ' http://api.soundcloud.com/i1/tracks/ {0} /streams? ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' client_id= {1} &secret_token= {2} ' . format ( track_id ,  self . _IPHONE_CLIENT_ID ,  secret_token ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            stream_json  =  self . _download_webpage ( 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                streams_url , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                track_id ,  ' Downloading track url ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            formats  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            format_dict  =  json . loads ( stream_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  key ,  stream_url  in  format_dict . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  key . startswith ( u ' http ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' format_id ' :  key , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ext ' :  ext , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  stream_url , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 22:34:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ' vcodec ' :  ' none ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                elif  key . startswith ( u ' rtmp ' ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    # The url doesn't have an rtmp app, we have to extract the playpath 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    url ,  path  =  stream_url . split ( ' mp3: ' ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    formats . append ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' format_id ' :  key , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' url ' :  url , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' play_path ' :  ' mp3: '  +  path , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ' ext ' :  ext , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 22:34:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        ' vcodec ' :  ' none ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  formats : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 13:16:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                # We fallback to the stream_url in the original info, this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # cannot be always used, sometimes it can give an HTTP 404 error 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                formats . append ( { 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' format_id ' :  ' fallback ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' url ' :  info [ ' stream_url ' ]  +  ' ?client_id= '  +  self . _CLIENT_ID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ' ext ' :  ext , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 22:34:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ' vcodec ' :  ' none ' , 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  f  in  formats : 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  f [ ' format_id ' ] . startswith ( ' http ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    f [ ' protocol ' ]  =  ' http ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  f [ ' format_id ' ] . startswith ( ' rtmp ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    f [ ' protocol ' ]  =  ' rtmp ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            self . _sort_formats ( formats ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 20:30:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            result [ ' formats ' ]  =  formats 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-21 13:16:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  result 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ,  flags = re . VERBOSE ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        track_id  =  mobj . group ( ' track_id ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        token  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  track_id  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            info_json_url  =  ' http://api.soundcloud.com/tracks/ '  +  track_id  +  ' .json?client_id= '  +  self . _CLIENT_ID 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            full_title  =  track_id 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-02 16:18:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  mobj . group ( ' player ' ) : 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-21 17:06:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            query  =  compat_urlparse . parse_qs ( compat_urlparse . urlparse ( url ) . query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  self . url_result ( query [ ' url ' ] [ 0 ] ,  ie = ' Soundcloud ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # extract uploader (which is in the url) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            uploader  =  mobj . group ( ' uploader ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            # extract simple title (uploader + slug of song title) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            slug_title  =   mobj . group ( ' title ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            token  =  mobj . group ( ' token ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            full_title  =  resolve_title  =  ' %s / %s '  %  ( uploader ,  slug_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  token : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                resolve_title  + =  ' / %s '  %  token 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . report_resolve ( full_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            url  =  ' http://soundcloud.com/ %s '  %  resolve_title 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:39:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            info_json_url  =  self . _resolv_url ( url ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        info_json  =  self . _download_webpage ( info_json_url ,  full_title ,  ' Downloading info JSON ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        info  =  json . loads ( info_json ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-09 17:08:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  self . _extract_info_dict ( info ,  full_title ,  secret_token = token ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  SoundcloudSetIE ( SoundcloudIE ) :  
						 
					
						
							
								
									
										
										
										
											2013-06-27 21:11:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' ^(?:https?://)?(?:www \ .)?soundcloud \ .com/([ \ w \ d-]+)/sets/([ \ w \ d-]+)(?:[?].*)?$ ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' soundcloud:set ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # it's in tests/test_playlists.py 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _TESTS  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  mobj  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  ExtractorError ( u ' Invalid URL:  %s '  %  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # extract uploader (which is in the url) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        uploader  =  mobj . group ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # extract simple title (uploader + slug of song title) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        slug_title  =   mobj . group ( 2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        full_title  =  ' %s /sets/ %s '  %  ( uploader ,  slug_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . report_resolve ( full_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  ' http://soundcloud.com/ %s /sets/ %s '  %  ( uploader ,  slug_title ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        resolv_url  =  self . _resolv_url ( url ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-23 20:57:44 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        info_json  =  self . _download_webpage ( resolv_url ,  full_title ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        info  =  json . loads ( info_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ' errors '  in  info : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  err  in  info [ ' errors ' ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                self . _downloader . report_error ( u ' unable to download video webpage:  %s '  %  compat_str ( err [ ' error_message ' ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . report_extraction ( full_title ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-24 14:05:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  { ' _type ' :  ' playlist ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' entries ' :  [ self . _extract_info_dict ( track )  for  track  in  info [ ' tracks ' ] ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' id ' :  info [ ' id ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' title ' :  info [ ' title ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  SoundcloudUserIE ( SoundcloudIE ) :  
						 
					
						
							
								
									
										
										
										
											2013-12-04 20:34:47 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _VALID_URL  =  r ' https?://(www \ .)?soundcloud \ .com/(?P<user>[^/]+)(/?(tracks/)?)?( \ ?.*)?$ ' 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    IE_NAME  =  ' soundcloud:user ' 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # it's in tests/test_playlists.py 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-09 18:06:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _TESTS  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  _real_extract ( self ,  url ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        mobj  =  re . match ( self . _VALID_URL ,  url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        uploader  =  mobj . group ( ' user ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  ' http://soundcloud.com/ %s / '  %  uploader 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        resolv_url  =  self . _resolv_url ( url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        user_json  =  self . _download_webpage ( resolv_url ,  uploader , 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ' Downloading user info ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        user  =  json . loads ( user_json ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        tracks  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  i  in  itertools . count ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  compat_urllib_parse . urlencode ( { ' offset ' :  i * 50 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  ' client_id ' :  self . _CLIENT_ID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tracks_url  =  ' http://api.soundcloud.com/users/ %s /tracks.json? '  %  user [ ' id ' ]  +  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response  =  self . _download_webpage ( tracks_url ,  uploader ,  
							 
						 
					
						
							
								
									
										
										
										
											2014-01-17 03:29:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' Downloading tracks page  %s '  %  ( i + 1 ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-14 21:41:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new_tracks  =  json . loads ( response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tracks . extend ( self . _extract_info_dict ( track ,  quiet = True )  for  track  in  new_tracks ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  len ( new_tracks )  <  50 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' _type ' :  ' playlist ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' id ' :  compat_str ( user [ ' id ' ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' title ' :  user [ ' username ' ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ' entries ' :  tracks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }