
    yf                        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 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e      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de!      Z" G d de!      Z# G d de!      Z$ G d de!      Z% G d de      Z& G d  d!ee      Z'y)"    N   )InfoExtractorSearchInfoExtractor   
compat_str)HEADRequest)	HTTPError)KNOWN_EXTENSIONSExtractorErrorerror_to_compat_strfloat_or_noneint_or_nonemimetype2extparse_qsstr_or_nonetry_callunified_timestampupdate_url_queryurl_or_noneurlhandle_detect_ext)traverse_objc                   &    e Zd ZdZdgZdddZd Zy)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urlonly_matchingc                     t        |      }|d   d   }|j                  d      }|rt        |d|d   i      }| j                  |      S )Nr   r   secret_token)r   getr   
url_result)selfr   queryapi_urlr   s        =/usr/lib/python3/dist-packages/yt_dlp/extractor/soundcloud.py_real_extractzSoundcloudEmbedIE._real_extract$   sM    ,q/yy0&wa0QRGw''    N)__name__
__module____qualname__
_VALID_URL_EMBED_REGEX_TESTr&    r'   r%   r   r      s$    XJhiL CE(r'   r   c                        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 Zd Z fdZd Zd Zd Zd Zd ZddZed        Z xZS )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   )
minitinysmallbadget67x67larget300x300cropt500x500originalc                 >    | j                   j                  dd|       y )Nr1   	client_id)cachestore)r"   rE   s     r%   _store_client_idz!SoundcloudBaseIE._store_client_idG   s    

{I>r'   c                    | j                  dd       }t        t        j                  d|            D ]J  }| j                  |d d      }|s| j	                  d|dd       }|s2|| _        | j                  |        y  t        d      )	Nr2   z<script[^>]+src="([^"]+)"Ffatalz#client_id\s*:\s*"([0-9a-zA-Z]{32})"z	client id)defaultzUnable to extract client id)_download_webpagereversedrefindall_search_regex
_CLIENT_IDrH   r   )r"   webpagesrcscriptrE   s        r%   _update_client_idz"SoundcloudBaseIE._update_client_idJ   s    (()BDIBJJ'CWMN 		C++CU+CF ..:K / 7	 &/DO)))4		 :;;r'   c                    |j                  d      du }|r|d= |j                  di       j                         }t        d      D ]'  }| j                  |d<   ||d<   	 t	        |   |i |c S  y # t        $ r}t        |j                  t              r>|j                  j                  dv r&| j                  d        | j                          Y d }~|r | j                  t        |             Y d }~ y d }~ww xY w)NrK   Fr#   r   rE   )i  i  )r    copyrangerR   super_download_jsonr   
isinstancecauser
   statusrH   rV   report_warningr   )r"   argskwargs	non_fatalr#   _e	__class__s          r%   r[   zSoundcloudBaseIE._download_jsonX   s    JJw'50	w

7B',,.q 	A!%E+#F7O
w-t>v>>		
 " aggy1aggnn
6R))$/**,''(;A(>? s%   A00	C99AC4C43C44C9c                 N    | j                   j                  dd      xs d| _        y )Nr1   rE    a3e059563d7fd3372b49b37f00a00bcf)rF   loadrR   r"   s    r%   _initialize_pre_loginz&SoundcloudBaseIE._initialize_pre_loginl   s    **//,DjHjr'   c                 *   | j                  | j                  | j                  | j                  z  z  d ddt	        j
                  dd|ii      j                               r#d| | j                  d<   | j                          y | j                  d       y )	NzVerifying login token...Fsessionaccess_token)noterK   datazOAuth Authorizationz<Provided authorization token is invalid. Continuing as guest)
