U
    y^!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 d| D S )Nc                 S   s   g | ]}| d qS r   )group).0m r    RC:\Users\TaGoRe\Desktop\beinconnect-dl\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 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*   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   rI   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)r:   r;   r<   r=   r>   r?   r@   rA   rB   	thumbnailrC   rD   rE   rF   rG   skip_downloadT)r   rH   rI   paramsz2https://soundcloud.com/giovannisarani/mezzo-valzerZ e22aecd2bc88e0e4e432d7dcc0a1abf7Z	583011102zMezzo Valzerz$md5:4138d582f81866a530317bae316e8b61ZMicronieZ3352531i{ex\Z20190228g/$f@zhttps://api-v2.soundcloud.com/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dd| d S )Nr7   	client_id)_downloadercachestore)r-   rW   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 )	NrN   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_IDr[   r   )r-   r%   srcscriptrW   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 )Nr]   Fr*   r   rW   i  )r+   copyrangerc   superr6   _download_jsonr   r   
isinstancecauser   coder[   rf   rX   report_warningr   )r-   argskwargsZ	non_fatalr*   _e	__class__r    r!   rj     s$    


zSoundcloudIE._download_jsonc                 C   s   | j jddpd| _d S )Nr7   rW   Z YUKXoArFcqrlQn9tfNHvvyfnDISj04zk)rX   rY   loadrc   r-   r    r    r!   _real_initialize2  s    zSoundcloudIE._real_initializec                 C   s   t jd | S )Nzresolve?url=)r6   _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< 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 )FNr:   r<   rW   r'   ZdownloadableZhas_downloads_lefttracks/z	/downloadFr\   ZredirectUridownloadr8   zContent-Length
   )	format_idr;   filesizer   
preferencec                    s   |  p|  kS )Nr    r   )format_urlsr    r!   invalid_urlU  s    z4SoundcloudIE._extract_info_dict.<locals>.invalid_urlc           	         s   t d}|r8|  D ]\}}| |s|| |< qg }|rJ|| dD ]}| |}|rN|| qN|p~t d| d }|r|d | d}|rt|| d< | d||dkrd	nd
|rdnd d  |  d S )Nz.\.(?P<abr>\d+)\.(?P<ext>[0-9a-z]{3,4})(?=[/?]))r;   abrz/(?:preview|playlist)/0/30/r   previewr   rq   hlsm3u8_nativehttpi)r~   protocolr   )	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  s0    






z3SoundcloudIE._extract_info_dict.<locals>.add_formatc                 S   s   | d d S )Nmediatranscodingsr    )xr    r    r!   <lambda>t      z1SoundcloudIE._extract_info_dict.<locals>.<lambda>r   )r*   r]   formatr   r   z/hlspresetrq   r   	mime_type)r   r;   progressiver   Zsnippedz	/preview/nonevcodecpolicyZBLOCKuserartwork_urlZ
avatar_urlz-%s.jpg)r:   r   rU      rV   r   )widthheightc                    s   t  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=   rB   i  rC   ZplaybackZfavoritingslikescommentrepostsgenre)r:   r>   r?   uploader_urlr@   r<   r=   
thumbnailsrB   webpage_urlrC   rD   rE   rF   rG   r   r   )F)#r	   setrc   r+   r   rx   rj   _request_webpager   geturladdr   r   r   headersr   listrk   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   r;   r   r   r   r   r   rK   Zimage_idsizeir   r    )r   r   r   r   r!   _extract_info_dict9  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   r{   r'   z%s/%sr>   r<   tokenz/%szDownloading info JSONr*   )	r#   matchr3   r   rx   rz   	_BASE_URLrj   r   )
r-   r   r   r   r*   Zinfo_json_urlr   r   Zresolve_titler   r    r    r!   r/     s*    



   zSoundcloudIE._real_extract)NN)r0   r1   r2   __doc__r3   IE_NAMEr   _TESTSrx   r   r   r   r[   rf   rj   rw   classmethodrz   r   r/   __classcell__r    r    rs   r!   r6   :   sb     .

 r6   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 )Nr:   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 )r:   r	   r   r    r    r!   r"     s     )idsZ
playlistIdZplaylistSecretTokenr   r   r{   z?secret_token=r<   r=   )r	   r+   allrj   rx   r   r   r   r,   r6   ie_keyplaylist_result)	r-   playlistr   playlist_idr   entriestrackr   r   r    r    r!   _extract_set  sB     
   z%SoundcloudPlaylistBaseIE._extract_set)N)r0   r1   r2   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r:   r<   r=      r   rI   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   r3   r   rj   rz   r   r   r   r   )r-   r   r   r   r   r   Zmsgsr    r    r!   r/     s    
zSoundcloudSetIE._real_extractNr0   r1   r2   r3   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 )Ni 5w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   r:   r<   )	rk   r   r   r+   r,   r6   suitabler   r   )Z
candidatesZcandr   rv   r    r!   resolve_entry=  s    
 zFSoundcloudPagedPlaylistBaseIE._extract_playlist.<locals>.resolve_entryr   r   	next_href)_typer:   r<   r   )rg   	itertoolscountrj   rk   r   r+   r   r
   r)   r(   r*   r   )r-   base_urlr   playlist_titleZCOMMON_QUERYr*   r   r   r   responser   r   rr   entryZparsed_next_hrefr    rv   r!   _extract_playlist$  sD     
 


z/SoundcloudPagedPlaylistBaseIE._extract_playlistN)r0   r1   r2   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   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   r:   z%s (%s)r   )r#   r   r3   r   rj   rz   r   r  rx   _BASE_URL_MAPr   r+   
capitalize)r-   r   r   r>   r   resourcer    r    r!   r/     s    
 zSoundcloudUserIE._real_extractN)r0   r1   r2   r3   r   r   r  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 )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  rR   r   c                 C   sR   |  |}| | ||}| d|d d}| | jd|d   |d|d  S )Nzsoundcloud:track-stations:(\d+)r:   ztrack idzstations/%s/trackszTrack station: %sr<   )	_match_idrj   rz   rb   r  rx   )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   rI   playlist_countc                 C   sZ   t | j|}|d}i }|d}|r2||d< | j| jd | |d|d}| ||S )Nr:   r   r'   z
playlists/zDownloading playlistr   )r#   r   r3   r   rj   rx   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 jazzcorer<   zpost-avant jazzcore   r  Zscsearch   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   rx   r   r   rj   r   r   filterboollenr,   r6   r   )r-   ZendpointZcollection_idr*   r   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)r0   r1   r2   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   r6   r   r   r   r  r
  r  r  r    r    r    r!   <module>   s"   <   ,"<X