o
    iz                     @   s   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mZmZ dd	l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extract_attributesfloat_or_noneint_or_nonemimetype2extparse_iso8601smuggle_urlstr_or_noneupdate_url_queryurl_or_noneurljoin)find_elementsrequiretraverse_objtrim_str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/
session_idz4Patreon/126.9.0.15 (Android; Android 14; Scale/2.10))_get_cookiesget)self r!   L/home/ubuntu/.local/lib/python3.10/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 r| j |d< |r|ddi z| jd| ||r'|nd|||| j  dW S  tyr } z5t|jtrKt|jjj	
ddkrL | j| |jjd ||d	d
}t|dd	d}	|	rmtd|	 dd d }~ww )Nz
User-Agentjson-api-version      ?zhttps://www.patreon.com/api/zDownloading API JSON)notequeryfatalheadersimpersonatezContent-TypejsonFr(   )errors.detailget_allzPatreon said: T)expected)r#   update_download_jsonr	   
isinstancecauser   r   responser)   r   _parse_json_webpage_read_contentr   )
r    epitem_idr'   r)   r(   r&   eerr_json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                   @   sz  e Zd ZdZdZddi ddddd	d
dddddddddddddddededdddddd ed!d"d#d$dd%ddeedd&d'd(d)i dd*dd+dd,dd-dddd.dd/dd0d1d2gd3d4d5ed6d7d8d9d:d-dd;d<d=ded>d?ed@dAed@dBdCdDdE
d@d@dFdGdHd@dIdJd@dIdKdLdMd+dNdOddPdQdRdSd'd(dTi ddUdd+deddVdeddWddXddddYddZdd[dd\d6d]dDgdd^ddYd ed_d`i ddadd+ddbddcdddddeddfddgdeddhddd ededdid6g djddcd'dkdli ddmdd+ddndeddoddpddqddd6drgddsded eddtdduddvddqd_dwdxd+dydzd{d|d}d~d}dddeeddddidgdddddddddddeddeeddd'dddd+ddededddddeddddd@idGddd+dddddddeeeddddd_gZdDZddiZdd Z	dd Z
dd ZdS )	PatreonIEpatreonzPhttps?://(?:www\.)?patreon\.com/(?:creation\?hid=|posts/(?:[\w-]+-)?)(?P<id>\d+)z*http://www.patreon.com/creation?hid=743933 e25505eec1053a6e6813b8ed369875ccid743933extmp3	alt_titlez	cd166.mp3titlez*Episode 166: David Smalley of Dogma Debatedescriptionz$md5:34d207dd29aa90e24f1b3f58841b81c7uploaderCognitive Dissonance Podcast	thumbnailre:^https?://.*$	timestampiSupload_date20140727uploader_id87145
like_countcomment_countuploader_url%https://www.patreon.com/dissonancepod
channel_id80642channel_urlchannel_follower_count)urlmd5	info_dictz*http://www.patreon.com/creation?hid=754133 3eb09345bf44bf60451b8b0b81759d0a754133zCD 167 Extra)rG   rI   rL   rN   rP   rW   rX   rY   zPatron-only content)r_   r`   ra   skipz,https://www.patreon.com/creation?hid=1682498SU4fj_aEMVwmp4zI'm on Patreon!TraciJHines20150211z$md5:8af6425f50bd46fbf29f3db0fc3a8364z@TraciHinesMusic
categoriesEntertainmentdurationi  
view_counttagszcount:39	age_limitr   channelz8https://www.youtube.com/channel/UCGLim4T2loE5rwCMdpCIPVglive_statusnot_liveUCGLim4T2loE5rwCMdpCIPVgpublicTz(https://www.youtube.com/@TraciHinesMusiczcount:4iTvideo)
r[   availabilityr^   playable_in_embedrY   rX   channel_is_verifiedchaptersrR   
media_type)
noplaylistskip_download)r_   ra   paramsz3https://www.patreon.com/posts/episode-166-of-743933r_   only_matchingz$https://www.patreon.com/posts/743933z6https://www.patreon.com/posts/kitchen-as-seen-51706779 96656690071f6d64895866008484251b	555089736z&KITCHEN AS SEEN ON DEEZ NUTS EXTENDED!z	Cold Ones20210526z$md5:557a409bd79d3898689419094934ba7914936315)rG   rI   rL   rN   rP   rS   rM   rU   z7https://www.patreon.com/posts/video-sketchbook-32452882324528824301314i|]20191218zhttps://www.patreon.com/loishz$md5:e2693e97ee299c8ece47ffdb67e7d9d2zVIDEO // sketchbook flipthroughLoish
sketchbook1641751)r_   ra   z5https://www.patreon.com/posts/premium-access-7028293170282931zD[Premium Access + Uncut] The Office - 2x6 The Fight - Group Reactionz"https://www.patreon.com/thenormies5733972929435zThe Normiesz$md5:79c9fd8778e2cef84049a94c058a5e2320220809iTeb)z
The Officezearly accessuncut)r_   ra   rd   z6https://www.patreon.com/posts/hunter-x-hunter-3400791334007913z-Hunter x Hunter | Kurapika DESTROYS Uvogin!!!
YaBoyRoshiiE^z"https://www.patreon.com/yaboyroshizHunter x Hunter14264111z!Kurapika is a walking cheat code!202002132147162z6https://www.patreon.com/posts/4k-spiderman-4k-96414599	902250943uY   ❤️(4K) Spiderman Girl Yeonhwa’s Gift ❤️(4K) 스파이더맨걸 연화의 선물uZ   ❤️(4K) Spiderman Girl Yeonhwa’s Gift 
❤️(4K) 스파이더맨걸 연화의 선물Npickyeonhwa90574422z"https://www.patreon.com/Yeonhwa72610237902F   iɆe20240113zre:^https?://.+)rG   rI   rL   rM   rN   rU   rY   r[   r]   rk   rR   rS   rX   rW   rP   r{   m3u8z$Failed to parse XML: not well-formed)r_   ra   r|   expected_warningsz7https://www.patreon.com/posts/holy-wars-solos-100601977   	100601977z<"Holy Wars" (Megadeth) Solos Transcription & Lesson/Analysisz$md5:d099ab976edfce6de2a65c2b169a88d3zBradley Hall24401883z)https://www.patreon.com/bradleyhallguitar3193932iee20240318)rG   rL   rM   rN   rU   rY   r[   r]   r^   rR   rS   rW   rX   rP   )r_   playlist_countra   rd   z'https://www.patreon.com/posts/114721679	11472167920241025JapanalysiszKarasawa Part 2z@Part 2 of this video https://www.youtube.com/watch?v=Azms2-VTASkz#https://www.patreon.com/japanalysis80504268i7"g9346307)rG   rI   rS   rN   rW   rP   rX   rL   rM   rY   rU   r]   r^   rR   r[   getcommentsz2https://www.patreon.com/posts/scottfalco-146966245	146966245zscottfalco 1080z$md5:a3f29bbd0a46b4821ec3400957c98aa2
Insanimate2828146z"https://www.patreon.com/Insanimate6260877gԵ>UU@i(9Si20251230)rG   rI   rL   rM   rN   rU   rY   r[   r]   r^   rX   rW   rk   rR   rS   refererr   c                 C   sH  t | jd| |ddddthf}|sd S t |ddd hfd	thfd
dthfd}||d< t |d
ddthtf}t |dthf}|rt|ddkr| j	||dd| j
d\|d< |d< |d D ]}| j
|d< qbt |d
dthf }r|d dg |dd n|s|r|p||ddkrdnd dg|d< |dsd S |S ) Nzmedia/Fr,   data
attributes	file_namec                 S   s   |  dd S )N.r   )
rpartition)xr!   r!   r"   <lambda>C  s    z3PatreonIE._extract_from_media_api.<locals>.<lambda>
created_atdisplayrk   )rL   rR   rk   rG   )Nviewer_playback_datar_   download_urlmimetyper   rf   )r(   r)   formats	subtitleshttp_headerstranscript_urlenvtt)r_   rI   ry   rt   none)r_   vcodec)r   r>   dictr   r   r   anyr   r   #_extract_m3u8_formats_and_subtitles_HTTP_HEADERS
setdefaultappend)r    media_idr   ra   playback_urlr   fr   r!   r!   r"   _extract_from_media_api;  sF   