_request_webpage_API_VERIFY_AUTH_TOKEN_API_AUTH_QUERY_TEMPLATErR   jsondumpsencode_HEADERSreport_loginr_   r"   tokens     r%   _verify_oauth_tokenz$SoundcloudBaseIE._verify_oauth_tokeno   s      ++t/L/Lt/^_5UZZ^U,C DELLN ! P 06eW-=DMM/* ^_r'   c                 d      j                   ry t         fd      x}r j                  |       y y )Nc                  T     j                   j                        d   j                  S )Noauth_token)_get_cookies	_BASE_URLvalueri   s   r%   <lambda>z3SoundcloudBaseIE._real_initialize.<locals>.<lambda>|   s!    T%6%6t~~%F}%U%[%[ r'   )rw   r   r{   ry   s   ` r%   _real_initializez!SoundcloudBaseIE._real_initializey   s2    ==[\\5\$$U+ ]r'   c                     |dk7  r t        d| j                  d       d      | j                  ry | j                  |       y )N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_hintrw   r{   )r"   usernamepasswords      r%   _perform_loginzSoundcloudBaseIE._perform_login   sZ    w ++9+=>@JNP P ==  *	r'   c           
         d}d}d}d}d}d}	d}
d}d}d	}d
}d}|}|}dj                  ||||||	|
|fD cg c]  }t        |       c}      }||z   |z   |z   |z   |z   |z   |z   }|}d}d}t        |t        |            D ]&  }|dz	  d|z  dz  z   }|t	        ||         z  }|dz  }( t        |      dz   t        |      z   dz   t        |d      z   dz   t        |      z   }|S c c}w )N!   r   i; u   i@w i  %       0763ed7314c69015fd4a0dc16bbf4b908r3   -i>z r      i :x)joinstrrY   lenordformat)r"   userpwclidaiswulbkcnyrrd   tmIntdphmfouts                            r%   signzSoundcloudBaseIE.sign   s8   . BHHQ1aAq!,DEDc$iEFEAIMA!A%)q#a&! 	AaQUrM*AQqTNAMA	 !fslSV#c)F1cN:S@3q6I
 Fs   C#c           	      
   ! t        d         }d   }t               g  d| j                  i}|r||d<   |sj                  d      r܉j                  d      rt	        | j
                  dz   |z   dz   |      }| j                  ||d	
      xs i j                  d      }	|	r| j                  t        |	      |d	
      }
|
rd|
j                  }j                  |        j                  dt        |
      xs dt        |
j                  j                  d            |ddd       fd}dS !fd	}t        ddd f      D ]9  }|r n4|d   }d }| j!                  d	
      D ]"  }	 | j                  |||| j"                        }$ t'        |t4              sXt7        |j                  d            ! |!      r{j                  !       |j                  d      xs i }|j                  d      }|dk7  rd |v rd}d }t9        |j                  d!            }|r|j;                  d"      d#   }|t<        vrt?        |j                  d$            } |!|d%|d&k(  rd'n||j                  d(      xs d)|v        <  D ]  }d*|d+<   	  s&j                  d,      d-k(  r| jA                  d.       j                  d/      xs i }g }j                  d0      }|xs |j                  d1      }t'        |t               rtC        jD                  | jF                  |      r| jH                  jK                         D ]g  \  }}|tC        jL                  | jF                  d2|z  |      d3}|d4k(  r|sd5}n
