U
    gѝ                     @   sV  d dl Z d dlZd dlZd dlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd de Z!G dd de Z"G dd de Z#G dd de Z$G dd deZ%G dd  d eeZ&dS )!    N   )InfoExtractorSearchInfoExtractor   )HEADRequest)	HTTPError)KNOWN_EXTENSIONSExtractorErrorfloat_or_noneint_or_nonejoin_nonemptymimetype2extparse_qsstr_or_nonetry_callunified_timestampupdate_url_queryurl_or_noneurlhandle_detect_ext)traverse_objc                   @   s(   e Zd ZdZdgZdddZdd ZdS )	SoundcloudEmbedIEzDhttps?://(?:w|player|p)\.soundcloud\.com/player/?.*?\burl=(?P<id>.+)zQ<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?(?:w\.)?soundcloud\.com/player.+?)\1zhttps://w.soundcloud.com/player/?visual=true&url=https%3A%2F%2Fapi.soundcloud.com%2Fplaylists%2F922213810&show_artwork=true&maxwidth=640&maxheight=960&dnt=1&secret_token=s-ziYeyTurlZonly_matchingc                 C   s>   t |}|d d }|d}|r4t|d|d i}| |S )Nr   r   secret_token)r   getr   
url_result)selfr   queryZapi_urlr    r   ?/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/soundcloud.py_real_extract$   s    
zSoundcloudEmbedIE._real_extractN)__name__
__module____qualname__
_VALID_URLZ_EMBED_REGEXZ_TESTr    r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	i Z
dZd	d
ddddddddd
ZddddddgZejdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd2d.d/Zed0d1 Zd,S )3SoundcloudBaseIE
soundcloudzhttps://api-v2.soundcloud.com/https://soundcloud.com/sMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36z?client_id=%sz;https://api-auth.soundcloud.com/web-auth/sign-in/password%sz1https://api-auth.soundcloud.com/connect/session%sz-([0-9a-z]+)\.jpg          /   C   d   i,  i  i  r   )
ZminitinysmallZbadgeZt67x67ZlargeZt300x300ZcropZt500x500originalZhttp_aacZhls_aacZ	http_opusZhls_opusZhttp_mp3Zhls_mp3c                    s2   t dt fdd jddgtdD jS )N|c                 3   s<   | ]4}|d kr t |ddndtt j jV  qdS )defaultz\*z.*r2   N)reescapereplacejoinmap_DEFAULT_FORMATS).0patternr   r   r   	<genexpr>K   s   z1SoundcloudBaseIE._is_requested.<locals>.<genexpr>formatsr3   )ie_key)r4   compiler7   setZ_configuration_argSoundcloudIE	fullmatchr<   r   r<   r   _is_requestedI   s    zSoundcloudBaseIE._is_requestedc                 C   s   | j dd| d S )Nr&   	client_id)cachestore)r   rE   r   r   r   _store_client_idQ   s    z!SoundcloudBaseIE._store_client_idc                 C   sn   |  dd }ttd|D ]D}| j |d dd}|r| jd|dd d}|r|| _| |  d S qtdd S )	Nr'   z<script[^>]+src="([^"]+)"Ffatalz#client_id\s*:\s*"([0-9a-zA-Z]{32})"z	client id)r3   zUnable to extract client id)Z_download_webpagereversedr4   findall_search_regex
_CLIENT_IDrH   r	   )r   ZwebpagesrcscriptrE   r   r   r   _update_client_idT   s      
z"SoundcloudBaseIE._update_client_idc                 O   s   | ddk}|r|d= | di  }tdD ]}| j|d< ||d< z| j||W   S  tk
r } zXt|jtr|jj	dkr| 
d  |   W Y (q0n|r| t| W Y  dS  W 5 d }~X Y q0X q0d S )NrJ   Fr   r   rE   )    )r   copyrangerN   _download_jsonr	   
isinstancecauser   statusrH   rQ   report_warningstr)r   argskwargsZ	non_fatalr   _er   r   r   	_call_apib   s$    


zSoundcloudBaseIE._call_apic                 C   s   | j ddpd| _d S )Nr&   rE   Z a3e059563d7fd3372b49b37f00a00bcf)rF   loadrN   r<   r   r   r   _initialize_pre_loginv   s    z&SoundcloudBaseIE._initialize_pre_loginc              
   C   s\   | j | j| j| j  d ddtdd|ii drNd| | jd< |   n
