U
    gb                     @   s   d dl Z d dlZd dlZddl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 G d	d
 d
eZG dd deZG dd deZdS )    N   )InfoExtractor)VidsIoIE)VimeoIE   )	HTTPError)KNOWN_EXTENSIONSExtractorError
clean_htmldetermine_extint_or_nonemimetype2extparse_iso8601smuggle_urlstr_or_nonetraverse_objurl_or_noneurljoinc                   @   s$   e Zd Zejdd ZdddZdS )PatreonBaseIEc                 C   s   |  ddrdS dS )Nhttps://www.patreon.com/Z
session_idz1Patreon/72.2.28 (Android; Android 14; Scale/2.10)z0Patreon/7.6.28 (Android; Android 11; Scale/2.10))Z_get_cookiesget)self r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/patreon.pypatreon_user_agent   s    z PatreonBaseIE.patreon_user_agentNTc           
   
   C   s   |d kri }d|kr| j |d< |r0|ddi z&| jd| ||rH|nd|||dW S  tk
r } znt|jtrt|jjj	
ddkr | j| |jjd ||d	d
}t|dd	d}	|	rtd|	 dd W 5 d }~X Y nX d S )N
User-Agentjson-api-version      ?zhttps://www.patreon.com/api/zDownloading API JSON)notequeryfatalheaderszContent-TypejsonFr    )errors.Zdetail)get_allzPatreon said: T)expected)r   updateZ_download_jsonr	   
isinstancecauser   r   responser!   r   Z_parse_json_webpage_read_contentr   )
r   epZitem_idr   r!   r    r   eZerr_jsonZerr_messager   r   r   	_call_api"   s.    
 
  $zPatreonBaseIE._call_api)NNTN)__name__
