o
    iz                     @   s,  d dl Z d dlZ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mZmZ dd	l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&dS )    N   )InfoExtractor)PhantomJSwrapper   )Request)	HTTPError)
NO_DEFAULTExtractorError
clean_htmldetermine_extformat_fieldint_or_nonemerge_dicts
orderedSetremove_quotesremove_start
str_to_intupdate_url_queryurl_or_noneurlencode_postdata)find_elementstraverse_objc                       s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  Z	S )PornHubBaseIEpornhubzr(?:(?P<host>pornhub(?:premium)?\.(?:com|net|org))|pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd\.onion)c           	         s    fdd}||i |}|s|S |\}t fdddD rE|d }t|tr-|jn|}t dd}|j|d	 ||i |\}|fS )
Nc                     s   t tj| i |S N)superr   _download_webpage_handle)argskwargs)	__class__self L/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/pornhub.pydl#      z2PornHubBaseIE._download_webpage_handle.<locals>.dlc                 3       | ]	}t | V  qd S r   research.0pwebpager!   r"   	<genexpr>-       z9PornHubBaseIE._download_webpage_handle.<locals>.<genexpr>)z <body\b[^>]+\bonload=["\']go\(\)z"document\.cookie\s*=\s*["\']RNKEY=z"document\.location\.reload\(true\)r   z2.0)required_version)html)any
isinstancer   urlr   get)	r    r   r   r#   returlhurl_or_requestr4   phantomr   r    r-   r"   r   "   s   z&PornHubBaseIE._download_webpage_handlec                 C   s
   d| _ d S NF)
_logged_inr    r!   r!   r"   _real_initialize;   s   
zPornHubBaseIE._real_initializec                 C   s<   |  |dd |  |dd |  |dd |  |dd d S )Nage_verified1accessAgeDisclaimerPHaccessAgeDisclaimerUKaccessPH)_set_cookie)r    hostr!   r!   r"   _set_age_cookies>   s   zPornHubBaseIE._set_age_cookiesc              	   C   s  | j rd S |dd }| j|d\}}|d u rd S d|d|v r#dnd}| |d d| d	}d
d }||r>d| _ d S | |}|||d | jd| dd d| t|d|ddd}	|		ddkrnd| _ d S |		d}
|
d urt
d|
 ddt
d)N.r   )netrc_machinezhttps://www.{}/{}loginpremiumzpremium/ Downloading z login pagec                    s   t  fdddD S )Nc                 3   r%   r   r&   r)   r,   r!   r"   r.   Y   r/   z:PornHubBaseIE._login.<locals>.is_logged.<locals>.<genexpr>)zid="profileMenuDropdown"zclass="ph-icon-logout")r2   r,   r!   r,   r"   	is_loggedX   r$   z'PornHubBaseIE._login.<locals>.is_loggedT)emailpasswordhttps://www.z/front/authenticatezLogging in to z0application/x-www-form-urlencoded; charset=UTF-8XMLHttpRequest)zContent-TypeRefererzX-Requested-With)dataheaderssuccessrA   messagezUnable to login: expectedzUnable to log in)r=   split_get_login_infoformat_download_webpage_hidden_inputsupdate_download_jsonr   r5   r	   )r    rF   siteusernamerO   	login_url
login_pagerM   
login_formresponserV   r!   r!   r"   _loginD   sJ   