| 	d d S )	NzVerifying login token...FsessionZaccess_token)noterJ   datazOAuth Authorizationz<Provided authorization token is invalid. Continuing as guest)
_request_webpage_API_VERIFY_AUTH_TOKEN_API_AUTH_QUERY_TEMPLATErN   jsondumpsencode_HEADERSZreport_loginrZ   r   tokenr   r   r   _verify_oauth_tokeny   s      
z$SoundcloudBaseIE._verify_oauth_tokenc                    s,    j r
d S t fdd }r( | d S )Nc                      s      jd jS )NZoauth_token)Z_get_cookies	_BASE_URLvaluer   r<   r   r   <lambda>       z3SoundcloudBaseIE._real_initialize.<locals>.<lambda>)rm   r   rp   rn   r   r<   r   _real_initialize   s    z!SoundcloudBaseIE._real_initializec                 C   s:   |dkr"t d| jdd dd| jr,d S | | d S )NZoauthzLogin using username and password is not currently supported. Use "--username oauth --password <oauth_token>" to login using an oauth token, or else cookies)methodTexpected)r	   _login_hintrm   rp   )r   usernamepasswordr   r   r   _perform_login   s    
zSoundcloudBaseIE._perform_loginc                 C   s   d}d}d}d}d}d}	d}
d}d}d	}d
}d}|}|}d dd ||||||	|
|fD }|| | | | | | | }d}tt|D ]0}|d? d|@ d>  }|t|| 7 }|dM }q| d| d|dd| S )N!   r   i; u   i@w i  %      Z 0763ed7314c69015fd4a0dc16bbf4b908r(   -c                 S   s   g | ]}t |qS r   r[   )r:   ZmIntr   r   r   
<listcomp>   s     z)SoundcloudBaseIE.sign.<locals>.<listcomp>i>z    i :x)r7   rU   lenord)r   userpwZclidaiswulbkcnyrr_   tdhmfr   r   r   sign   s,    $ 
zSoundcloudBaseIE.signNFc                    s  t d }d }t  g d| ji}|r4||d< |srdrrdrrz(| j| j d| d|d	|| jd
}W n tk
r }	 zft|	j	t
r|	j	jdkr| d|    n0t|	j	t
r|	j	jdkr| d n| |	j d }W 5 d }	~	X Y nX t|dthf }
rr| jt|
|dddd}|rr|j} | dt|pVdt|jd|ddd  fdd}d[fdd	}tddd d! fD ]F}|r q|d" }t|d#d$t hf}|d%krd&}|d'krd(|krd'}|d)ksd*|krd+}d }t|d,thf }r4|d-d. }|tkrTtt|d#d/t hf}t||d-d0}| |s| d1| d2 qt| j ||d3| d4|| jd
d"thf|rq  ||d5||d6pd7|k qD ]}d8|d9< qs"d:d;kr"| j!d<d= d>p0i }g }d?}|pN|d@}t|t rt"#| j$|r| j%& D ]p\}}|t"'| j$dA| dB|dC}|dDkr|sdE}n|dFkrd|dG< |r|(||dH || qvn
d"|ig}fdIdJ}||dKt|dp"|dL|dMt)dN|dO|t*dPdQdMdR|dS|dTpv|dU|dV|dWtdXt hdYd! ht+f|snd dZS )\NidtitlerE   r   ZdownloadableZhas_downloads_lefttracks/z	/downloadz.Downloading original download format info JSONr   headersrR   zAOriginal download format is only available for registered users. rS   z9Original download format is not available for this clientZredirectUriz.Checking original download format availabilityz)Original download format is not availableFrI   downloadmp3zContent-Length
   ZOriginal)	format_idextfilesizer   qualityformat_notec                    s   |  p|  kS Nr   )r   )format_urlsr   r   invalid_url   s    z8SoundcloudBaseIE._extract_info_dict.<locals>.invalid_urlc           
         s  t d}|r8|  D ]\}}| |s|| |< qg }|rJ|| | d}|dkrn| dddd dD ] }t| |}|rr|| qr|pt d	| d
 }|r|d | d}	|	rt|	| d< |dkr|dkrdnd}nd}| d	|||rdnd d  |  d S )Nz.\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?])r   Zaac   r   ZPremium)abrr   r   )r   r   z/(?:preview|playlist)/0/30/r   previewr   )hlshls-aesZm3u8Zm3u8_nativehttpr^   i)r   protocol