|d6k(  rd|d7<   |r|jO                  ||d8       |j                  |       i nd|ig}fd9}i d|d:|j                  d;      d<t9        |j                  d            xs |j                  d=      d>|j                  d?      d@tQ        j                  dA            d|dBj                  dB      dC|dDtS        j                  dD      dE      dFj                  d?      dGj                  dG      dH |dI      dJ |dK      xs  |dL      dM |dN      dO |dP      dQj                  dQ      dR|s S d S # t$        $ r~}t'        |j(                  t*              r>|j(                  j,                  dk(  r%| j/                  dd       |j(                  |_        n| j/                  |j2                         Y d }~d }~ww xY w)TNidtitlerE   r   downloadablehas_downloads_lefttracks/z	/downloadFrJ   redirectUridownloadmp3zContent-Length
   Original)	format_idextfilesizer   qualityformat_notec                     |  xs | v S Nr.   )r   format_urlss    r%   invalid_urlz8SoundcloudBaseIE._extract_info_dict.<locals>.invalid_url   s    70c[00r'   c                    t        j                  d      }|r=|j                         j                         D ]  \  }}| j	                  |      r|| |<    g }|r|j                  |       | j	                  d      }|dk(  r| j                  dddd       dD ]0  }t        | j	                  |            }|s |j                  |       2 |xs t        j                  d	| d
         }|r|j                  d       | j	                  d      }	|	rt        |	      | d<   |dk(  r
|dk(  rdnd}nd}| j                  dj                  |      ||rdnd d       
j                  |        y )Nz.\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?])r   aac   r   Premium)abrr   r   )r   r   z/(?:preview|playlist)/0/30/r   previewr   hlsm3u8m3u8_nativehttprc   i)r   protocol
preference)
rO   search	groupdictitemsr    appendupdater   intr   )r   r   
is_previewmobjr   vformat_id_listr   r   r   formats
stream_urls             r%   
add_formatz7SoundcloudBaseIE._extract_info_dict.<locals>.add_format   sc   99NPZ[D NN,224 !DAq558 !!  N%%h/%%,Ce| #, 
 $ -a)"))!,- !WBII.LaPUh$WG%%i0%%,Cs8%5 %(E\6}!HH XXn5$%,c$ 
 NN1r'   mediatranscodingsc                     t        |d         S )Nr   )r   )rc   r   s     r%   r   z5SoundcloudBaseIE._extract_info_dict.<locals>.<lambda>  s    ;WXY^W_K` r'   r   r#   headersi  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)	only_oncer   r   r   z/hlspresetrc   r   	mime_type)r   r   progressiver   snippedz	/preview/nonevcodecpolicyBLOCK)metadata_availabler   artwork_url
avatar_urlz-%s.jpg)r   r   r;      rC   r   )widthheightc                 >    t        j                  d| z              S )Nz%s_count)r   r    )keyinfos    r%   extract_countz:SoundcloudBaseIE._extract_info_dict.<locals>.extract_countY  s    txx
S(89::r'   uploaderr   uploader_id	permalinkuploader_urlpermalink_url	timestamp
created_atdescription
thumbnailsdurationi  webpage_urllicense
view_countplayback
like_countfavoritingslikescomment_countcommentrepost_countrepostsgenrer   )F)*r   setrR   r    r   _API_V2_BASEr[   rq   r	   r   addr   r   r   r   r   RetryManagerrw   r   r\   r]   r
   r^   r_   errormsgdictr   r   splitr   r   raise_geo_restrictedrO   r   _IMAGE_REPL_RE_ARTWORK_MAPr   subr   r   r   )"r"   r   
full_titler   extract_flattrack_idr   r#   download_urlredirect_urlurlh
format_urlr   r   r   streamretryrd   stream_formatr   r   r   r   r   r  r   	thumbnailimage_idsizer   r   r   r   r   s"    `                             @@@r%   _extract_info_dictz#SoundcloudBaseIE._extract_info_dict   s   d4j)Wedoo.$0E.! 8TXXFZ=[+!!I-8;FOL //he/TZXZ__`mnL,,-xu - F!%JOOJ/NN%/3D9BU$/0@0@AQ0R$S)#%'1$ 	1#	L dWn>`$ab '	?A5JF***7 3
3!00XU\`\i\i0jF3 fd+$VZZ%67J:&OOJ'EE(O1rM$((4H5 Vz%9 C x1Fll3'***"=#4#4[#AB! "]2vi =K:$=	?G'	?R  	!A AhK	! 488H-8%%%>xx%2
hh}-9488L#9	i,yy,,i8&*&7&7&=&=&? )NHd&!vvd&9&99x;OQZ[A  6)+!!Z/*,,%)&*"  %%a()   %i01
	;
(
,
 ;txx~6O$((;:O
 DHH_5	

 *488L+AB
 U
 488M2
 *
 dhhz&:DA
 488O4
 txx	*
 -
3
 -6P-:P
 ]95
 M)4
  TXXg&!
" lw#
 	
" 9=#
 	
E & 3!!''95!''..C:O++T_c , e '(gg++AEE23s   *S	U
A3UU
c                 &    | j                   dz   |z   S )Nzresolve?url=)r  )clsr   s     r%   _resolv_urlzSoundcloudBaseIE._resolv_urlp  s    .0366r'   )NNF)r(   r)   r*   _NETRC_MACHINEr  r   _USER_AGENTrs   _API_AUTH_URL_PWrr   rw   r  r  rH   rV   r[   rj   r{   r   r   r   r*  classmethodr-  __classcell__)re   s   @r%   r0   r0   -   s    !N3L)I HK.TPH)N L?<(k`,(VBc
J 7 7r'   r0   c                   b   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dddddddddddeeeedddddddd d!d"d#d$d%deeeeddd&ddddd d!d"d#d$d%deeeeddd'd(d)d*d+dd,d-d.d*d/d0d1d2d3d4d5deeeeddd6d7d8dd9d:d;d<d=d>d?d@deeeedAdBdCidDdEdFdGddHdIdJdKdLdMdNd@deeeedAddOdCdPdQdCdPg
ZdR ZyS)TSoundcloudIEa]  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>[^&]+))?)
                    )
                    r1   z9http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy ebef0a451b909710ed1d7787dddbf0d762986583r   zELostin 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 Music1571244iV'vP20121011gxa@zall-rights-reserved)r   r   r   r  r   r   r   upload_dater  r  r  r	  r  r  )r   md5	info_dictzihttps://soundcloud.com/the-concept-band/goldrushed-mastered?in=the-concept-band/sets/the-royal-concept-ep47127627