zPornHubBaseIE._login)
__name__
__module____qualname___NETRC_MACHINE_PORNHUB_HOST_REr   r?   rG   rf   __classcell__r!   r!   r:   r"   r      s    r   c                   @   s  e Zd ZdZdej dZdgZddi ddd	d
dddddddddddddedededdde	de	de	dd d!d"d#d
d$d%d&d'eeeede	e	d(d)d*id+d,d-d.d
d/d0d1eeeede	e	d2d	d3igid4d)d*id5d,d6d7d8d9d:d;d d<d=d>d*d?d@d*d?dAd*d?dBd*d?dCd*d?dDd*d?dEd*d?dFd*d?dGd*d?dHd*d?dId*d?dJd*d?dKd*d?dLd*d?gZ
dMdN ZdOdP ZdQS )R	PornHubIEzPornHub and Thumbzillaz(?x)
                    https?://
                        (?:
                            (?:[a-zA-Z0-9.-]+\.)?
                            z
                            /(?:(?:view_video\.php|video/show)\?viewkey=|embed/)|
                            (?:www\.)?thumbzilla\.com/video/
                        )
                        (?P<id>[\da-z]+)
                    zj<iframe[^>]+?src=["\'](?P<url>(?:https?:)?//(?:www\.)?pornhub(?:premium)?\.(?:com|net|org)/embed/[\da-z]+)z7http://www.pornhub.com/view_video.php?viewkey=648719015 4d4a4e9178b655776f86cf89ecaf0edfid	648719015extmp4titlez>Seductive Indian beauty strips down and fingers her pink pussyuploaderz	BABES-COMuploader_idz/users/babes-comupload_date20130628	timestampiQdurationii  
view_count
like_countcomment_count	age_limit   tags
categoriescast	thumbnailzre:https?://.+)r4   md5	info_dictz8http://www.pornhub.com/view_video.php?viewkey=1331683002
1331683002u   重庆婷婷女王足交20150213iTi  )ro   rq   rs   rv   rx   ry   rz   r{   dislike_countr|   r}   r   r   skip_downloadTzVVideo has been flagged for verification in accordance with our trust and safety policy)r4   r   paramsskipz>https://www.pornhub.com/view_video.php?viewkey=ph5af5fef7c2aa7ph5af5fef7c2aa7z.BFFS - Cute Teen Girls Share Cock On the FloorBFFsin  ensrt)ro   rq   rs   rt   ry   rz   r{   r   r|   r}   r   r   	subtitleszThis video has been disabledz=http://www.pornhub.com/view_video.php?viewkey=ph601dc30bae19aph601dc30bae19azProjekt Melodyzprojekt-melody20210205z4"Welcome to My Pussy Mansion" - CB Stream (02/03/21))ro   rt   ru   rv   rs   r   )r4   r   z=http://www.pornhub.com/view_video.php?viewkey=ph557bbb6676d2dr4   only_matchingz<http://fr.pornhub.com/view_video.php?viewkey=ph55ca2f9760862z7http://www.pornhub.com/view_video.php?viewkey=788152859z=http://www.pornhub.com/view_video.php?viewkey=ph572716d15a111z=http://www.pornhub.com/view_video.php?viewkey=ph56fd731fce6b7zEhttps://www.thumbzilla.com/video/ph56c6114abd99a/horny-girlfriend-sexz3http://www.pornhub.com/video/show?viewkey=648719015z8https://www.pornhub.net/view_video.php?viewkey=203640933z8https://www.pornhub.org/view_video.php?viewkey=203640933zEhttps://www.pornhubpremium.com/view_video.php?viewkey=ph5e4acdae54a82z>https://www.pornhub.com/view_video.php?viewkey=ph5f75b0f4b18e3zEhttps://www.pornhubpremium.com/view_video.php?viewkey=ph5f75b0f4b18e3z>https://www.pornhub.com/view_video.php?viewkey=ph5a9813bfa7156zlhttp://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/view_video.php?viewkey=ph5a9813bfa7156c                 C   s   t | j||| dd dS )Nz countdefault)r   _search_regex)r    patternr-   namer!   r!   r"   _extract_count  s   zPornHubIE._extract_countc                     s   |}|dpd|d  fdd}|djddd d	d
}|rDtdd|}td| ddtfdddD rS	  j
dd dpcjdddd}g t i }jdddd}|rt|d}|r|dg |dd |d}	t|d }
|d!}t|tr|D ]+}t|tsq|d"}|rt|tsq|v rq| |t|d#f qnd gd$ \}	}
tffd%d&	}fd'd(  fd)d*}sGd+}|d,d-|d d}|r3| D ]'\}|d. r|| qtfd/d|d d$ D r1 | qsGtd0rGtd1 d2dd3sW||d4d5} |d6  td7D ]}|d8}|vru|d f | q]d }g d`fd9d:	}D ]Y\}}|sjd;|d<d d}|r|d=d>}d?|v rڈj |d@dA}t|tr|D ]#}t|tsqt|d"}|sʐqt|d#}||| qq|| qj!dBdCd@dA}jdDdEd dp|dF}fdGdH}"dIdJ}|dKdL}|dMdN}"dOdP}j#i d}d |dQ< t$|t%|dRdS|||	|
||||dTdUt&t'dVdWdXhdYt(hft'dVdZdXhdYt(hft'dVd[dXhdYt(hfd\|d]d^ d=id_|S )aNrF   zpornhub.comro   c                    s0     d|  d  d d|  dS )NplatformrP   z/view_video.php?viewkey=rL   z webpage)rE   r\   )r   )rF   r    video_idr!   r"   
dl_webpage  s
   z+PornHubIE._real_extract.<locals>.dl_webpagepc)zp(?s)<div[^>]+class=(["\'])(?:(?!\1).)*\b(?:removed|userMessageSection)\b(?:(?!\1).)*\1[^>]*>(?P<error>.+?)</div>zF(?s)<section[^>]+class=["\']noVideo["\'][^>]*>(?P<error>.+?)</section>zerror messageerror)r   groupz\s+ zPornHub said: T)rX   r   c                 3   r%   r   r&   r)   r,   r!   r"   r.   *  r/   z*PornHubIE._real_extract.<locals>.<genexpr>)zclass=["\']geoBlocked["\']z/>\s*This content is unavailable in your countryztwitter:titler   )z:(?s)<h1[^>]+class=["\']title["\'][^>]*>(?P<title>.+?)</h1>z:<div[^>]+data-video-title=(["\'])(?P<title>(?:(?!\1).)+)\1z9shareTitle["\']\s*[=:]\s*(["\'])(?P<title>(?:(?!\1).)+)\1rs   )r   z"var\s+flashvars_\d+\s*=\s*({.+?});	flashvarsz{}closedCaptionsFiler   r   )r4   rq   	image_urlvideo_durationmediaDefinitionsvideoUrlqualityr   c                    s|   j || d|d}|si S |d}i   fdd|D ]}| }|s&qtdd|}|dd	\}}| |< q S )
Nzencoded urlr   ;c                    sT   t dd| } d| v r| d}ttjt|S |  } |  v r& |  S t	| S )Nz/\*(?:(?!\*/).)*?\*/rK   +)
r'   subrY   	functoolsreduceoperatorconcatmapstripr   )inpinpsjs_varsparse_js_valuer!   r"   r   d  s   
zHPornHubIE._real_extract.<locals>.extract_js_vars.<locals>.parse_js_valuezvar\s+rK   =r   )r   rY   r   r'   r   )r-   r   r   assignmentsassnvnamevaluer>   r   r"   extract_js_varsZ  s    
z0PornHubIE._real_extract.<locals>.extract_js_varsc                    s8   t | }|sd S |v rd S  |d f | d S r   )r   appendadd)	video_urlv_url)
video_urlsvideo_urls_setr!   r"   add_video_urlx  s   z.PornHubIE._real_extract.<locals>.add_video_urlc                    sD   j | dd}t|tsd S |D ]}t|tr |d qd S )NFfatalr4   )_parse_jsonr3   listdictr5   )quality_itemsq_itemsitem)r   r    r   r!   r"   parse_quality_items  s   

z4PornHubIE._real_extract.<locals>.parse_quality_items)mediar   qualityItemsz(var\s+(?:{})_.+)|c                 3   s    | ]}  |V  qd S r   )
startswithr)   )keyr!   r"   r.     s    z<[^>]+\bid=["\']lockedPlayerzVideo z
 is lockedrW   tvz(var.+?mediastring.+?)</script>mediastringzK<a[^>]+\bclass=["\']downloadBtn\b[^>]+\bhref=(["\'])(?P<url>(?:(?!\1).)+)\1r4   c              
      s   t | }|dkr j| ddd d S |dkr* j| ddddd	 d S |s7tjd
| dd d} | t|d d|d d S )NmpddashF)mpd_idr   m3u8rr   m3u8_nativehls)entry_protocolm3u8_idr   z(?P<height>\d+)[pP]?_\d+[kK]heightr   z%dp)r4   	format_idr   )r   extend_extract_mpd_formats_extract_m3u8_formatsr   r   r   r   )
format_urlr   rq   )formatsr    r   r!   r"   
add_format  s,   
z+PornHubIE._real_extract.<locals>.add_formatz/(\d{6}/\d{2})/zupload data/rK   z/video/get_mediaFr   zvar\s+MODEL_PROFILE\s*=zmodel profilez~(?s)From:&nbsp;.+?<(?:a\b[^>]+\bhref=["\']/(?:(?:user|channel)s|model|pornstar)/|span\b[^>]+\bclass=["\']username)[^>]+>(.+?)<rt   ra   c                    s"     d|  dd|  df|S )Nz<span[^>]+\bclass="votesz"[^>]*>([\d,\.]+)</span>z<span[^>]+\bclass=["\']votesz"["\'][^>]*\bdata-rating=["\'](\d+))r   )kindr   r;   r!   r"   extract_vote_count  s   

z3PornHubIE._real_extract.<locals>.extract_vote_countz.<span class="count">([\d,\.]+)</span> [Vv]iewsviewUplikeDowndislikez"All Comments\s*<span>\(([\d,.]+)\)commentdescriptionmodelProfileLinkz/model/r~   )ro   rt   ru   rv   rs   r   ry   rz   r{   r   r|   r   r}   z
data-labeltag)attrr   .categorypornstar)r   r   r   rR   rP   )r   http_headersr   ))_match_valid_urlr   rf   rG   _html_search_regexr'   r   r	   r2   raise_geo_restricted_html_search_metasetr   r   r   r5   
setdefaultr   r   r3   r   r   strr   r   r[   joinitemsr   r(   finditerreplacer_   _search_jsonr   _search_json_ldr   r   r   r   r
   ) r    r4   mobjr   	error_msgrs   r   r   subtitle_urlr   ry   media_definitions
definitionr   r   r   FORMAT_PREFIXESr   r   rv   r   r   mediasr   model_profilevideo_uploaderr   rz   r{   r   r|   infor!   )	r   r   rF   r   r    r   r   r   r-   r"   _real_extract  sL  









	 







zPornHubIE._real_extractN)rg   rh   ri   IE_DESCr   rk   
_VALID_URL_EMBED_REGEXintr   _TESTSr   r  r!   r!   r!   r"   rm   ~   s   
	
 rm   c                   @   s   e Zd Zdd Zdd ZdS )PornHubPlaylistBaseIEc                 C   s   t | jd|dd dS )Nz\bpage=(\d+)pager   )r   r   )r    r4   r!   r!   r"   _extract_page  s   z#PornHubPlaylistBaseIE._extract_pagec                    s2   j d|d|d} fddttd|D S )Nz%(?s)(<div[^>]+class=["\']container.+)	containerr   c                    s0   g | ]\}}j d   d| t |dqS )zhttp://www.r   )video_title)
url_resultrm   ie_key)r*   r   rs   rF   r    r!   r"   
<listcomp>  s    z:PornHubPlaylistBaseIE._extract_entries.<locals>.<listcomp>zLhref="/?(view_video\.php\?.*\bviewkey=[\da-z]+[^"]*)"[^>]*\s+title="([^"]+)")r   r   r'   findall)r    r-   rF   r  r!   r  r"   _extract_entries  s   z&PornHubPlaylistBaseIE._extract_entriesN)rg   rh   ri   r  r  r!   r!   r!   r"   r    s    r  c                
   @   sl   e Zd Zdej dZddddddi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S )PornHubUserIEz&(?P<url>https?://(?:[a-zA-Z0-9.-]+\.)?zN/(?:(?:user|channel)s|model|pornstar)/(?P<id>[^/?#&]+))(?:[?#&]|/(?!videos)|$)z$https://www.pornhub.com/model/zoe_phv   )r4   playlist_mincountz,https://www.pornhub.com/pornstar/liz-viciousro   zliz-viciousr4   r   r  z+https://www.pornhub.com/users/russianveet69Tr   z%https://www.pornhub.com/channels/povdz*https://www.pornhub.com/model/zoe_ph?abc=1z3https://www.pornhubpremium.com/pornstar/sienna-westz3https://www.pornhubpremium.com/pornstar/lily-labeauzShttps://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/model/zoe_phc                 C   sd   |  |}|d}d|d}| |d | |}|r(t|d|i}| j|t |dS )Nro   z	{}/videosr4   rF   r  )ier   )	r   r   r[   rG   r  r   r  PornHubPagedVideoListIEr  )r    r4   r  user_id
videos_urlr  r!   r!   r"   r  ;  s   



zPornHubUserIE._real_extractN)rg   rh   ri   r   rk   r  r  r  r!   r!   r!   r"   r    s<    !r  c                   @   s(   e Zd Zedd Zdd Zdd ZdS )PornHubPagedPlaylistBaseIEc                 C   s   t d| d uS )Nz(?x)
                <li[^>]+\bclass=["\']page_next|
                <link[^>]+\brel=["\']next|
                <button[^>]+\bid=["\']moreDataBtn
            r&   r,   r!   r!   r"   	_has_moreH  s   z$PornHubPagedPlaylistBaseIE._has_morec                 #   s8    |}d}d fdd	}dd }|}|d u}	|	r|nd}
|	r%|
fnt|
D ]o}z7z|||}W n- tya } z!||rV||
krV||v rV||d}|||d	d
}n W Y d }~nd }~ww W n ty } z||r{||
kr{W Y d }~ d S  d }~ww ||}|s d S |E d H  |s d S q*d S )Nz/videosFc                    s*   d ||rdnd}j|  |d|idS )NzDownloading page {}{}z (switch to fallback)rK   r  query)r[   r\   )base_urlnumfallbacknoteitem_idr    r!   r"   download_pageV  s   z:PornHubPagedPlaylistBaseIE._entries.<locals>.download_pagec                 S   s   t | jto| jjdkS )Ni  )r3   causer   status)er!   r!   r"   is_404[  s   z3PornHubPagedPlaylistBaseIE._entries.<locals>.is_404r   rK   T)r*  )F)r  	itertoolscountr	   r   r  r%  )r    r4   rF   r-  r  VIDEOSr.  r2  r(  has_page
first_pagepage_numr-   r1  page_entriesr!   r,  r"   _entriesQ  sF   
	

z#PornHubPagedPlaylistBaseIE._entriesc                 C   sH   |  |}|d}|d}| | | | | | ||||S )NrF   ro   r   r   rf   rG   playlist_resultr:  r    r4   r  rF   r-  r!   r!   r"   r  y  s   




z(PornHubPagedPlaylistBaseIE._real_extractN)rg   rh   ri   staticmethodr%  r:  r  r!   r!   r!   r"   r$  G  s
    
(r$  c                       s  e Zd Zdej dZddddddddd	id
dddd	idddddi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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e fd&d'Z  Z	S )(r!  zhttps?://(?:[^/]+\.)?z)/(?!playlist/)(?P<id>(?:[^/]+/)*[^/?#&]+)z+https://www.pornhub.com/model/zoe_ph/videosTr   z.http://www.pornhub.com/users/rushandlia/videosz4https://www.pornhub.com/pornstar/jenny-blighe/videosro   zpornstar/jenny-blighe/videos   r  z;https://www.pornhub.com/pornstar/jenny-blighe/videos?page=3(   z,https://www.pornhub.com/channels/povd/videoszchannels/povd/videosi%  z1https://www.pornhub.com/channels/povd/videos?o=raz1https://www.pornhub.com/channels/povd/videos?o=daz1https://www.pornhub.com/channels/povd/videos?o=viz1http://www.pornhub.com/users/zoe_ph/videos/publicz8https://www.pornhub.com/pornstar/liz-vicious/videos?o=mvz8https://www.pornhub.com/pornstar/liz-vicious/videos?o=trz8https://www.pornhub.com/pornstar/liz-vicious/videos?o=lgz8https://www.pornhub.com/pornstar/liz-vicious/videos?o=cmz8https://www.pornhub.com/pornstar/liz-vicious/videos/paidz;https://www.pornhub.com/pornstar/liz-vicious/videos/fanonlyzhttps://www.pornhub.com/videoz$https://www.pornhub.com/video?page=3z/https://www.pornhub.com/video/search?search=123z'https://www.pornhub.com/categories/teenz.https://www.pornhub.com/categories/teen?page=3zhttps://www.pornhub.com/hdz!https://www.pornhub.com/hd?page=3z'https://www.pornhub.com/described-videoz.https://www.pornhub.com/described-video?page=2z:https://www.pornhub.com/video/incategories/60fps-1/hd-pornzZhttps://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/model/zoe_ph/videosc                    s.   t |st|st|rdS t |S r<   )rm   suitabler  PornHubUserVideosUploadIEr   )clsr4   r:   r!   r"   rA    s   
z PornHubPagedVideoListIE.suitable)
rg   rh   ri   r   rk   r  r  classmethodrA  rl   r!   r!   r:   r"   r!    s    	ar!  c                   @   s<   e Zd Zdej dZdddidddd	d
dd	d
gZdS )rB  (?P<url>https?://(?:[^/]+\.)?zB/(?:(?:user|channel)s|model|pornstar)/(?P<id>[^/]+)/videos/upload)z;https://www.pornhub.com/pornstar/jenny-blighe/videos/uploadro   zjenny-blighe   r  z2https://www.pornhub.com/model/zoe_ph/videos/uploadTr   zihttp://pornhubvybmsymdol4iibwgwtkpwmeyd6luq2gxajgjzfjvotyt5zhyd.onion/pornstar/jenny-blighe/videos/uploadN)rg   rh   ri   r   rk   r  r  r!   r!   r!   r"   rB    s    rB  c                   @   sT   e Zd Zdej dZdddidddd	d
dd	d
dd	d
gZdd Zdd ZdS )PornHubPlaylistIErE  z/playlist/(?P<id>[^/?#&]+))z)https://www.pornhub.com/playlist/44121572ro   44121572M   )r4   r   playlist_countz(https://www.pornhub.com/playlist/4667351Tr   z'https://de.pornhub.com/playlist/4667351z.https://de.pornhub.com/playlist/4667351?page=2c           
      #   s     |d}d|dtd|d}d|dt|d d	 d
 }| } fdd}td
|d
 D ]}	|	d
krQ||	}| }|sV d S |E d H  qAd S )NzDownloading page 1z var\s+playlistId\s*=\s*"([^"]+)"playlist_idz&var\s+itemsCount\s*=\s*([0-9]+)\s*\|\|video_countzvar\s+token\s*=\s*"([^"]+)"token$   g      D@r   c                    s0   d|  }d  d}j ||| ddS )NzDownloading page rP   z/playlist/viewChunked)ro   r  rM  r&  )r\   )r8  r+  page_urlrF   r-  rK  r    rM  r!   r"   r.    s   


z1PornHubPlaylistIE._entries.<locals>.download_page)r\   r   r   mathceilr  range)
r    r4   rF   r-  r-   rL  
page_countr9  r.  r8  r!   rP  r"   r:    s$   	zPornHubPlaylistIE._entriesc                 C   sN   |  |}|d}|d}| | | | | | |d|||S )NrF   ro   r4   r;  r=  r!   r!   r"   r  ,  s   




zPornHubPlaylistIE._real_extractN)	rg   rh   ri   r   rk   r  r  r:  r  r!   r!   r!   r"   rG    s&    rG  )'r   r3  rQ  r   r'   commonr   openloadr   
networkingr   networking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   rm   r  r  r$  r!  rB  rG  r!   r!   r!   r"   <module>   s,    @`   /=j