preference)
r4   search	groupdictitemsr   appendupdater   intr7   )
r   r   Z
is_previewmobjr   vZformat_id_listr   r   r   )r>   
stream_urlr   r   
add_format   sD    





z7SoundcloudBaseIE._extract_info_dict.<locals>.add_formatZmediaZtranscodingsc                 S   s   t |d S )Nr   )r   )r^   r   r   r   r   rs   %  rt   z5SoundcloudBaseIE._extract_info_dict.<locals>.<lambda>r   formatr   Zprogressiver   r   z/hlszencrypted-hlsz/encrypted-hlsr   presetr^   r   Z	mime_type)delim"z%" is not a requested format, skippingzDownloading z format info JSON)r   r   Zsnippedz	/preview/noneZvcodecpolicyZBLOCKT)Zmetadata_availabler   artwork_urlZ
avatar_urlr   z.jpg)r   r   r/      r1   r   )widthheightc                    s   t  |  dS )N_count)r   r   )key)infor   r   extract_counti  s    z:SoundcloudBaseIE._extract_info_dict.<locals>.extract_countr{   Z	permalinkpermalink_urlZ
created_atdescriptiondurationi  licenseZplaybackZfavoritingslikescommentrepostsZgenrec                 S   s   | pd S r   r   )r   r   r   r   rs   |  rt   )r   uploaderuploader_iduploader_url	timestampr   r   
thumbnailsr   Zwebpage_urlr   
view_count
like_countcomment_countrepost_countgenresr>   )F),r[   rA   rN   r   rV   _API_V2_BASErm   r	   rW   rX   r   rY   rZ   rz   Zwrite_debugmsgr   r   rg   r   r   addr   r   r   r   r   splitr   r   r   rD   r`   Zraise_geo_restrictedr4   r   _IMAGE_REPL_RE_ARTWORK_MAPr   subr   r   r
   all)r   r   
full_titler   extract_flattrack_idr   r   Zdownload_datar_   Zredirect_urlZurlhZ
format_urlr   r   r   r   r   r   
identifierr   r   r   r   	thumbnailZimage_idsizer   r   r   )r   r>   r   r   r   _extract_info_dict   s   
   
   
	&

  
 

 


z#SoundcloudBaseIE._extract_info_dictc                 C   s   | j d | S )Nzresolve?url=)r   )clsr   r   r   r   _resolv_url  s    zSoundcloudBaseIE._resolv_url)NNF)r!   r"   r#   Z_NETRC_MACHINEr   rq   Z_USER_AGENTri   Z_API_AUTH_URL_PWrh   rm   r   r   r9   	functoolscached_propertyrD   rH   rQ   r`   rb   rp   ru   r}   r   r   classmethodr   r   r   r   r   r%   -   sF   

+
 0r%   c                   @   s  e Zd ZdZdZdZdddddd	d
