3
b`!s                 @   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)urlonly_matchingc             C   s   dd t jd| D S )Nc             S   s   g | ]}|j d qS )r   )group).0m r   KC:\Users\Broad\Desktop\All-Down\binaries\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 jt j|j}|d d }|jd}|r>t|d|d i}| j|S )Nr   r   secret_token)r
   parse_qsurlparsequerygetr   
url_result)selfr   r(   api_urlr%   r   r   r   _real_extract0   s    
zSoundcloudEmbedIE._real_extractN)__name__
__module____qualname__
_VALID_URL_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gZdVZdWZ	dXZ
dYdZd[d\d]d^d_d`dadbdc
Zddde Zdfdg Z fdhdiZdjdk Zedldm ZdsdodpZdqdr Z  ZS )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
     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'vP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   rG   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	340344461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)r8   r9   r:   r;   r<   r=   r>   r?   r@   	thumbnailrA   rB   rC   rD   rE   skip_downloadT)r   rF   rG   paramsz2https://soundcloud.com/giovannisarani/mezzo-valzerZ e22aecd2bc88e0e4e432d7dcc0a1abf7Z	583011102zMezzo Valzerz$md5:4138d582f81866a530317bae316e8b61ZMicronieZ3352531i{ex\Z20190228g/$f@zhttps://api-v2.soundcloud.com/zhttps://soundcloud.com/z-([0-9a-z]+)\.jpg          /   C   d   i,  i  i  r   )
ZminitinyZsmallZbadgeZt67x67ZlargeZt300x300ZcropZt500x500originalc             C   s   | j jjdd| d S )Nr5   	client_id)_downloadercachestore)r+   rT   r   r   r   _store_client_id  s    zSoundcloudIE._store_client_idc             C   sp   | j dd }xVttjd|D ]B}| j |d dd}|r| jd|dd d}|r|| _| j| d S qW tdd S )	Nzhttps://soundcloud.com/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reversedr!   findall_search_regex
_CLIENT_IDrX   r   )r+   r#   srcscriptrT   r   r   r   _update_client_id  s    
zSoundcloudIE._update_client_idc                s   |j ddk}|r|d= |j di j }xtdD ]}| j|d< ||d< ytt| j|t|S  tk
r } zNt	|j
tr|j
jdkr| jd  | j  w2n|r| jjt| dS  W Y d d }~X q2X q2W d S )NrY   Fr(   r   rT   i  )r)   copyranger_   superr4   _download_jsonr   r   
isinstancecauser   coderX   rb   rU   report_warningr   )r+   argskwargsZ	non_fatalr(   _e)	__class__r   r   rf     s$    

zSoundcloudIE._download_jsonc             C   s   | j jjddpd| _d S )Nr5   rT   Z YUKXoArFcqrlQn9tfNHvvyfnDISj04zk)rU   rV   loadr_   )r+   r   r   r   _real_initialize2  s    zSoundcloudIE._real_initializec             C   s   t jd | S )Nzresolve?url=)r4   _API_V2_BASE)clsr   r   r   r   _resolv_url5  s    zSoundcloudIE._resolv_urlNc                s  t d }d }t  g d| ji}|r4||d< jdr҈jdrt| jd | d |}| j||d	d
pri jd}|r| jt||d	d
}	|	r|	j	 }
 j
|
 jdt|	pdt|	jjd|
dd  fdd}dEfdd	}tdd tpg }x |D ]}t|ts"qt|jd}
|
s:q| j|
||d	d}t|ts\qt|jd|rxq j
 |jdpi }|jd}|dkrd|
krd}d }t|jd}|r|jdd }|tkrt|jd }||d!|d"kr
d#n||jd$pd%|
k qW xD ]}d&|d'< q.W  r`jd(d)kr`| j  | j jd*pxi }g }jd+}|p|jd,}t|t r>tj| j|r4x| jj D ]n\}}|tj| jd-| |d.}|d/kr| rd0}n|d1krd|d2< |r"|j ||d3 |j| qW n
d|ig}fd4d5}||jd6t|jdpl|jd7|jd8t!jd9|jd:|t"jd;d<jd8jd=|d>|d?p|d@|dA|dBjdCdDS )FNr8   r:   rT   r%   ZdownloadableZhas_downloads_leftztracks/z	/downloadF)rY   ZredirectUridownloadr6   zContent-Length
   )	format_idr9   filesizer   