GoldrushedzNFrom Stockholm Sweden
Povel / Magnus / Filip / David
www.theroyalconcept.comzThe Royal Concept9615865iO20120521g)\dl@)r   r;  zDhttps://soundcloud.com/jaimemf/youtube-dl-test-video-a-y-baw/s-8Pjrp aa0dd32bfea9b0c5ef4f02aacd080604	123998367u!   Youtube - Dl Test Video '' Ä↭u   test chars:  "'/\ä↭jaimeMF69767071ixR20131209gv#@z@https://api.soundcloud.com/tracks/123998367?secret_token=s-8Pjrpz+https://soundcloud.com/the80m/the-following 9ffcddb08c87d74fb5808a3c183a1d04	343609555wav)r   r   zBhttps://soundcloud.com/oriuplift/uponly-238-no-talking-wav/s-AyZUd 64a60b16e617d41d0bef032b7f55441e	340344461zOUplifting Only 238 [No Talking] (incl. Alex Feed Guestmix) (Aug 31, 2017) [wav]z$md5:fa20ee0fca76a3d6df8c7e57f3715366zOri Uplift Music12563093i]Y20170831gjt@z5https://soundcloud.com/garyvee/sideways-prod-mad-real 59c7872bc44e5d99b7211891664760c2	309699954zSideways (Prod. Mad Real)z$md5:d41d8cd98f00b204e9800998ecf8427egaryvee2366352iYgX20170226gMbi@zre:https?://.*\.jpg)r   r   r   r  r   r   r   r9  r  r'  r  r  r	  r  r  skip_downloadT)r   r:  r;  paramsz2https://soundcloud.com/giovannisarani/mezzo-valzer e22aecd2bc88e0e4e432d7dcc0a1abf7	583011102zMezzo Valzerz$md5:4138d582f81866a530317bae316e8b61Micronie3352531i{ex\20190228g/$f@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                    | j                  |      }|j                  d      }i }|r-| j                  dz   |z   }|}|j                  d      }|rV||d<   nPd|j                  dd      z  x}}|j                  d      }|r|d|z  z  }| j                  | j                  |z         }| j                  ||d	|| j                  
      }	| j                  |	||      S )Nr  r   r   z%s/%sr   r   rz   z/%szDownloading info JSONr   )_match_valid_urlgroupr  r-  r   r[   rw   r*  )
r"   r   r   r  r#   info_json_urlr  rz   resolve_titler   s
             r%   r&   zSoundcloudIE._real_extract6  s    $$S)::j) --	9HDM!JJJ~.E(-n%)04::j'3R)RRJJJw'E. ,,T^^m-KLM"":'>eUYUbUb # d &&tZ??r'   N)	r(   r)   r*   __doc__r+   IE_NAMEr   _TESTSr&   r.   r'   r%   r4  r4  u  s   	J G O5 `  l6(')#0!!!$ #	
,  %s/(')#0!!!$ #	
* Z5!>:%)')!0!!!$ #	
, V5!>:%)')!0!!!$ #	
, A5!	
 X5!jE.)')$0!!!$ #	