dddddeeeeddg dddddddddddddeeeedddgd d!d"d#d$d%d&d'd(d)d*d+d,deeeed-d.d/gd dd0d#d$d%d&d'd(d)d*d+d,deeeed-d.d/gd dd1d2d3d4d5d6d7d8d9d:d;d<d=deeeed>gd?dd@dAdBd4dCdDdEdFdGdHdIdeeeedJdKdLgdddMdNdOd%dPdQdRdSdTdUdVdWdeeeedXg dYdZd[id\d]d^d_dd`dadbdcdddedfdWdeeeedggdhdiddjd[dkdld[dkg
Zdmdn ZdoS )prB   a]  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
     a  (?x)^(?:https?://)?
                    (?:(?:(?:www\.|m\.)?soundcloud\.com/
                            (?!stations/track)
                            (?P<uploader>[\w\d-]+)/
                            (?!(?:tracks|albums|sets(?:/.+?)?|reposts|likes|spotlight)/?(?:$|[?#]))
                            (?P<title>[\w\d-]+)
                            (?:/(?P<token>(?!(?:albums|sets|recommended))[^?]+?))?
                            (?:[?].*)?$)
                       |(?:api(?:-v2)?\.soundcloud\.com/tracks/(?P<track_id>\d+)
                          (?:/?\?secret_token=(?P<secret_token>[^&]+))?)
                    )
                    r&   z9http://soundcloud.com/ethmusic/lostin-powers-she-so-heavyZ de9bac153e7427a7333b4b0c1b6a18d2Z62986583ZopuszELostin Powers - She so Heavy (SneakPreview) Adrian Ackers Blueprint 1zNo 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'dzE.T. ExTerrestrial MusicZ1571244iV'vPZ20121011gxa@zall-rights-reservedz?https://i1.sndcdn.com/artworks-000031955188-rwb18x-original.jpgzhttps://soundcloud.com/ethmusic)r   r   r   r   r   r   r   upload_dater   r   r   r   r   r   r   r   r   )r   md5	info_dictzihttps://soundcloud.com/the-concept-band/goldrushed-mastered?in=the-concept-band/sets/the-royal-concept-epZ47127627Z
GoldrushedzNFrom Stockholm Sweden
Povel / Magnus / Filip / David
www.theroyalconcept.comzThe Royal ConceptZ9615865iOZ20120521g)\dl@z'https://soundcloud.com/the-concept-bandz:https://i1.sndcdn.com/artworks-v8bFHhXm7Au6-0-original.jpgZAlternative)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   zDhttps://soundcloud.com/jaimemf/youtube-dl-test-video-a-y-baw/s-8PjrpZ aa0dd32bfea9b0c5ef4f02aacd080604Z	123998367r   u!   Youtube - Dl Test Video '' Ä↭u   test chars:  "'/\ä↭ZjaimeMFZ69767071ixRZ20131209gv#@zhttps://soundcloud.com/jaimemfz5https://a1.sndcdn.com/images/default_avatar_large.pngZ	youtubedlz@https://api.soundcloud.com/tracks/123998367?secret_token=s-8Pjrpz+https://soundcloud.com/the80m/the-followingZ 9ffcddb08c87d74fb5808a3c183a1d04Z	343609555ZwavzThe Following Z80MZ	312384765zhttps://soundcloud.com/the80mZ20170922iYgSx@z?https://i1.sndcdn.com/artworks-000243916348-ktoo7d-original.jpgzDance & EDM)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zBhttps://soundcloud.com/oriuplift/uponly-238-no-talking-wav/s-AyZUdZ 64a60b16e617d41d0bef032b7f55441eZ	340344461zOUplifting Only 238 [No Talking] (incl. Alex Feed Guestmix) (Aug 31, 2017) [wav]z$md5:fa20ee0fca76a3d6df8c7e57f3715366zOri Uplift MusicZ12563093i]YZ20170831gjt@z?https://i1.sndcdn.com/artworks-000240712245-kedn4p-original.jpgz https://soundcloud.com/oriupliftZTrancez5https://soundcloud.com/garyvee/sideways-prod-mad-realZ 59c7872bc44e5d99b7211891664760c2Z	309699954zSideways (Prod. Mad Real)z$md5:d41d8cd98f00b204e9800998ecf8427eZgaryveeZ2366352iYgXZ20170226gMbi@zre:https?://.*\.jpgzhttps://soundcloud.com/garyvee)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zskip_downloadT)r   r   r   paramsz2https://soundcloud.com/giovannisarani/mezzo-valzerZ 8227c3473a4264df6b02ad7e5b7527acZ	583011102zMezzo Valzerz$md5:f4d5f39d52e0ccc2b4f665326428901azGiovanni SaraniZ3352531i{ex\Z20190228g/$f@ZPianoz%https://soundcloud.com/giovannisarani)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zQhttps://soundcloud.com/wandw/the-chainsmokers-ft-daya-dont-let-me-down-ww-remix-1r   zChttps://soundcloud.com/taylorswiftofficial/look-what-you-made-me-doc                 C   s  |  |}|d}i }|rF| jd | }|}|d}|r||d< nBdj|dd  }}|d}|rx|d| 7 }| | j| }| j||d	|| jd
}	|  D ]n}
z| 	|	||W   S  t
k
r } z4t|jtr|jjdks | jddd |j|
_W 5 d }~X Y qX qd S )Nr   r   r   z{}/{}r   r   ro   /zDownloading info JSONr   i  zYou have reached the API rate limit, which is ~600 requests per 10 minutes. Use the --extractor-retries and --retry-sleep options to configure an appropriate retry count and wait timeT)Z	only_once)_match_valid_urlgroupr   r   r   rq   r`   rm   RetryManagerr   r	   rW   rX   r   rY   rZ   error)r   r   r   r   r   Zinfo_json_urlr   ro   Zresolve_titler   retryr_   r   r   r   r    h  s@    




    zSoundcloudIE._real_extractN)	r!   r"   r#   __doc__r$   IE_NAMEr   _TESTSr    r   r   r   r   rB     sn     NrB   c                   @   s   e Zd ZdddZdS )SoundcloudPlaylistBaseIENc           	      C   s   t |d }|dpg }tdd |D sd|rd| j| jd |dddd |D ||d	| jd
}g }|D ]\}t|d}|d}|s|sql| jd | }|r|d| 7 }|| 	|t
 | ql| |||d|dS )Nr   tracksc                 s   s   | ]}| d V  qdS )r   N)r   r:   r   r   r   r   r=     s     z8SoundcloudPlaylistBaseIE._extract_set.<locals>.<genexpr>zDownloading tracks,c                 S   s   g | ]}t |d  qS )r   r   r  r   r   r   r     s     z9SoundcloudPlaylistBaseIE._extract_set.<locals>.<listcomp>)idsZ
playlistIdZplaylistSecretTokenr   r   r   z?secret_token=r   r   )r[   r   r   r`   r   r7   rm   r   r   r   rB   r?   playlist_result)	r   playlistro   playlist_idr  entriestrackr   r   r   r   r   _extract_set  sD     
   z%SoundcloudPlaylistBaseIE._extract_set)N)r!   r"   r#   r  r   r   r   r   r    s   r  c                   @   sR   e Zd ZdZdZddddddd	d