preferencec                s   |  p|  kS )Nr   )r   )format_urlsr   r   invalid_urlU  s    z4SoundcloudIE._extract_info_dict.<locals>.invalid_urlc       	         s   t jd}|r<x*|j j D ]\}}| j|s|| |< qW g }|rN|j| x$dD ]}| j|}|rT|j| qTW |pt jd| d }|r|jd | jd}|rt|| d< | jdj||dkrd	nd
|rdnd d  j|  d S )Nz.\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?])r9   abrz/(?:preview|playlist)/0/30/r   previewrm   hlsm3u8_nativehttprv   )rw   protocolry   )r9   r|   i)	r!   search	groupdictitemsr)   appendintupdatejoin)	fr   Z
is_previewmobjkvformat_id_listr}   r|   )formats
stream_urlr   r   
add_formatX  s.    





z3SoundcloudIE._extract_info_dict.<locals>.add_formatc             S   s   | d d S )Nmediatranscodingsr   )xr   r   r   <lambda>t  s    z1SoundcloudIE._extract_info_dict.<locals>.<lambda>r   )r(   rY   formatr   r~   z/hlspresetrm   r   	mime_type)r   r9   progressiver   Zsnippedz	/preview/nonevcodecpolicyZBLOCKuserartwork_urlZ
avatar_urlz-%s.jpg)r8   r   rR      rS   ry   )widthheightc                s   t  jd|  S )Nz%s_count)r   r)   )key)infor   r   extract_count  s    z6SoundcloudIE._extract_info_dict.<locals>.extract_countusername	permalinkpermalink_url
created_atr;   r@   i  rA   ZplaybackZfavoritingslikescommentrepostsgenre)r8   r<   r=   uploader_urlr>   r:   r;   
thumbnailsr@   webpage_urlrA   rB   rC   rD   rE   r   r   )F)#r	   setr_   r)   r   rr   rf   _request_webpager   geturladdr   r   r   headersr   listrg   dictr   r   splitr   r   raise_geo_restricted_sort_formatsr!   r   _IMAGE_REPL_RE_ARTWORK_MAPr   subr   r   r   )r+   r   
full_titler%   track_idr:   r(   download_urlredirect_urlurlh
format_urlr{   r   r   tstreamZstream_formatr   r9   r   r   r   r   r   rI   Zimage_idsizeir   r   )rz   r   r   r   r   _extract_info_dict9  s    













zSoundcloudIE._extract_info_dictc       
      C   s   t j| j|}|jd}i }|rJ| jd | }|}|jd}|r||d< n>d|jdd  }}|jd}|rx|d| 7 }| j| j| }| j||d	|d
}	| j|	||S )Nr   ztracks/r%   z%s/%sr<   r:   tokenz/%szDownloading info JSON)r(   )	r!   matchr1   r   rr   rt   	_BASE_URLrf   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   _TESTSrr   r   r   r   rX   rb   rf   rq   classmethodrt   r   r-   __classcell__r   r   )ro   r   r4   :   s4  







 r4   c               @   s   e Zd ZdddZdS )SoundcloudPlaylistBaseIENc       	      C   s   t |d }|jdpg }tdd |D  rb|rb| j| jd |ddjdd |D ||dd	}g }xd|D ]\}t|jd}|jd
}|s|sql| jd | }|r|d| 7 }|j| j|t	j
 | qlW | j|||jd|jdS )Nr8   tracksc             S   s   g | ]}|j 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 )r8   )r	   )r   r   r   r   r   r      s    )idsZ