, K5!4E%(')#30!!!$ #$  )	
2 H5!'E&(')#30!!!$ #	
. g!	
 Y!	
IiFV@r'   r4  c                       e Zd ZddZy)SoundcloudPlaylistBaseIENc                    t        |d         }|j                  d      xs g }t        |D cg c]  }|j                  d       c}      s\|rZ| j                  | j                  dz   |ddj                  |D cg c]  }t        |d          c}      ||d| j                        }g }|D ]  }t        |j                  d            }|j                  d      }	|	s|s3| j                  dz   |z   }	|r|	d	|z   z  }	|j                  | j                  |	t        j                         |              | j                  |||j                  d
      |j                  d            S c c}w c c}w )Nr   tracksr   zDownloading tracks,)ids
playlistIdplaylistSecretTokenr   r   z?secret_token=r   r  )r   r    allr[   r  r   rw   r   r   r!   r4  ie_keyplaylist_result)
r"   playlistrz   playlist_idrc  r   entriestrackr  r   s
             r%   _extract_setz%SoundcloudPlaylistBaseIE._extract_setP  sh    $0h'-2F;qAEE/*;<((!!H,k$88&$IQZ$%8$IJ"-+0-  == ) *F  
	7E"599T?3H))O,C'')3h>+e33CNN4??\((*H6 7
	7 ##[LL!LL') 	)) < %Js   E#8E(r   )r(   r)   r*   ro  r.   r'   r%   ra  ra  O  s    )r'   ra  c                   P    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 Zy)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-ep2284613zThe Royal Concept EPz$md5:71d07087c7a449e8941a70a29e34671er   r   r  r   r   r;  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                 v   | j                  |      }d|j                  dd      z  }|j                  d      }|r|d|z   z  }| j                  | j                  | j                  |z         || j
                        }d|v r)d |d   D        }t        d	d
j                  |      z        | j                  ||      S )Nz
%s/sets/%sr   
slug_titlerz   /r   errorsc              3   8   K   | ]  }t        |d            ywerror_messageNr   .0errs     r%   	<genexpr>z0SoundcloudSetIE._real_extract.<locals>.<genexpr>  s     OJs?34O   z$unable to download video webpage: %srd  )	rY  rZ  r[   r-  r   rw   r   r   ro  )r"   r   r   r  rz   r   msgss          r%   r&   zSoundcloudSetIE._real_extract  s    $$S)!DJJz<$HH


7##+%J""4#3#3NNZ'$)*4dmm # M tOXOD !G#((SW.!XYY  u--r'   Nr(   r)   r*   r+   r^  r_  r&   r.   r'   r%   rq  rq  m  sn     JJGR+A

  Y H N N#F,.r'   rq  c                       e Zd Zd Zd Zy)SoundcloudPagedPlaylistBaseIEc                 0    d||| j                  ||      dS )Nrk  )_typer   r   rm  )_entries)r"   base_urlrl  playlist_titles       r%   _extract_playlistz/SoundcloudPagedPlaylistBaseIE._extract_playlist  s#    #}}X{;	
 	
r'   c              #   0   K   dddd}t        j                         D ]  } j                         D ]*  }	  j                  ||| j                  d|dz          } n  fd	}d
   xs g D ],  } |||j                  d      |j                  d             . |j                  d      }|s y |j                  dd         y # t
        $ rE}t        |j                  t              r|j                  j                  dk7  r ||_
        Y d }~d }~ww xY ww)N   1r   limitlinked_partitioningoffsetzDownloading track page r   )r#   r   rn   i  c            
      :   | D ]  }t        |t              st        |j                  d            }|s1j	                  |t
        j                  |      rt
        j                         nd t        |j                  d            |j                  d            c S  y )Nr   r   r   )	r\   r  r   r    r!   r4  suitableri  r   )