dddddddddddgZdd ZdS )SoundcloudSetIEzuhttps?://(?:(?:www|m)\.)?soundcloud\.com/(?P<uploader>[\w\d-]+)/sets/(?P<slug_title>[:\w\d-]+)(?:/(?P<token>[^?/]+))?zsoundcloud:setzAhttps://soundcloud.com/the-concept-band/sets/the-royal-concept-epZ2284613zThe Royal Concept EPz$md5:71d07087c7a449e8941a70a29e34671er   r   r   r   r   r   Zplaylist_mincountzGhttps://soundcloud.com/the-concept-band/sets/the-royal-concept-ep/tokenTr   z6https://soundcloud.com/discover/sets/weekly::flacmaticz<https://soundcloud.com/discover/sets/charts-top:all-music:dez<https://soundcloud.com/discover/sets/charts-top:hiphoprap:krc                 C   s   |  |}dj|dd }|d}|r6|d| 7 }| j| | j| || jd}d|krdd	 |d D }td
d|| 	||S )Nz
{}/sets/{}r   Z
slug_titlero   r   r   errorsc                 s   s   | ]}t |d  V  qdS error_messageNr   r:   errr   r   r   r=     s     z0SoundcloudSetIE._real_extract.<locals>.<genexpr>z$unable to download video webpage: {}r  )
r   r   r   r`   r   rq   rm   r	   r7   r  )r   r   r   r   ro   r   Zmsgsr   r   r   r      s    

 zSoundcloudSetIE._real_extractNr!   r"   r#   r$   r   r  r    r   r   r   r   r    s.   	r  c                   @   s   e Zd Zdd Zdd ZdS )SoundcloudPagedPlaylistBaseIEc                 C   s   d|||  ||dS )Nr  )_typer   r   r
  )_entries)r   base_urlr	  Zplaylist_titler   r   r   _extract_playlist  s
    
z/SoundcloudPagedPlaylistBaseIE._extract_playlistc           	      #   s   dddd}t  D ]}  D ]z}z* j||| jd|d  d}W  qW q  tk
r } z,t|jtrx|jj	dkrz ||_
W Y q W 5 d }~X Y q X q  fd	d
}|d pg D ]}|||d|dV  q|d}|s q|dd  qd S )N   1r   limitZlinked_partitioningoffsetzDownloading track page r   )r   r   rd   i  c               	      sb   | D ]X}t |tsqt|d}|r |t|r>t nd t|d|d  S qd S )Nr   r   r   )	rW   dictr   r   r   rB   Zsuitabler?   r   )
candidatesZcandr   r<   r   r   resolve_entry  s    
 z=SoundcloudPagedPlaylistBaseIE._entries.<locals>.resolve_entry
collectionr  r  	next_hrefr   )	itertoolscountr   r`   rm   r	   rW   rX   r   rY   r   r   pop)	r   r   r	  r   r   r   responser_   r#  r   r<   r   r    s6       

