U
    $Pf|u                     @   s  d dl mZ d dlZd dlZddlmZmZ ddlmZm	Z	m
Z
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 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 )    )unicode_literalsN   )InfoExtractorSearchInfoExtractor   )compat_HTTPErrorcompat_kwargs
compat_strcompat_urlparse)error_to_compat_strExtractorErrorfloat_or_noneHEADRequestint_or_noneKNOWN_EXTENSIONSmimetype2extstr_or_nonetry_getunified_timestampupdate_url_queryurl_or_noneurlhandle_detect_extc                   @   s.   e Zd ZdZdddZedd Zdd Zd	S )
SoundcloudEmbedIEzDhttps?://(?:w|player|p)\.soundcloud\.com/player/?.*?\burl=(?P<id>.+)zhttps://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   dd t d| D S )Nc                 S   s   g | ]}| d qS r   )group).0m r   C/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/soundcloud.py
<listcomp>,   s     z3SoundcloudEmbedIE._extract_urls.<locals>.<listcomp>zQ<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?(?:w\.)?soundcloud\.com/player.+?)\1)refinditer)webpager   r   r    _extract_urls*   s    
zSoundcloudEmbedIE._extract_urlsc                 C   sH   t t |j}|d d }|d}|r>t|d|d i}| |S )Nr   r   secret_token)r
   parse_qsurlparsequerygetr   
url_result)selfr   r)   Zapi_urlr&   r   r   r    _real_extract0   s    

zSoundcloudEmbedIE._real_extractN)__name__
__module____qualname__
_VALID_URLZ_TESTstaticmethodr%   r-   r   r   r   r    r   "   s   
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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/d0d1eeeeddd2d3d4d5d6d7d8d9d:d;d<deeeeddd=d>d?dd@dAdBdCdDdEdFdGdeeeedHdIdJidKdLdMdNddOdPdQdRdSdTdUdGdeeeedHddVdJdWg	ZdXZdYZ	dZZ
d[d\d]d^d_d`dadbdcddde
Zdfdg Zdhdi Z fdjdkZdldm Zedndo ZdudqdrZdsdt Z  ZS )v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
     aE  (?x)^(?:https?://)?
                    (?:(?:(?:www\.|m\.)?soundcloud\.com/
                            (?!stations/track)
                            (?P<uploader>[\w\d-]+)/
                            (?!(?:tracks|albums|sets(?:/.+?)?|reposts|likes|spotlight)/?(?:$|[?#]))
                            (?P<title>[\w\d-]+)/?
                            (?P<token>[^?]+?)?(?:[?].*)?$)
                       |(?:api(?:-v2)?\.soundcloud\.com/tracks/(?P<track_id>\d+)
                          (?:/?\?secret_token=(?P<secret_token>[^&]+))?)
                    )
                    
soundcloudz9http://soundcloud.com/ethmusic/lostin-powers-she-so-heavyZ ebef0a451b909710ed1d7787dddbf0d7Z62986583mp3zELostin 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-reserved)idexttitledescriptionuploaderuploader_id	timestampupload_datedurationlicense
view_count
like_countcomment_countrepost_count)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@)r   rE   zDhttps://soundcloud.com/jaimemf/youtube-dl-test-video-a-y-baw/s-8PjrpZ aa0dd32bfea9b0c5ef4f02aacd080604Z	123998367u!   Youtube - Dl Test Video '' Ä↭u   test chars:  "'/\ä↭ZjaimeMFZ69767071ixRZ20131209gv#@z@https://api.soundcloud.com/tracks/123998367?secret_token=s-8Pjrpz,https://soundcloud.com/oddsamples/bus-brakesZ 7624f2351f8a3b2e7cd51522496e7631Z	128590877z
Bus Brakesz$md5:0053ca6396e8d2fd7b7e1595ef12ab66Z
oddsamplesZ73680509iRZ20140109gjtX1@zcc-by-sazBhttps://soundcloud.com/oriuplift/uponly-238-no-talking-wav/s-AyZUdZ 64a60b16e617d41d0bef032b7f55441eZ	340344461ZwavzOUplifting Only 238 [No Talking] (incl. Alex Feed Guestmix) (Aug 31, 2017) [wav]z$md5:fa20ee0fca76a3d6df8c7e57f3715366zOri Uplift MusicZ12563093i]YZ20170831gjt@z5https://soundcloud.com/garyvee/sideways-prod-mad-realZ 59c7872bc44e5d99b7211891664760c2Z	309699954zSideways (Prod. Mad Real)z$md5:d41d8cd98f00b204e9800998ecf8427eZgaryveeZ2366352iYgXZ20170226gMbi@zre:https?://.*\.jpg)r6   r7   r8   r9   r:   r;   r<   r=   r>   	thumbnailr?   r@   rA   rB   rC   Zskip_downloadT)r   rD   rE   paramsz2https://soundcloud.com/giovannisarani/mezzo-valzerZ e22aecd2bc88e0e4e432d7dcc0a1abf7Z	583011102zMezzo Valzerz$md5:4138d582f81866a530317bae316e8b61ZMicronieZ3352531i{ex\Z20190228g/$f@zQhttps://soundcloud.com/wandw/the-chainsmokers-ft-daya-dont-let-me-down-ww-remix-1r   zhttps://api-v2.soundcloud.com/https://soundcloud.com/z-([0-9a-z]+)\.jpg          /   C   d   i,  i  i  r   )
ZminitinysmallZbadgeZt67x67ZlargeZt300x300ZcropZt500x500originalc                 C   s   | j jdd| d S )Nr4   	client_id)_downloadercachestore)r,   rR   r   r   r    _store_client_id  s    zSoundcloudIE._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 )	NrH   z<script[^>]+src="([^"]+)"Ffatalz#client_id\s*:\s*"([0-9a-zA-Z]{32})"z	client id)defaultzUnable to extract client id)Z_download_webpagereversedr"   findall_search_regex
_CLIENT_IDrV   r   )r,   r$   srcscriptrR   r   r   r    _update_client_id  s      
zSoundcloudIE._update_client_idc                    s   | ddk}|r|d= | di  }tdD ]}| j|d< ||d< ztt| j|t|W   S  tk
r } zZt	|j
tr|j
jdkr| d  |   W Y *q0n |r| jt| W Y  dS  W 5 d }~X Y q0X q0d S )NrX   Fr)   r   rR   i  )r*   copyranger]   superr3   _download_jsonr   r   
isinstancecauser   coderV   r`   rS   Zreport_warningr   )r,   argskwargsZ	non_fatalr)   _e	__class__r   r    rd   #  s$    


