a
    hn                     @   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 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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url_or_noneurljoin)requiretraverse_objvaluec                   @   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   M/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/patreon.pypatreon_user_agent   s    z PatreonBaseIE.patreon_user_agentNTc           
   
   C   s   |d u ri }d|vr| j |d< |r0|ddi z&| jd| ||rH|nd|||dW S  ty } zvt|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 Y d }~n
d }~0 0 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   r1   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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/d0d1d*d2d3d*d2d4d5d6dd7d8dd9d:d;d<ddd=d>ded?ed@dAddBdCdDdEdFdGgdHdBedIdJdKdLddMdNdOdPdQdRedSdeedTg dUdNdVddWdXdYddZed[d\d]dd^gd_eed`dadbd]dcdJdddeddfdgdhdidjdkdjdldmdneedodpdqdridsgdtdudvdwdxdydzd{d|d}d|ed~deedoddddddddedoedddddeddddd*id0gZdGZ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	cd166.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	alt_title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@   rB   rC   rG   rH   rI   zPatron-only content)rM   rN   rO   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@   rB   rC   rE   rA   rF   
categoriesdurationZ
view_counttags	age_limitchannelrK   Zlive_statusrG   rJ   ZavailabilityrL   Zplayable_in_embedrI   rH   Zchannel_is_verifiedZchaptersrD   )Z
noplaylistskip_download)rM   rO   paramsz3https://www.patreon.com/posts/episode-166-of-743933rM   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@   rB   rC   rE   rA   rF   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>   rH   rF   rG   rD   rE   rC   rI   rA   r@   rB   rT   rJ   rK   rL   )rM   rO   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20220809iTeb)z
The Officezearly accessZuncut)r=   r>   r@   rK   rJ   rF   rB   rA   rH   rE   rC   rL   rG   rD   rT   rI   )rM   rO   rP   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@   rG   rB   rD   rK   rC   rT   rF   rH   rL   rA   rE   rJ   rI   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@   rA   rB   rF   rI   rJ   rK   rS   rD   rE   rH   rG   rC   rW   m3u8z$Failed to parse XML: not well-formed)rM   rO   rX   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@   rA   rB   rF   rI   rJ   rK   rL   rD   rE   rG   rH   rC   )rM   playlist_countrO   rP   z'https://www.patreon.com/posts/114721679Z	114721679Z20241025ZJapanalysiszKarasawa Part 2z@Part 2 of this video https://www.youtube.com/watch?v=Azms2-VTASkz#https://www.patreon.com/japanalysisZ80504268i7"gZ9346307)r=   r>   rE   rB   rG   rC   rH   r@   rA   rI   rF   rK   rL   rD   rJ   getcommentsc                 C   sh  |  |}| 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 ]T}|d }	|	dkr>t|dt
hfpi }
t|
d}t|
d}t	|
d}|r|tv r|d ur|d7 }|| d| |||t|
d thfd! q|	d"krx|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r|tj| jd0t|d1d2thfd3d4d5p2d6}t|r|| j||d7|d4d4d8d9r||| jt||d, td:d; t|d1d%thf}|r| j||d<|d4d4d=d9 }rt| jd>| j|||d4d5d d?}|jd=kr|d@kst|r|| t|| t|dAt
hf}|r|dB}t |}|tv rV||||d% dC nJ|dDkstt |d%dEkr| j!|d% ||dF\}}|||||dG t|dH}d }|r|dr| "|}|s|d4u r| j#dI|d:dJ nh|s| j#dK|d:dJ nPt$|dkr"||d  n2|D ]}|| q&| j%||fi |dL|iS ||d$< ||dL< |S )MNposts/z*download_url,mimetype,size_bytes,file_namez_comment_count,content,embed,image,like_count,post_file,published_at,title,current_user_can_viewfull_name,urlr   z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_urlrM   Zpublished_atrG   rH   )r@   rA   rC   rD   rG   rH   r   includedc                 S   s   |d S )Ntyper   _vr   r   r   <lambda>0      z)PatreonIE._real_extract.<locals>.<lambda>rm   Zmediadownload_urlmimetype
size_bytesr   -	file_name)r=   r>   filesizerM   r?   user	full_namer=   rM   )rB   rF   rI   post_tagrT   campaignpatron_count)rV   rJ   rK   rL   Zrefererr   )embedproviderZVimeoz?(https(?:%3A%2F%2F|://)player\.vimeo\.com.+app_id(?:=|%3D)+\d+)r~   htmlz	vimeo urlFr%    zChecking Vimeo embed URLi  )r#   r"   ZerrnoteZexpected_statusT)Zurl_transparentzChecking embed URLi  rA   defaultu#   Sorry, we couldn’t find that page	post_filename)r=   r>   rM   rZ   r\   r#   )r=   formats	subtitlesZhttp_headersZ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_idr1   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   rM   r   postri   infoentriesidxrg   Zinclude_typeZmedia_attributesrs   r>   ru   r{   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                 #   sJ  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 fD ]}|d7 }t|d i t|dthfddthfddthfddddtdhftht	fddt
hfdt|d fd ddd!thfd"thfd#fd$d%d& iV  qz|t|d'k r6t|d(}|d u r( qFq(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   rb   )zpage[count]rg   zfields[comment]rd   zfilter[flair]sortr   rf   r   page[cursor]r`   z	/commentszDownloading comments page r!   r    )rh   rl   c                 S   s   |d dko|d S )Nrm   commentr=   r   rn   r   r   r   rq     rr   z)PatreonIE._get_comments.<locals>.<lambda>)relationshipsZ	commenterrh   r=   r=   ri   bodycreatedr   parentrh   rootZis_by_creator)r=   textrD   r   Zauthor_is_uploaderrl   c                    s   |d  ko|d dkS )Nr=   rm   ry   r   rn   	author_idr   r   rq     rr   rz   Z	image_url)authorZauthor_thumbnailFr'   r   )metacount)rh   r=   )	itertoolsr   r*   r1   r   r   r   r   r   r   boolr   )r   Zpost_idcursorr   rX   pager-   r   r   r   r   _get_comments  sX    