z&SoundcloudPagedPlaylistBaseIE._entriesN)r!   r"   r#   r  r  r   r   r   r   r    s   r  c                
   @   s   e Zd ZdZdZddddddd	dd
dddddddddddddddddddddddddddddddddgZdddd d!d"d#d$Zd%d& Zd'S )(SoundcloudUserIEad  (?x)
                        https?://
                            (?:(?:www|m)\.)?soundcloud\.com/
                            (?P<user>[^/]+)
                            (?:/
                                (?P<rsrc>tracks|albums|sets|reposts|likes|spotlight)
                            )?
                            /?(?:[?#].*)?$
                    zsoundcloud:userz)https://soundcloud.com/soft-cell-officialZ	207965082zSoft Cell (All)r   r      r  z0https://soundcloud.com/soft-cell-official/trackszSoft Cell (Tracks)   z0https://soundcloud.com/soft-cell-official/albumszSoft Cell (Albums)r   z"https://soundcloud.com/jcv246/setsZ12982173zJordi / cv (Sets)r   z%https://soundcloud.com/jcv246/repostszJordi / cv (Reposts)   z%https://soundcloud.com/clalberg/likesZ11817582zclalberg (Likes)r   z*https://soundcloud.com/grynpyret/spotlightZ7098329zGrynpyret (Spotlight)zstream/users/%szusers/%s/trackszusers/%s/albumszusers/%s/playlistszstream/users/%s/repostszusers/%s/likeszusers/%s/spotlight)r   r  albumssetsr   r   Z	spotlightc              	   C   s~   |  |}|d}| j| | j| |d| jd}|dp@d}| | j| j| |d   t	|
dd|d | S )	Nr   Downloading user infor  Zrsrcr   r   {} ({})r{   )r   r   r`   r   rq   rm   r  r   _BASE_URL_MAPr   r   r   
capitalize)r   r   r   r   r   resourcer   r   r   r    Q  s    

  zSoundcloudUserIE._real_extractNr!   r"   r#   r$   r   r  r3  r    r   r   r   r   r*  	  sl   	4
r*  c                   @   s0   e Zd ZdZdZddddddgZd	d
 ZdS )SoundcloudUserPermalinkIEz/https?://api\.soundcloud\.com/users/(?P<id>\d+)zsoundcloud:user:permalinkz)https://api.soundcloud.com/users/30909869Z30909869Zneilcicr+     r  c                 C   sR   |  |}| j| ||d| jd}| | j d|d  dt|d |dS )Nr1  r  zusers/r   z/tracksr{   )	_match_idr`   r   rm   r  r   r[   r   )r   r   Zuser_idr   r   r   r   r    m  s    
    
 z'SoundcloudUserPermalinkIE._real_extractNr  r   r   r   r   r7  a  s   	r7  c                   @   s0   e Zd ZdZdZddddddgZd	d
 ZdS )SoundcloudTrackStationIEzNhttps?://(?:(?:www|m)\.)?soundcloud\.com/stations/track/[^/]+/(?P<id>[^/?#&]+)zsoundcloud:trackstationz?https://soundcloud.com/stations/track/officialsundial/your-textZ	286017854zTrack station: your textr+  r,   r  c                 C   s\   |  |}| j| ||| jd}| d|d d}| | jd|d  |d|d S )Nr  zsoundcloud:track-stations:(\d+)r   ztrack idzstations/{}/trackszTrack station: {}r   )r9  r`   r   rm   rM   r  r   r   )r   r   Z