zSoundcloudIE._download_jsonc                 C   s   | j jddpd| _d S )Nr4   rR   Z YUKXoArFcqrlQn9tfNHvvyfnDISj04zk)rS   rT   loadr]   r,   r   r   r    _real_initialize7  s    zSoundcloudIE._real_initializec                 C   s   t jd | S )Nzresolve?url=)r3   _API_V2_BASE)clsr   r   r   r    _resolv_url:  s    zSoundcloudIE._resolv_urlNc                    s  t d }d }t  g d| ji}|r4||d< dr҈drt| jd | d |}| j||d	d
pri d}|r| jt||d	d
}	|	r|		 }
 
|
 dt|	pdt|	jd|
dd  fdd}dEfdd	}tdd tpg }|D ]}t|tsqt|d}
|
s6q| j|
||d	d}t|tsXqt|d|rtq 
 |dpi }|d}|dkrd|
krd}d }t|d}|r|dd }|tkrt|d }||d!|d"krd#n||d$pd%|
k qD ]}d&|d'< q&sTd(d)krT|   |  d*pli }g }d+}|p|d,}t|t r,t| j|r"| j D ]l\}}|t| jd-| |d.}|d/kr|sd0}n|d1krd|d2< |r| ||d3 || qn
d|ig}fd4d5}||d6t|dpZ|d7|d8t!d9|d:|t"d;d<d8d=|d>|d?p|d@|dA|dBdCdDS )FNr6   r8   rR   r&   ZdownloadableZhas_downloads_lefttracks/z	/downloadFrW   ZredirectUridownloadr5   zContent-Length
   )	format_idr7   filesizer   
preferencec                    s   |  p|  kS )Nr   r   )format_urlsr   r    invalid_urlZ  s    z4SoundcloudIE._extract_info_dict.<locals>.invalid_urlc           
         s  t d}|r8|  D ]\}}| |s|| |< qg }|rJ|| | d}|dkrdd| d< dD ]}| |}|rh|| qh|pt d| d }|r|d	 | d}	|	rt|	| d< |d
kr|dkrdnd}nd}| d|||rdnd d  |  d S )Nz.\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?])r7   ZaacZ256abr)r7   r|   z/(?:preview|playlist)/0/30/r   previewhlsZm3u8Zm3u8_nativehttprj   i)rw   protocolry   )	r"   search	groupdictitemsr*   appendintupdatejoin)
fr   Z
is_previewmobjkvZformat_id_listr7   r}   r|   )formats
stream_urlr   r    
add_format]  s<    







