U
    g)                     @   s   d dl Z d dlZddlmZ ddl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dS )    N   )InfoExtractor   )ExtractorErrorstr_or_nonetry_getc                       sN   e Zd ZdZdZdd Z fddZedd Zd fdd	Z	dd Z
  ZS )AudiusBaseIENz/v1c                 C   sV   t |trJ|d}|d k	r |S t|dkrJd|krJtd|d ddtdd S )Ndatar   messagezAPI error: {}TexpectedUnexpected API response)
isinstancedictgetlenr   format)selfresponseZresponse_data r   ;/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/audius.py_get_response_data   s    

zAudiusBaseIE._get_response_datac                    sD   t  jddddd}| |}t|tr8t|| _dS tddS )z2Selecting one of the currently available API hostszhttps://api.audius.co/NzRequesting available API hostsz%Unable to request available API hostsnoteerrnotez!Unable to get available API hosts)	super_download_jsonr   r   listrandomchoice	_API_BASEr   )r   r   hosts	__class__r   r   _select_api_base   s     

zAudiusBaseIE._select_api_basec                 C   sL   t j| } t j|}d|ks(d|krH|dddd}| ||S | S )a  
        Audius removes forward slashes from the uri, but leaves backslashes.
        The problem is that the current version of Chrome replaces backslashes
        in the address bar with a forward slashes, so if you copy the link from
        there and paste it into youtube-dl, you won't be able to download
        anything from this link, since the Audius API won't be able to resolve
        this url
        /z%2Fz%5C)urllibparseunquotereplace)urltitleZfixed_titler   r   r   _prepare_url"   s    
zAudiusBaseIE._prepare_urlDownloading JSON metadata Unable to download JSON metadatac              
      s   | j d kr|   z*t j| j  | j | ||||d}W n> tk
rz } z dt|krftddd|W 5 d }~X Y nX | |S )N)r   r   expected_statuszFailed to parse JSONz1An error occurred while receiving data. Try againTr   )r    r$   r   r   _API_Vr   strr   )r   pathitem_idr   r   r/   r   excr"   r   r   _api_request3   s"    
   
zAudiusBaseIE._api_requestc                 C   s   | j d| |ddS )Nz/resolve?url=i  )r/   )r5   )r   r*   r3   r   r   r   _resolve_urlD   s    zAudiusBaseIE._resolve_url)Nr-   r.   N)__name__
__module____qualname__r    r0   r   r$   staticmethodr,   r5   r6   __classcell__r   r   r"   r   r      s   

   r   c                   @   sr   e Zd ZdZdZddddddd	dd
ddeeeddddddddddddeeeddgZddddZdd ZdS )AudiusIEz_(?x)https?://(?:www\.)?(?:audius\.co/(?P<uploader>[\w\d-]+)(?!/album|/playlist)/(?P<title>\S+))z	Audius.coz]https://audius.co/test_acc/t%D0%B5%D0%B5%D0%B5est-1.%5E_%7B%7D/%22%3C%3E.%E2%84%96~%60-198631Z 92c35d3e754d5a0f17eef396b0d33582Zxd8gYu/   Tеееest/ 1.!@#$%^&*()_+=[]{};'\":<>,.?/№~`mp3Description   testZ
Electroniczre:https?://.*\.jpg)idr+   extdescriptiondurationtrackartistgenre	thumbnail
view_count
like_countrepost_count)r*   md5	info_dictz%https://audius.co/voltra/radar-103692Z 491898a0a8de39f20c5d6a8a80ab5132ZKKdy2ZRADARi>  ZvoltraZTrance)rA   r+   rB   rD   rE   rF   rG   rH   rI   rJ   rK      i  i  )Z150x150Z480x480Z	1000x1000c                 C   sJ  |  |}t|dd }|d krD|d}| ||}| ||}nd }| d| |}t|tsltd|	d}|d krtd|	d}g }t|tr|
 D ]6\}}	d	|	i}