playlistIdZplaylistSecretToken)r(   r   ztracks/z?secret_token=r:   r;   )r	   r)   allrf   rr   r   r   r   r*   r4   ie_keyplaylist_result)	r+   playlistr   playlist_idr   entriestrackr   r   r   r   r   _extract_set  s2    


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)r8   r:   r;      )r   rG   playlist_mincountzGhttps://soundcloud.com/the-concept-band/sets/the-royal-concept-ep/tokenT)r   r   c             C   s   t j| j|}d|jdd }|jd}|r8|d| 7 }| j| j| j| |}d|kr|dd |d D }td	d
j| | j	||S )Nz
%s/sets/%sr<   Z
slug_titler   /errorsc             s   s   | ]}t |d  V  qdS )error_messageN)r	   )r   errr   r   r   	<genexpr>  s    z0SoundcloudSetIE._real_extract.<locals>.<genexpr>z$unable to download video webpage: %sr   )
r!   r   r1   r   rf   rt   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}|j  }d|d< |}g }xtj D ]} j||d|d  |d}	|	d	 }
t|
ts`g }
 fd
d}x4|
D ],}|||jd|jdf}|rr|j| qrW |	jd}|sP |	d }tj	|}tj
|j}|j| q,W d|||dS )Ni 5w1)limitlinked_partitioningr   offsetzDownloading track page %sr   )r(   
collectionc                sb   x\| D ]T}t |tsqt|jd}|s*q j|tj|rBtj nd t|jd|jdS W d S )Nr   r8   r:   )	rg   r   r   r)   r*   r4   suitabler   r   )
candidatesZcandr   )r+   r   r   resolve_entry=  s    

zFSoundcloudPagedPlaylistBaseIE._extract_playlist.<locals>.resolve_entryr   r   	next_href)_typer8   r:   r   )rc   	itertoolscountrf   rg   r   r)   r   r
   r'   r&   r(   r   )r+   base_urlr   playlist_titleZCOMMON_QUERYr(   r   r   r   responser   r   rn   entryZparsed_next_hrefr   )r+   r   _extract_playlist$  s:    



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))r8   r:      )r   rG   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| j|}|jd}| j| j| j| |d}|jdp>d}| j| j| j	| |d   t
|jdd|d |j f S )Nr   zDownloading user infoZrsrcr   r8   z%s (%s)r   )r!   r   r1   r   rf   rt   r   r   rr   _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   _  sL   	
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 text)r8   r:   rO   )r   rG   r   c             C   sR   | j |}| j| j||}| jd|d d}| j| jd|d   |d|d  S )Nzsoundcloud:track-stations:(\d+)r8   ztrack idzstations/%s/trackszTrack station: %sr:   )	_match_idrf   rt   r^   r   rr   )r+   r   Z
track_namer   r   r   r   r   r-     s    
z&SoundcloudTrackStationIE._real_extractN)r.   r/   r0   r1   r   r   r-   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 Club)r8   r:   r;   r   )r   rG   playlist_countc             C   sZ   t j| j|}|jd}i }|jd}|r2||d< | j| jd | |d|d}| j||S )Nr8   r   r%   z
playlists/zDownloading playlist)r(   )r!   r   r1   r   rf   rr   r   )r+   r   r   r   r(   r   datar   r   r   r-     s    

z"SoundcloudPlaylistIE._real_extractN)r.   r/   r0   r1   r   r   r-   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 jazzcorer:   zpost-avant jazzcore   )r   rG   r   Zscsearch   2   c             k   s   t |jd| j| j}|j|ddd t| j| |}d}xtjdD ]}| j	||dj
|d}|jdg }	|	stP ttt|	}	|t|	7 }x"|	D ]}
| j|
d tj V  qW |	 s||krP |jd	}|sHP qHW d 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   rr   r   r   rf   r   r   filterboollenr*   r4   r   )r+   ZendpointZcollection_idr(   r   next_urlZcollected_resultsr   r   r   itemr   r   r   _get_collection  s2    


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   IE_DESCfloat_MAX_RESULTSr   _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   r4   r   r   r   r   r   r   r  r   r   r   r   <module>   s"   <   ,"<X