z3SoundcloudIE._extract_info_dict.<locals>.add_formatc                 S   s   | d d S )NZmediatranscodingsr   )xr   r   r    <lambda>      z1SoundcloudIE._extract_info_dict.<locals>.<lambda>r   )r)   rX   formatr   r~   z/hlspresetrj   r   Z	mime_type)r   r7   Zprogressiver   Zsnippedz	/preview/noneZvcodecpolicyZBLOCKuserartwork_urlZ
avatar_urlz-%s.jpg)r6   r   rO      rQ   ry   )widthheightc                    s   t  d|  S )Nz%s_count)r   r*   )key)infor   r    extract_count  s    z6SoundcloudIE._extract_info_dict.<locals>.extract_countusernameZ	permalinkpermalink_urlZ
created_atr9   r>   i  r?   ZplaybackZfavoritingslikescommentrepostsgenre)r6   r:   r;   Zuploader_urlr<   r8   r9   
thumbnailsr>   Zwebpage_urlr?   r@   rA   rB   rC   r   r   )F)#r	   setr]   r*   r   rq   rd   Z_request_webpager   geturladdr   r   r   headersr   listre   dictr   r   splitr   r   Zraise_geo_restrictedZ_sort_formatsr"   r   _IMAGE_REPL_RE_ARTWORK_MAPr   subr   r   r   )r,   r   
full_titler&   track_idr8   r)   download_urlZredirect_urlZurlhZ
format_urlr{   r   r   tstreamZstream_formatr   r7   r   r   r   r   r   rF   Zimage_idsizeir   r   )rz   r   r   r   r    _extract_info_dict>  s    
   

"  
   