candidatescandr   r"   s      r%   resolve_entryz=SoundcloudPagedPlaylistBaseIE._entries.<locals>.resolve_entry  s    & LD%dD1 $/0I$JM$#)5A5J5J=5YL//1_c'7'9J L LLr'   
collectionrn  rk  	next_hrefr  )	itertoolscountr  r[   rw   r   r\   r]   r
   r^   r  r    pop)	r"   r   rl  r#   r   r%  responserd   r  s	   `        r%   r  z&SoundcloudPagedPlaylistBaseIE._entries  s)     #&
 "  	&A**, #22[t}}6q1ug>  3  @H 	L l+1r J#AquuW~quuZ7HIIJ ,,{+CIIh%A 	& &  &aggy9QWW^^s=R"#EKs/   1D&CA*D	D;D	DDDN)r(   r)   r*   r  r  r.   r'   r%   r  r    s    
)&r'   r  c            
           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% Zy&)'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-official	207965082zSoft Cell (All)r   r      rt  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/sets12982173zJordi / cv (Sets)r   z%https://soundcloud.com/jcv246/repostszJordi / cv (Reposts)   z%https://soundcloud.com/clalberg/likes11817582zclalberg (Likes)r   z*https://soundcloud.com/grynpyret/spotlight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)rh  rc  albumssetsr  r  	spotlightc                    | j                  |      }|j                  d      }| j                  | j                  | j                  |z         |d| j
                        }|j                  d      xs d}| j                  | j                  | j                  |   |d   z  z   t        |j                  d            |d   d|j                         d	      S )
Nr   Downloading user infory  rsrcrh  r   r    ())rY  rZ  r[   r-  r   rw   r  r  _BASE_URL_MAPr   r    
capitalize)r"   r   r   r   r   resources         r%   r&   zSoundcloudUserIE._real_extract  s    $$S)::f%""T^^h67-t}} # F ::f%.%% 2 28 <tDz II'j)8+>+>+@AC 	Cr'   Nr(   r)   r*   r+   r^  r_  r  r&   r.   r'   r%   r  r    s    J  G:&
   B)
   B)
  4(
  7+
  7'
  <,
 U1Fh !##$,!)MCr'   r  c                   .    e Zd ZdZdZddddddgZd	 Zy
)SoundcloudUserPermalinkIEz/https?://api\.soundcloud\.com/users/(?P<id>\d+)zsoundcloud:user:permalinkz)https://api.soundcloud.com/users/3090986930909869neilcicr  r   rt  c                     | j                  |      }| j                  | j                  |      |d| j                        }| j	                  | j
                   d|d    t        |d         |j                  d            S )Nr  ry  zstream/users/r   r   )	_match_idr[   r-  rw   r  r  r   r    )r"   r   user_idr   s       r%   r&   z'SoundcloudUserPermalinkIE._real_extract1  s    ..%""S!7,CT]] # \ %%  !tDzl;Sd_dhhWaNbd 	dr'   Nr  r.   r'   r%   r  r  %  s1    CJ)G:
   Fdr'   r  c                   .    e Zd ZdZdZddddddgZd	 Zy
)SoundcloudTrackStationIEzNhttps?://(?:(?:www|m)\.)?soundcloud\.com/stations/track/[^/]+/(?P<id>[^/?#&]+)zsoundcloud:trackstationz?https://soundcloud.com/stations/track/officialsundial/your-text	286017854zTrack station: your textr  r7   rt  c                    | j                  |      }| j                  | j                  |      || j                        }| j	                  d|d   d      }| j                  | j                  d|d   z  z   |d|d   z        S )Nry  zsoundcloud:track-stations:(\d+)r   ztrack idzstations/%s/trackszTrack station: %sr   )r  r[   r-  rw   rQ   r  r  )r"   r   
track_namern  r  s        r%   r&   z&SoundcloudTrackStationIE._real_extractF  s    ^^C(
##D$4$4S$9:t}}#]%%.dZI %% 4uT{ BB)E'N:< 	<r'   Nr  r.   r'   r%   r  r  :  s0    bJ'GP/
   F	<r'   r  c                   Z    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 Zy)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/recommended
1084577272z!Sexapil - Pingers 5 (Recommended)r  2   rt  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  r  recommendedc                    | j                  |      j                  dd      \  }}| j                  | j                  | j                  |z         |d| j
                        }|j                  d      r6t        | j                   ddj                  d |d   D              z  d	
      | j                  | j                  | j                  |   |d   z  z   t        |d         |j                  d      xs |d|j                         d      S )NslugrelationzDownloading track infory  rz  z	 said: %srd  c              3   8   K   | ]  }t        |d            ywr|  )r   r~  s     r%   r  z4SoundcloudRelatedIE._real_extract.<locals>.<genexpr>z  s#      GF.1C()GFr  Tr   r   r   r  r  )rY  rZ  r[   r-  r   rw   r    r   r^  r   r  r  r  r   r  )r"   r   r  r  rn  s        r%   r&   z!SoundcloudRelatedIE._real_extractr  s   ..s399&*Mh##T^^d23*DMM $ C 99X DLL>!;chh GF5:8_GF ?F "FPTV V %% 2 28 <uT{ JJCPUVZP[L\7+3t3X5H5H5JKM 	Mr'   Nr  r.   r'   r%   r  r  R  sy    ~J"GL8
   H3
  F1
 F0 %4*MMr'   r  c                   0    e Zd ZdZdZddddddd	gZd
 Zy)SoundcloudPlaylistIEzfhttps?://api(?:-v2)?\.soundcloud\.com/playlists/(?P<id>[0-9]+)(?:/?\?secret_token=(?P<token>[^&]+?))?$zsoundcloud:playlistz,https://api.soundcloud.com/playlists/41103094110309z=TILT Brass - Bowery Poetry Club, August '03 [Non-Site SCR 02]z%re:.*?TILT Brass - Bowery Poetry Clubrs  r  r   r;  playlist_countc                     | j                  |      }|j                  d      }i }|j                  d      }|r||d<   | j                  | j                  dz   |z   |d|| j                        }| j                  ||      S )Nr   rz   r   z