| j	|}|d k	r||
d
< ||
 q||	d|| j d| dd|	d|	d|	dt|dd t|	d||	d|	d|	ddS )Nc                 S   s
   |  dS )Ntrack_id)groupxr   r   r   <lambda>|       z(AudiusIE._real_extract.<locals>.<lambda>r+   z/tracks/r   rA   zUnable to get ID of the trackZartworkr*   Z
preferencez/v1/tracks/z/streamr=   rC   rD   c                 S   s   | d d S )Nusernamer   rQ   r   r   r   rS      rT   rG   Z
play_countZfavorite_countrK   )rA   r+   r*   rB   rC   rD   rE   rF   rG   
thumbnailsrI   rJ   rK   )_match_valid_urlr   rP   r,   r6   r5   r   r   r   r   items_ARTWORK_MAPappendr    r1   )r   r*   mobjrO   r+   Z
track_dataZartworks_datarW   Zquality_keyZthumbnail_urlrH   Zquality_coder   r   r   _real_extractz   sL    





 
zAudiusIE._real_extractN)	r7   r8   r9   
_VALID_URLIE_DESCint_TESTSrZ   r]   r   r   r   r   r<   I   sN   )r<   c                   @   s,   e Zd ZdZdZdZddddddgZdS )	AudiusTrackIEzE(?x)(?:audius:)(?:https?://(?:www\.)?.+/v1/tracks/)?(?P<track_id>\w+)zaudius:trackz3Audius track ID or API link. Prepend with "audius:"zaudius:9RWloT)r*   Zonly_matchingzRaudius:http://discoveryprovider.audius.prod-us-west-2.staked.cloud/v1/tracks/9RWloN)r7   r8   r9   r^   IE_NAMEr_   ra   r   r   r   r   rb      s   rb   c                   @   s<   e Zd ZdZdZdZdddddd	d
Zdd Zdd ZdS )AudiusPlaylistIEzVhttps?://(?:www\.)?audius\.co/(?P<uploader>[\w\d-]+)/(?:album|playlist)/(?P<title>\S+)zaudius:playlistzAudius.co playlistsz7https://audius.co/test_acc/playlist/test-playlist-22910ZDNvjNztest playlistzTest description

lol)rA   r+   rC      r*   rM   Zplaylist_countc                 C   s^   g }|D ]P}t |tstdt|d}|s8td|| jd| t |d q|S )Nr   rA   z$Unable to get track ID from playlistzaudius:)ZieZvideo_id)	r   r   r   r   r   r[   Z
url_resultrb   Zie_key)r   ZtracksentriesrE   rO   r   r   r   _build_playlist   s    
 
z AudiusPlaylistIE._build_playlistc           	      C   s   |    | |}|d}| ||}| ||}t|trJt|dkrRtd|d }t|t	sltd|
d}|d krtd| jd| d|d	d
d}t|tstd| |}| |||
d||
dS )Nr+   r   r   r   rA   zUnable to get playlist IDz/playlists//tracksz$Downloading playlist tracks metadataz+Unable to download playlist tracks metadatar   Zplaylist_namerC   )r$   rX   rP   r,   r6   r   r   r   r   r   r   r5   rh   playlist_result)	r   r*   r\   r+   Zplaylist_responseZplaylist_dataZplaylist_idZplaylist_tracksrg   r   r   r   r]      s4    




 


zAudiusPlaylistIE._real_extractN)	r7   r8   r9   r^   rc   r_   _TESTrh   r]   r   r   r   r   rd      s   
rd   c                   @   s4   e Zd ZdZdZdZdddddd	d
Zdd ZdS )AudiusProfileIEzaudius:artistzAudius.co profile/artist pagesz6https?://(?:www)?audius\.co/(?P<id>[^\/]+)/?(?:[?#]|$)zhttps://audius.co/pzl/ZezRo7z&TAMALE

Contact: officialpzl@gmail.comZpzl)rA   rC   r+      rf   c              
   C   s   |    | |}z| d| |}W n2 tk
rX } ztdt| W 5 d }~X Y nX |d d }|d d}| d| d|}| | ||||S )Nz/full/users/handle/z!Could not download profile info; r   rA   Zbiori   )r$   Z	_match_idr5   r   r1   r   rj   rh   )r   r*   Z
profile_idZ_profile_dataeZprofile_audius_idZprofile_bioZapi_callr   r   r   r]     s    
"zAudiusProfileIE._real_extractN)r7   r8   r9   rc   r_   r^   rk   r]   r   r   r   r   rl      s   
rl   )r   urllib.parser&   commonr   utilsr   r   r   r   r<   rb   rd   rl   r   r   r   r   <module>   s   Ab;