zSoundcloudIE._extract_info_dictc           
      C   s   t | j|}|d}i }|rJ| jd | }|}|d}|r||d< n>d|dd  }}|d}|rx|d| 7 }| | j| }| j||d	|d
}	| |	||S )Nr   rt   r&   z%s/%sr:   r8   tokenz/%szDownloading info JSONr)   )	r"   matchr1   r   rq   rs   	_BASE_URLrd   r   )
r,   r   r   r   r)   Zinfo_json_urlr   r   Zresolve_titler   r   r   r    r-     s*    



   zSoundcloudIE._real_extract)NN)r.   r/   r0   __doc__r1   IE_NAMEr   _TESTSrq   r   r   r   rV   r`   rd   rp   classmethodrs   r   r-   __classcell__r   r   rl   r    r3   :   sh     3

 r3   c                   @   s   e Zd ZdddZdS )SoundcloudPlaylistBaseIENc           	      C   s   t |d }|dpg }tdd |D s`|r`| j| jd |dddd |D ||dd	}g }|D ]\}t|d}|d
}|s|sqh| jd | }|r|d| 7 }|| |t	
 | qh| |||d|dS )Nr6   tracksc                 S   s   g | ]}| d qS )r   )r*   r   r   r   r   r    r!     s     z9SoundcloudPlaylistBaseIE._extract_set.<locals>.<listcomp>zDownloading tracks,c                 S   s   g | ]}t |d  qS )r6   r	   r   r   r   r    r!     s     )idsZ
playlistIdZplaylistSecretTokenr   r   rt   z?secret_token=r8   r9   )r	   r*   allrd   rq   r   r   r   r+   r3   ie_keyplaylist_result)	r,   playlistr   playlist_idr   entriestrackr   r   r   r   r    _extract_set  sB     
   z%SoundcloudPlaylistBaseIE._extract_set)N)r.   r/   r0   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gZdd ZdS )SoundcloudSetIEzthttps?://(?:(?: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r6   r8   r9      r   rE   Zplaylist_mincountzGhttps://soundcloud.com/the-concept-band/sets/the-royal-concept-ep/tokenTr   c                 C   s   t | j|}d|dd }|d}|r8|d| 7 }| | | j| |}d|kr|dd |d D }td	d
| | 	||S )Nz
%s/sets/%sr:   Z
slug_titler   /errorsc                 s   s   | ]}t |d  V  qdS )error_messageNr   )r   errr   r   r    	<genexpr>)  s     z0SoundcloudSetIE._real_extract.<locals>.<genexpr>z$unable to download video webpage: %sr   )
r"   r   r1   r   rd   rs   r   r   r   r   )r,   r   r   r   r   r   Zmsgsr   r   r    r-     s    
zSoundcloudSetIE._real_extractNr.   r/   r0   r1   r   r   r-   r   r   r   r    r     s   	r   c                   @   s   e Zd Zdd ZdS )SoundcloudPagedPlaylistBaseIEc                    s   ddd}|  }d|d< |}g }t D ]} j||d|d  |d}	|	d	 }
t|
ts^g }
 fd
d}|
D ],}|||d|df}|rn|| qn|	d}|s q|	d }t	|}t
|j}|| q*d|||dS )N   1)limitlinked_partitioningr   offsetzDownloading track page %sr   r   
collectionc              	      sb   | D ]X}t |tsqt|d}|s(q |t|r@t nd t|d|d  S d S )Nr   r6   r8   )	re   r   r   r*   r+   r3   Zsuitabler   r   )
candidatesZcandr   ro   r   r    resolve_entryK  s    
 zFSoundcloudPagedPlaylistBaseIE._extract_playlist.<locals>.resolve_entryr   r   	next_href)_typer6   r8   r   )ra   	itertoolscountrd   re   r   r*   r   r
   r(   r'   r)   r   )r,   base_urlr   playlist_titleZCOMMON_QUERYr)   r   r   r   responser   r   rk   entryZparsed_next_hrefr   ro   r    _extract_playlist0  sD     
 


z/SoundcloudPagedPlaylistBaseIE._extract_playlistN)r.   r/   r0   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)r6   r8      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   ZalbumsZsetsr   r   Z	spotlightc                 C   s|   t | j|}|d}| | | j| |d}|dp>d}| | j| j	| |d   t
|dd|d | f S )Nr   zDownloading user infoZrsrcr   r6   z%s (%s)r   )r"   r   r1   r   rd   rs   r   r   rq   _BASE_URL_MAPr   r*   
capitalize)r,   r   r   r:   r   resourcer   r   r    r-     s    
 zSoundcloudUserIE._real_extractN)r.   r/   r0   r1   r   r   r   r-   r   r   r   r    r   m  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 )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   rL   r   c                 C   sR   |  |}| | ||}| d|d d}| | jd|d   |d|d  S )Nzsoundcloud:track-stations:(\d+)r6   ztrack idzstations/%s/trackszTrack station: %sr8   )Z	_match_idrd   rs   r\   r   rq   )r,   r   Z
track_namer   r   r   r   r    r-     s    
   
z&SoundcloudTrackStationIE._real_extractNr   r   r   r   r    r     s   	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   rE   Zplaylist_countc                 C   sZ   t | j|}|d}i }|d}|r2||d< | j| jd | |d|d}| ||S )Nr6   r   r&   z
playlists/zDownloading playlistr   )r"   r   r1   r   rd   rq   r   )r,   r   r   r   r)   r   datar   r   r    r-     s    

  z"SoundcloudPlaylistIE._real_extractNr   r   r   r   r    r     s   
r   c                   @   sJ   e Zd ZdZdZedZdddiddgZd	Zd
Z	dZ
dd Zdd ZdS )SoundcloudSearchIEzsoundcloud:searchzSoundcloud searchinfzscsearch15:post-avant jazzcorer8   zpost-avant jazzcore   r   Zscsearchr   2   c                 k   s   t |d| j| j}||ddd t| j| |}d}tdD ]}| 	||d
|d}|dg }	|	st qttt|	}	|t|	7 }|	D ]}
| |
d t V  q|	r||kr q|d	}|sF qqFd S )
Nr   r   r   )r   r   r   zDownloading page {0}zUnable to download API pager   urir   )minr*   _DEFAULT_RESULTS_PER_PAGE_MAX_RESULTS_PER_PAGEr   r   rq   r   r   rd   r   r   filterboollenr+   r3   r   )r,   ZendpointZcollection_idr)   r   Znext_urlZcollected_resultsr   r   r   itemr   r   r    _get_collection
  s<      
z"SoundcloudSearchIE._get_collectionc                 C   s    | j d|||d}| j||dS )Nzsearch/tracks)r   q)r   )r  r   )r,   r)   nr   r   r   r    _get_n_results-  s    z!SoundcloudSearchIE._get_n_resultsN)r.   r/   r0   r   ZIE_DESCfloatZ_MAX_RESULTSr   Z_SEARCH_KEYr   r   r  r  r   r   r   r    r     s    #r   )#
__future__r   r   r"   commonr   r   compatr   r   r	   r
   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r   r   r   r   r   r   r   r   r   r    <module>   s"   <   8">X