__module____qualname__	functoolscached_propertyr   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eedddedddddddd	d
eedddddddddd
ddd d!gd"ed#d$dd%d&ed'd(ed)d*ed)d+d,d-d)d)d.d/d0d)d1d2d)d1d3d4d5dd6d7d
d8d9d:d;ddd<d=ded>ed?d@d
dAdBdCdDdEdFgdGdAedHdIdJdKddLdMdNdOdPdQedRd
eedSdTdUdVgdMdWddXdYdZdd[ed\d]d^d
d_gd`eedadbdcd^dddIdedfddgdhdidjdkdldkdmdndoeedpdqdrdsidtgdudvdwdxdydzd{d|d}d~d}eddeedpdddgZdFZdd Zdd Z	dS )	PatreonIEZpatreonzPhttps?://(?:www\.)?patreon\.com/(?:creation\?hid=|posts/(?:[\w-]+-)?)(?P<id>\d+)z*http://www.patreon.com/creation?hid=743933Z e25505eec1053a6e6813b8ed369875ccZ743933Zmp3z*Episode 166: David Smalley of Dogma Debatez$md5:34d207dd29aa90e24f1b3f58841b81c7Cognitive Dissonance Podcastre:^https?://.*$iSZ2014072787145%https://www.patreon.com/dissonancepod80642)idexttitledescriptionuploader	thumbnail	timestampupload_dateuploader_id
like_countcomment_countuploader_url
channel_idchannel_urlchannel_follower_count)urlmd5	info_dictz*http://www.patreon.com/creation?hid=754133Z 3eb09345bf44bf60451b8b0b81759d0aZ754133zCD 167 Extra)r:   r;   r<   r>   r?   rC   rD   rE   zPatron-only content)rI   rJ   rK   skipz,https://www.patreon.com/creation?hid=1682498ZSU4fj_aEMVwZmp4zI'm on Patreon!ZTraciJHinesZ20150211z$md5:8af6425f50bd46fbf29f3db0fc3a8364z@TraciHinesMusicZEntertainmenti  zcount:39r   z8https://www.youtube.com/channel/UCGLim4T2loE5rwCMdpCIPVgZnot_liveZUCGLim4T2loE5rwCMdpCIPVgpublicTz(https://www.youtube.com/@TraciHinesMusiczcount:4iT)r:   r;   r<   r>   r?   rA   r=   rB   
categoriesdurationZ
view_counttags	age_limitchannelrG   Zlive_statusrC   rF   ZavailabilityrH   Zplayable_in_embedrE   rD   Zchannel_is_verifiedZchaptersr@   )Z
noplaylistskip_download)rI   rK   paramsz3https://www.patreon.com/posts/episode-166-of-743933rI   Zonly_matchingz$https://www.patreon.com/posts/743933z6https://www.patreon.com/posts/kitchen-as-seen-51706779Z 96656690071f6d64895866008484251bZ	555089736z&KITCHEN AS SEEN ON DEEZ NUTS EXTENDED!z	Cold OnesZ20210526z$md5:557a409bd79d3898689419094934ba79Z14936315)r:   r;   r<   r>   r?   rA   r=   rB   z7https://www.patreon.com/posts/video-sketchbook-32452882Z32452882Z4301314i|]Z20191218zhttps://www.patreon.com/loishz$md5:e2693e97ee299c8ece47ffdb67e7d9d2zVIDEO // sketchbook flipthroughzLoish Z
sketchbookvideoZ1641751)r:   r;   rD   rB   rC   r@   rA   r?   rE   r=   r<   r>   rP   rF   rG   rH   )rI   rK   z5https://www.patreon.com/posts/premium-access-70282931Z70282931zD[Premium Access + Uncut] The Office - 2x6 The Fight - Group Reactionz"https://www.patreon.com/thenormiesZ573397Z2929435zThe Normiesz$md5:79c9fd8778e2cef84049a94c058a5e23Z20220809iTebz
The Officezearly accessZuncut)r:   r;   r<   rG   rF   rB   r>   r=   rD   rA   r?   rH   rC   r@   rP   rE   )rI   rK   rL   z6https://www.patreon.com/posts/hunter-x-hunter-34007913Z34007913z-Hunter x Hunter | Kurapika DESTROYS Uvogin!!!Z
YaBoyRoshiiE^z"https://www.patreon.com/yaboyroshizHunter x HunterZ14264111z!Kurapika is a walking cheat code!Z20200213Z2147162)r:   r;   r<   rC   r>   r@   rG   r?   rP   rB   rD   rH   r=   rA   rF   rE   z6https://www.patreon.com/posts/4k-spiderman-4k-96414599Z	902250943uY   ❤️(4K) Spiderman Girl Yeonhwa’s Gift ❤️(4K) 스파이더맨걸 연화의 선물uZ   ❤️(4K) Spiderman Girl Yeonhwa’s Gift 
❤️(4K) 스파이더맨걸 연화의 선물ZNpickyeonhwaZ90574422z"https://www.patreon.com/Yeonhwa726Z10237902F   iɆeZ20240113zre:^https?://.+)r:   r;   r<   r=   r>   rB   rE   rF   rG   rO   r@   rA   rD   rC   r?   rS   m3u8z$Failed to parse XML: not well-formed)rI   rK   rT   Zexpected_warningsz7https://www.patreon.com/posts/holy-wars-solos-100601977   Z	100601977z<"Holy Wars" (Megadeth) Solos Transcription & Lesson/Analysisz$md5:d099ab976edfce6de2a65c2b169a88d3zBradley HallZ24401883z)https://www.patreon.com/bradleyhallguitarZ3193932ieeZ20240318)r:   r<   r=   r>   rB   rE   rF   rG   rH   r@   rA   rC   rD   r?   )rI   playlist_countrK   rL   c                 C   sL  |  |}| jd| |dddddddd	d
}|d d }t|dtjhfdthfddthtfdthfdt	hfdt	hfd}g }d}t|ddd fD ]F}|d }	|	dkr0t|dt
hfpi }
t|
d}t|
d}t	|
d}|r|tkr|d k	r|d7 }|| d| |||d  q|	d!krj|t|dd"thfd#thfdd$thfd% q|	d&krt|ddthf }r|d'g | q|	d(kr|t|ddthfd#thfdd$thfdd)t	hfd* qd+d,i}t|d-d.krjtj| jd/t|d0d1thfd2d3d4p$d5}t|rj| j||d6|d3d3d7d8rj|| jt|d,td9d: t|d0d$thf}|r| j||d;|d3d3d<d8 }rt| jd=| j|||d3d4d d>}|jd<kr|d?kst|r|| t|| t|d@t
hf}|r|dA}t |}|tkrD||||d$ dB nD|dCksbt |d$dDkr| !|d$ |\}}||||dE t|dF}d }|r|dr| "|}|s|d3kr| j#dG|d9dH nd|s| j#dI|d9dH nLt$|dkr
||d  n.|D ]}|| q| j%||f|dJ|iS ||d#< ||dJ< |S )KNposts/z download_url,mimetype,size_bytesz_comment_count,content,embed,image,like_count,post_file,published_at,title,current_user_can_viewfull_name,urlvaluezurl,name,patron_countfalsez7audio,user,user_defined_tags,campaign,attachments_media)zfields[media]fields[post]fields[user]zfields[post_tag]fields[campaign]json-api-use-default-includesinclude)r   data
attributesr<   contentimage)Z	large_urlrI   Zpublished_atrC   rD   )r<   r=   r?   r@   rC   rD   r   includedc                 S   s   |d S )Ntyper   _vr   r   r   <lambda>      z)PatreonIE._real_extract.<locals>.<lambda>ri   Zmediadownload_urlmimetype
size_bytesr   -)r:   r;   filesizerI   user	full_namer:   rI   )r>   rB   rE   post_tagrP   campaignpatron_count)rR   rF   rG   rH   Zrefererzhttps://patreon.com/)embedZproviderZVimeoz?(https(?:%3A%2F%2F|://)player\.vimeo\.com.+app_id(?:=|%3D)+\d+)ry   htmlz	vimeo urlFr#    zChecking Vimeo embed URLi  )r!   r    ZerrnoteZexpected_statusT)Zurl_transparentzChecking embed URLi  r=   defaultu#   Sorry, we couldn’t find that page	post_filename)r:   r;   rI   rV   rX   )r:   formats	subtitlesZcurrent_user_can_viewz#You do not have access to this post)video_idr&   z%No supported media found in this postZ__post_extractor)&Z	_match_idr.   r   strstripr
   r   anyr   r   dictr   r   r   appendr'   r   
setdefaulturllibparseunquoteZ_html_search_regexZ_request_webpage
url_resultr   Z_smuggle_referrerZ_html_search_metar+   statusr   Zsuitabler   r   Z#_extract_m3u8_formats_and_subtitlesZextract_commentsZraise_no_formatslenZplaylist_result)r   rI   r   postre   infoentriesidxrc   Zinclude_typeZmedia_attributesro   r;   rq   rv   r!   Zv_urlZ	embed_urlZurlhZmeta_descriptionr~   r   r   r   Zcan_view_postcommentsentryr   r   r   _real_extract  s   
 

	









       
 
       




zPatreonIE._real_extractc                 #   sN  d }d}dddddddd	d
}t dD ]}||r>d|ini  | jd| d||d| d}d }t|dddd ffdfD ]}|d7 }|d}|dpi }	|d krqt|d t|d fdddfdti d}
||	dt|	dt|ddd |	d! |
d"|
d#d$V  q|t|d%k r:t|d&}|d kr( qJq(d S )'Nr   2   a`  parent.commenter.campaign,parent.post.user,parent.post.campaign.creator,parent.replies.parent,parent.replies.commenter.campaign,parent.replies.post.user,parent.replies.post.campaign.creator,commenter.campaign,post.user,post.campaign.creator,replies.parent,replies.commenter.campaign,replies.post.user,replies.post.campaign.creator,on_behalf_of_campaignzbody,created,is_by_creatorzimage_url,full_name,urlzimage_tiny_url,namez-createdr   r^   )zpage[count]rc   zfields[comment]r`   zfilter[flair]sortr   rb   r   page[cursor]r[   z	/commentszDownloading comments page r   r   rd   rh   c                 S   s   |d dkS )Nri   commentr   rj   r   r   r   rm     rn   z)PatreonIE._get_comments.<locals>.<lambda>.r:   re   )relationshipsZ	commenterrd   r:   c                    s   |d  ko|d dkS )Nr:   ri   rt   r   rj   	author_idr   r   rm     rn   F)r%   expected_typer}   bodycreated)r   parentrd   r:   rootr|   Zis_by_creatorru   Z	image_url)r:   textr@   r   Zauthor_is_uploaderr   authorZauthor_thumbnail)metacount)rd   r:   )	itertoolsr   r'   r.   r   r   r   r   )r   Zpost_idcursorr   rT   pager*   r   Z
comment_idre   Zauthor_infor   r   r   _get_comments  s^    
   

   

zPatreonIE._get_commentsN)
r/   r0   r1   IE_NAME
_VALID_URLint_TESTSZ_RETURN_TYPEr   r   r   r   r   r   r4   9   sz  
#
  E r4   c                   @   s   e Zd ZdZdZdddddddded	ddd
ddddddddddddddd
ddddde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& Zd'd( Zd)S )*PatreonCampaignIEzpatreon:campaignz(?x)
        https?://(?:www\.)?patreon\.com/(?:
            (?:m|api/campaigns)/(?P<campaign_id>\d+)|
            (?P<vanity>(?!creation[?/]|posts/|rss[?/])[\w-]+)
        )(?:/posts)?/?(?:$|[?#])z&https://www.patreon.com/dissonancepod/r5   r8   r9   zfre:(?s).*We produce a weekly news podcast focusing on stories that deal with skepticism and religion.*r   r7   r6   )r<   rG   r:   r=   rF   rR   rQ   rH   rB   rE   r>   r?   D   )rI   rK   Zplaylist_mincountz'https://www.patreon.com/m/4767637/postszNot Just BikesZ4767637z$https://www.patreon.com/notjustbikesz]re:(?s).*Not Just Bikes started as a way to explain why we chose to live in the Netherlands.*ZJasonZ37306634)r<   r:   rF   rG   r=   rQ   rR   rE   r>   rB   r?   G   z3https://www.patreon.com/api/campaigns/4243769/postszSecond ThoughtZ4243769z%https://www.patreon.com/secondthoughtz;re:(?s).*Second Thought is an educational YouTube channel.*z
JT ChapmanZ32718287)r<   rH   r:   rF   rG   r=   rQ   rR   rE   r>   rB   r?      z+https://www.patreon.com/dissonancepod/postsTrU   z!https://www.patreon.com/m/5932659z-https://www.patreon.com/api/campaigns/4243769c                 c   s   d }d|dddd}t dD ]l}||r2d|ini  | jd||d| d	}t|d
}t|dD ]}| td|tV  qd|d kr qqd S )Nzpatreon_url,urlr^   z-published_at)r_   zfilter[campaign_id]zfilter[is_draft]r   rb   r   r   ZpostszDownloading posts page r   )r   Z
paginationZcursorsnext)rd   .re   Zpatreon_urlr   )r   r   r'   r.   r   r   r   r4   )r   campaign_idr   rT   r   Z
posts_jsonZpost_urlr   r   r   _entries  s    
zPatreonCampaignIE._entriesc           
      C   s4  |  |dd\}}|d kr\| j||d| jid}| ||d d d d d	 d
 d }ddddd}| jd| |dd|dpi }|d
pi }t|d}t|ddd fi tdd}	d||| 	|t
t|dt|dtt|d||t|	dt|	dt|	dt|dt|d r d!nd"tt|d#d$S )%Nr   vanityr   )r!   propsZ	pagePropsZbootstrapEnvelopeZpageBootstraprw   rd   r:   r^   r\   zEname,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_urlZcreator)rb   r`   ra   rc   z
campaigns/zDownloading campaign infoF)r   r    r   )re   r   rh   c                 S   s   |d dkS )Nri   rt   r   rj   r   r   r   rm   %  rn   z1PatreonCampaignIE._real_extract.<locals>.<lambda>)r}   r   r%   Zplaylist)re   summary)re   rI   )re   rx   )re   ru   )re   Zcreation_count)re   Zis_nsfw   r   )re   Zavatar_photo_url)_typer:   r<   r   r=   rG   rH   rF   rR   rE   rB   r>   rZ   rQ   r?   )Z_match_valid_urlgroupZ_download_webpager   Z_search_nextjs_datar.   r   r   r   r   r
   r   r   r   )
r   rI   r   r   ZwebpagerT   Zcampaign_responseZcampaign_infoZchannel_nameZ	user_infor   r   r   r     sx       
 
  zPatreonCampaignIE._real_extractN)	r/   r0   r1   r   r   r   r   r   r   r   r   r   r   r     sz   =r   )r2   r   urllib.parser   commonr   Zsproutvideor   Zvimeor   Znetworking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r4   r   r   r   r   r   <module>   s   8   }