z!PatreonIE._extract_from_media_apic                 C   s  |  |}| 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}t
 }g }d}t|ddd fD ]}	|	d }
|
dkrt|	dthfpbi }t|d}t|d}t	|d}|r|tv r|d ur|d7 }|| d| |||t|d thfd! t|	d"thf }r|| qO|
d#kr|t|	dd$thfd"thfdd%thfd& qO|
d'krt|	ddthf }r|d(g | qO|
d)kr|t|	ddthfd"thfdd%thfdd*t	hfd+ qOt|d,d%thf }rk| jd-|d.d/d0d1\}}|r+td2| d3|p(g i}t|rA| jt|| jd4 td5d6}n	| t|| j}| j||d7| jd8d8d9d: }rkt|sf|jd;krk|| t|d<thf}|r|d=}t|}|tv r||||d% d> n0|d?kst|d%d@kr| j |d% || jdA\}}|D ]}| j|dB< q||||dC t|dDt!hthf }r|| t|dt"dEdFd5d5dGhdHt#hdEfD ]}||v rq| $| }r|| || qt|dI}d }|r|dr| %|}|s'|d8u r'| j&dJ|d5dK n4|s3| j&dL|d5dK n(t'|dkrB||d  n|D ]}|| qD| j(||fi |dM|iS ||d"< ||dM< |S )NN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'   r   r   rL   contentimage)	large_urlr_   published_atrW   rX   )rL   rM   rP   rR   rW   rX   r   includedc                 S   s   |d S )Ntyper!   _vr!   r!   r"   r   |  s    z)PatreonIE._real_extract.<locals>.<lambda>r   mediar   r   
size_bytesr   -r   )rG   rI   filesizer_   rK   rG   user	full_namer_   )rN   rU   rY   post_tagrm   campaignpatron_count)ro   r[   r]   r^   embedz"//vimeo\.com/(\d+)(?:/([\da-f]+))?zvimeo id)r   r   )NN)groupdefaultzhttps://player.vimeo.com/video/hr   T)url_transparentzChecking embed URLF)  i  )r)   r(   errnoteexpected_statusr   	post_filename)rG   rI   r_   rt   r   )r)   r   )rG   r   r   r   zdata-media-idz\d+)attrr   regexhtml.current_user_can_viewz#You do not have access to this post)video_idr1   z%No supported media found in this post__post_extractor))	_match_idr>   r   strstripr
   r   r   r   r   setr   r   r   r   r   addr2   r   r   _search_regexr   r   suitable