playlists/zDownloading playlistr   )rY  rZ  r[   r  rw   ro  )r"   r   r   rl  r#   rz   ro   s          r%   r&   z"SoundcloudPlaylistIE._real_extract  s    $$S)jj&

7#$)E.!"",{:/udmm # U   u--r'   Nr  r.   r'   r%   r  r    s3    zJ#G=UB

  F.r'   r  c                   @    e Zd ZdZdZdZddddddgZd	Zd
Zd Z	d Z
y)SoundcloudSearchIEzsoundcloud:searchzSoundcloud searchscsearchzscsearch15:post-avant jazzcorezpost-avant jazzcorer     r  r  r  c           
   +     K   t        |j                  d| j                        | j                        }|j	                  |ddd       t        | j                  |z   |      }t        j                  d      D ]  }| j                  ||d| d| j                        }|j                  d      xs g D ]A  }|s | j                  |d	   t        j                         fi | j                  |d
       C |j                  d      }|r y  y w)Nr  r   r   r  zDownloading page zUnable to download API pagery  r  uriT)r  r  )minr    _DEFAULT_RESULTS_PER_PAGE_MAX_RESULTS_PER_PAGEr   r   r  r  r  r[   rw   r!   r4  ri  r*  )	r"   endpointcollection_idr#   r  next_urlr   r  items	            r%   _get_collectionz"SoundcloudSearchIE._get_collection  s$    IIgt==>&&( 	#$
 	
 $D$5$5$@%H# 	A**-+<QC)@-t}} + FH !\28b p)$//U\%8%8%:p>B>U>UVZim>U>np pp
  ||K0H	s   B4D7AD	Dc           
          | j                  t        j                  | j                  d|||      d|t	        d      k(  rd n|      ||      S )Nzsearch/tracks)r  qr   inf)rj  r  islicer  float)r"   r#   r   s      r%   _get_n_resultsz!SoundcloudSearchIE._get_n_results  sR    ##I$4$4  %qE JqE%L(ta%127@ 	@r'   N)r(   r)   r*   r^  IE_DESC_SEARCH_KEYr_  r  r  r  r  r.   r'   r%   r  r    sI    !G!GK/'*
  F   "2@r'   r  )(r  rt   rO   commonr   r   compatr   
networkingr	   networking.exceptionsr
   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r0   r4  ra  rq  r  r  r  r  r  r  r  r.   r'   r%   <module>r     s      	 6  $ -    +( ($E7} E7P
W@# W@t)/ )<(.. (.V2&$4 2&jUC4 UCpd = d*<< <0-M7 -M`.3 .:,@)+> ,@r'   