track_namer  r   r   r   r   r      s    
   z&SoundcloudTrackStationIE._real_extractNr  r   r   r   r   r:  v  s   	r:  c                   @   s\   e Zd ZdZdZddddddd	dd
dddddddddgZddddZdd ZdS )SoundcloudRelatedIEzjhttps?://(?:(?:www|m)\.)?soundcloud\.com/(?P<slug>[\w\d-]+/[\w\d-]+)/(?P<relation>albums|sets|recommended)zsoundcloud:relatedz;https://soundcloud.com/wajang/sexapil-pingers-5/recommendedZ
1084577272z!Sexapil - Pingers 5 (Recommended)r+  2   r  z6https://soundcloud.com/wajang/sexapil-pingers-5/albumszSexapil - Pingers 5 (Albums)r   z4https://soundcloud.com/wajang/sexapil-pingers-5/setszSexapil - Pingers 5 (Sets)   ztracks/%s/albumsz"tracks/%s/playlists_without_albumsztracks/%s/related)r/  r0  Zrecommendedc              	   C   s   |  |dd\}}| j| | j| |d| jd}|drlt| j dd	dd	 |d D  d
d| 
| j| j| |d   t|d d|dp|| S )NslugrelationzDownloading track infor  r  z	 said: %sr  c                 s   s   | ]}t |d  V  qdS r  r   r  r   r   r   r=     s    z4SoundcloudRelatedIE._real_extract.<locals>.<genexpr>Trx   r   r2  r   )r   r   r`   r   rq   rm   r   r	   r   r7   r  r   r3  r[   r   r4  )r   r   r>  r?  r  r   r   r   r      s$      
 
z!SoundcloudRelatedIE._real_extractNr6  r   r   r   r   r;    s4   r;  c                   @   s2   e Zd ZdZdZddddddd	gZd
d ZdS )SoundcloudPlaylistIEzfhttps?://api(?:-v2)?\.soundcloud\.com/playlists/(?P<id>[0-9]+)(?:/?\?secret_token=(?P<token>[^&]+?))?$zsoundcloud:playlistz,https://api.soundcloud.com/playlists/4110309Z4110309z=TILT Brass - Bowery Poetry Club, August '03 [Non-Site SCR 02]z%re:.*?TILT Brass - Bowery Poetry Clubr  r.  r   r   Zplaylist_countc                 C   sZ   |  |}|d}i }|d}|r.||d< | j| jd | |d|| jd}| ||S )Nr   ro   r   z
playlists/zDownloading playlistr   )r   r   r`   r   rm   r  )r   r   r   r	  r   ro   re   r   r   r   r      s    


   z"SoundcloudPlaylistIE._real_extractNr  r   r   r   r   r@    s   
r@  c                   @   sD   e Zd ZdZdZdZddddddgZd	Zd
Zdd Z	dd Z
dS )SoundcloudSearchIEzsoundcloud:searchzSoundcloud searchZscsearchzscsearch15:post-avant jazzcorezpost-avant jazzcorer+     rA  r  r<  c           	      k   s   t |d| j| j}||ddd t| j| |}tdD ]n}| j	||d| d| j
d}|dpng D ],}|rp| j|d	 t f| j|d
dV  qp|d}|sB qqBd S )Nr  r   r   r  zDownloading page zUnable to download API pager  r$  uriT)r   r%  )minr   _DEFAULT_RESULTS_PER_PAGE_MAX_RESULTS_PER_PAGEr   r   r   r&  r'  r`   rm   r   rB   r?   r   )	r   ZendpointZcollection_idr   r  Znext_urlr   r)  itemr   r   r   _get_collection  s:        
z"SoundcloudSearchIE._get_collectionc              
   C   s6   |  t| jd|||dd|tdkr*d n|||S )Nzsearch/tracks)r  qr   inf)r  r&  islicerI  float)r   r   r   r   r   r   _get_n_results  s      z!SoundcloudSearchIE._get_n_resultsN)r!   r"   r#   r   ZIE_DESCZ_SEARCH_KEYr  rG  rF  rI  rN  r   r   r   r   rB    s   	rB  )'r   r&  rj   r4   commonr   r   Z
networkingr   Znetworking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   Zutils.traversalr   r   r%   rB   r  r  r  r*  r7  r:  r;  r@  rB  r   r   r   r   <module>   s0   <  Z  +5X0