url_result_smuggle_referrerr   r   _request_webpager   statusr   r   intr   r   r   extract_commentsraise_no_formatslenplaylist_result)r    r_   r   postr   infoseen_media_idsentriesidxr   include_typemedia_attributesr   rI   r   r   r   	embed_urlvimeo_id
vimeo_hashentryurlhr   r   r   r   r   r   can_view_postcommentsr!   r!   r"   _real_extractc  s  



	





















zPatreonIE._real_extractc                 #   sH   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 ]P}|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  q=|t|d'k rt|d(}|d u r d S q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]r   zfields[comment]r   zfilter[flair]sortr$   r   r   page[cursor]r   z	/commentszDownloading comments page r'   r&   )r   r   c                 S   s   |d dko	|d S )Nr   commentrG   r!   r   r!   r!   r"   r     s    z)PatreonIE._get_comments.<locals>.<lambda>)relationships	commenterr   rG   rG   r   bodycreatedr  parentr   rootis_by_creator)rG   textrR   r  author_is_uploaderr   c                    s   |d  ko|d dkS )NrG   r   r   r!   r   	author_idr!   r"   r     s    r   	image_url)authorauthor_thumbnailFr/   r$  )metacount)r   rG   )	itertoolsr)  r2   r>   r   r   r   r   r   r   boolr   )r    post_idcursorr)  r|   pager6   r  r!   r#  r"   _get_comments  s^   