zPatreonIE._get_commentsN)
r2   r3   r4   IE_NAME
_VALID_URLint_TESTSZ_RETURN_TYPEr   r   r   r   r   r   r7   9   s  
#
  [ r7   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%d&d'edd(d)d*d+d,d-d.d/d0d1d2d.d-d2edd'd3d4dd5d6d7d8d6d7d9d6d7d:d6d7d;d6d7g
Zd<d= Zd>d? Zd@S )APatreonCampaignIEzpatreon:campaignz(?x)
        https?://(?:www\.)?patreon\.com/(?:
            (?:m|api/campaigns)/(?P<campaign_id>\d+)|
            (?:cw?/)?(?P<vanity>(?!creation[?/]|posts/|rss[?/])[\w-]+)
        )(?:/posts)?/?(?:$|[?#])z&https://www.patreon.com/dissonancepod/r8   r;   r<   zfre:(?s).*We produce a weekly news podcast focusing on stories that deal with skepticism and religion.*r   r:   r9   )r@   rK   r=   rA   rJ   rV   rU   rL   rF   rI   rB   rC   D   )rM   rO   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=   rJ   rK   rA   rU   rV   rI   rB   rF   rC   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@   rL   r=   rJ   rK   rA   rU   rV   rI   rB   rF   rC      zhttps://www.patreon.com/c/OgSogZ8504388ZOGSoGzHre:(?s)Hello and welcome to our Patreon page. We are Mari, Lasercorn, .+zhttps://www.patreon.com/OgSogZ72323575z
David Mosszre:https?://.+/.+)r=   r@   rA   rV   rJ   rK   rI   rF   rB   rC   rL   rU   iK  zChannel removed)rM   rO   r   rP   z,https://www.patreon.com/c/anythingelse/postsZ9631148zAnything Else?z$md5:2ee1db4aed2f9460c2b295825a24aa08zdan Z13852412z$https://www.patreon.com/anythingelse)r=   r@   rA   rB   rF   rI   rV   rJ   rK   rL   rU   rC      z'https://www.patreon.com/cw/anythingelseTrY   z%https://www.patreon.com/c/OgSog/postsz+https://www.patreon.com/dissonancepod/postsz!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 u r qqd S )Nzpatreon_url,urlrb   z-published_at)rc   zfilter[campaign_id]zfilter[is_draft]r   rf   r   r   ZpostszDownloading posts page r   )r   Z
paginationZcursorsnext)rh   .ri   Zpatreon_urlr   )r   r   r*   r1   r   r   r   r7   )r   campaign_idr   rX   r   Z
posts_jsonZpost_urlr   r   r   _entries:  s    
zPatreonCampaignIE._entriesc           
      C   s`  |  |dd\}}|d u r| j||d| jid}t| j||d ddddd	d
ddthf}|st| ||dd dthtt	dhf}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#rLd$nd%tt|d&d'S )(Nr   vanityr   r   r   propsZ	pagePropsZbootstrapEnvelopeZpageBootstrapr|   rh   r=   c                 S   s   |d dkS )Nrm   r|   r   rn   r   r   r   rq   Y  rr   z1PatreonCampaignIE._real_extract.<locals>.<lambda>zcampaign IDrb   ra   zEname,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_urlZcreator)rf   rd   re   rg   z
campaigns/zDownloading campaign infoF)r    r"   r!   )ri   r   rl   c                 S   s   |d dkS )Nrm   ry   r   rn   r   r   r   rq   j  rr   )r   expected_typer(   Zplaylist)ri   summary)ri   rM   )ri   r}   )ri   rz   )ri   Zcreation_count)ri   Zis_nsfw   r   )ri   Zavatar_photo_url)_typer=   r@   r   rA   rK   rL   rJ   rV   rI   rF   rB   r^   rU   rC   )Z_match_valid_urlgroupZ_download_webpager   r   Z_search_nextjs_datar   Z_search_nextjs_v13_datar   r   r1   r   r   r   r
   r   r   r   )
r   rM   r   r   ZwebpagerX   Zcampaign_responseZcampaign_infoZchannel_nameZ	user_infor   r   r   r   P  sX    

zPatreonCampaignIE._real_extractN)	r2   r3   r4   r   r   r   r   r   r   r   r   r   r   r     s   gr   )r5   r   urllib.parser   commonr   Zsproutvideor   Zvimeor   Znetworking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   Zutils.traversalr   r   r   r   r7   r   r   r   r   r   <module>   s   4    