zPatreonIE._get_commentsN)r?   r@   rA   IE_NAME
_VALID_URLr  _TESTS_RETURN_TYPEr   r   r  r0  r!   r!   r!   r"   rD   B   st   	

	
$
	
	
	
  p( rD   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-d2d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/rO   rZ   r\   zfre:(?s).*We produce a weekly news podcast focusing on stories that deal with skepticism and religion.*r   rV   rQ   )rL   r]   rG   rM   r[   ro   rn   r^   rU   rY   rN   rP   D   )r_   ra   playlist_mincountz'https://www.patreon.com/m/4767637/postszNot Just Bikes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.*Jason37306634)rL   rG   r[   r]   rM   rn   ro   rY   rN   rU   rP   G   z3https://www.patreon.com/api/campaigns/4243769/postszSecond Thought4243769z%https://www.patreon.com/secondthoughtz;re:(?s).*Second Thought is an educational YouTube channel.*z
JT Chapman32718287)rL   r^   rG   r[   r]   rM   rn   ro   rY   rN   rU   rP      zhttps://www.patreon.com/c/OgSog8504388OGSoGzHre:(?s)Hello and welcome to our Patreon page. We are Mari, Lasercorn, .+zhttps://www.patreon.com/OgSog72323575z
David Mosszre:https?://.+/.+)rG   rL   rM   ro   r[   r]   rY   rU   rN   rP   r^   rn   iK  zChannel removed)r_   ra   r7  rd   z,https://www.patreon.com/c/anythingelse/posts9631148zAnything Else?z$md5:b2f20eec4cb5520d9a4be4971f28add5zdan 13852412z$https://www.patreon.com/anythingelse)rG   rL   rM   rN   rU   rY   ro   r[   r]   rn   rP      z'https://www.patreon.com/cw/anythingelseTr}   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 ]7}||rd|ini  | jd||d| d	}t|d
}t|dD ]}| td|tV  q3|d u rG d S qd S )Nzpatreon_url,urlr   z-published_at)r   zfilter[campaign_id]zfilter[is_draft]r  r   r   r  postszDownloading posts page r  )r(  
paginationcursorsnext)r   .r   patreon_urlr   )r+  r)  r2   r>   r   r   r   rD   )r    campaign_idr.  r|   r/  
posts_jsonpost_urlr!   r!   r"   _entries  s$   
zPatreonCampaignIE._entriesc           	         s:  |  |dd\} |d u r2| jd  dddd }t| fdd	d
tddhtttdhf}ddddd}| jd| |dd|dpGi }|dpNi }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!rd"nd#tt|d$d%S )&NrJ  vanitysearch5)qz
page[size]r   r   c                    s,   |d dko|d d   d    S )Nr   zcampaign-documentr   r_   /)lowerendswithr   rN  r!   r"   r     s   , z1PatreonCampaignIE._real_extract.<locals>.<lambda>rG   	campaign_)startzcampaign IDr   r   zEname,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_urlcreator)r   r   r   r   z
campaigns/zDownloading campaign infoF)r&   r(   r'   )r   r   r   c                 S   s   |d dkS )Nr   r   r!   r   r!   r!   r"   r     s    )r   expected_typer0   playlist)r   summary)r   r_   )r   r   )r   r   )r   creation_count)r   is_nsfw   r   )r   avatar_photo_url)_typerG   rL   r	  rM   r]   r^   r[   ro   rY   rU   rN   r   rn   rP   )_match_valid_urlr   r>   r   r   filterr   r   r   r   rM  r
   r   r   r   )	r    r_   rJ  resultsr|   campaign_responsecampaign_infochannel_name	user_infor!   rU  r"   r    s\   


zPatreonCampaignIE._real_extractN)	r?   r@   rA   r1  r2  r  r3  rM  r  r!   r!   r!   r"   r5  #  s    fr5  )"rB   r+  commonr   sproutvideor   vimeor   networking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r   r   rD   r5  r!   r!   r!   r"   <module>   s    @	!   d