U
    gW                     @   s   d dl Z d dl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 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   )ExtractorError
clean_htmlextract_attributesget_element_by_classget_element_by_idget_elements_html_by_classint_or_nonemerge_dictsparse_countparse_qstraverse_objunified_strdateurl_or_noneurljoinc                   @   s   e Zd ZdZdgZddddddd	d
dddeeeeddddddddddd
ddeeeeddddidddddd ddd!ddd"d#dg d$d%dd&d'g d(d)d*ed+d,gZd-d. Zd/S )0	YouPornIEzehttps?://(?:www\.)?youporn\.com/(?:watch|embed)/(?P<id>\d+)(?:/(?P<display_id>[^/?#&]+))?/?(?:[#?]|$)zN<iframe[^>]+\bsrc=["\'](?P<url>(?:https?:)?//(?:www\.)?youporn\.com/embed/\d+)zJhttp://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/Z 3744d24c50438cf5b6f6d59feb5055c2Z505835z%sex-ed-is-it-safe-to-masturbate-dailymp4z'Sex Ed: Is It Safe To Masturbate Daily?zTLove & Sex Answers: http://bit.ly/DanAndJenn -- Is It Unhealthy To Masturbate Daily?zre:^https?://.*\.jpg$   zAsk Dan And JenniferZ20101217   )id
display_idexttitledescription	thumbnaildurationuploaderupload_dateaverage_rating
view_count
categoriestags	age_limitzThis video has been deactivated)urlmd5	info_dictskipz}http://www.youporn.com/watch/561726/big-tits-awesome-brunette-on-amazing-webcam-show/?from=related3&al=2&from_id=561726&pos=4Z561726z0big-tits-awesome-brunette-on-amazing-webcam-showz0Big Tits Awesome Brunette On amazing webcam showzNhttp://sweetlivegirls.com Big Tits Awesome Brunette On amazing webcam show.mp4UnknownZ20110418)r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zskip_downloadTZ404)r%   r'   paramsr(   zKhttps://www.youporn.com/embed/505835/sex-ed-is-it-safe-to-masturbate-daily/)r%   only_matchingz#http://www.youporn.com/watch/505835z8https://www.youporn.com/watch/13922959/femdom-principal/z>https://www.youporn.com/watch/16290308/tinderspecial-trailer1/Z16290308ztinderspecial-trailer1g     r@Z20201123ZErstieszre:https://.+\.jpgiݻ_zTinder In Real Life)r   r$   r"   r   r   r   r   r   r#   r   	timestampr   r!   )r%   r'   c                    s4    |dd\} ddd  d  jddd d	}|std
ttdpbdd }t	|r j
 d| nddd dd}|d } fdd}g }t||ddd dfdD ]}	| j|	dddd q||dD ]}
t|
ddthfd }t|
d!}td"|
d }|rt|sJt|d#}t|d$}|| d%| d&|d' ||d#< || q jd(d)d d	p jd d	p jd)dd*} jd+d,d d	p܈ jd d	} jd-d.dd.d/}t|d0thf}|d kr"t jd1d0dd*} jd2d3dd*}t jd4d5dd*} }d } jd6d7d d	}|rtt|d8}t jd9d:d d	} fd;d<}|d=d>}|d?d@} jdAddB}|dCd  t||||||||||||||dD}|d,}|r0| dE|d) dFr0|d,= |S )GNr   r   z.youporn.comZage_verified1zhttps://www.youporn.com/watch/zC(<div\s[^>]*\bid\s*=\s*('|")?watch-container(?(2)\2|(?!-)\b)[^>]*>)Zwatchabilitydefaultz\s{2}ZmainContent r   z says: zVideo unavailableT)expectedz\bplayervars\s*:zplayer varsZmediaDefinitionsc                    sL   t |  fdddthtf}|s$g S t j|d  ddd fddS )	Nc                    s   |d  kS )Nformat _vstream_typer3   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/youporn.py<lambda>q       zBYouPornIE._real_extract.<locals>.get_format_data.<locals>.<lambda>videoUrlzDownloading z
 info JSONFfatalc                    s   |d  kot |d S )Nr2   r<   )r   r4   r7   r3   r9   r:   v   r;   )r   r   anyZ_download_json)datar8   Zinfo_url)selfvideo_idr7   r9   get_format_datap   s    
z0YouPornIE._real_extract.<locals>.get_format_dataZhlsc                 S   s   t |d t S )NZdefaultQuality)
isinstanceboolr4   r3   r3   r9   r:   {   r;   z)YouPornIE._real_extract.<locals>.<lambda>r<   ).r<   r   F)r>   Zm3u8_idZ	videoSize)r%   filesizeZqualityz0(?P<height>\d{3,4})[pP]_(?P<bitrate>\d+)[kK]_\d+heightbitratezp-k)Z	format_idZtbrz8(?s)<div[^>]+class=["\']watchVideoTitle[^>]+>(.+?)</div>r   r=   z8(?s)<div[^>]+\bid=["\']description["\'][^>]*>(.+?)</div>r   z9(?:imageurl\s*=|poster\s*:)\s*(["\'])(?P<thumbnail>.+?)\1r   )r>   groupr   zvideo:durationz:(?s)<div[^>]+class=["\']submitByLink["\'][^>]*>(.+?)</div>r   )zUPLOADED:\s*<span>([^<]+)z Date\s+[Aa]dded:\s*<span>([^<]+)z@(?s)<div[^>]+class=["']videoInfo(?:Date|Time)\b[^>]*>(.+?)</div>zC(?s)<label\b[^>]*>Uploaded[^<]*</label>\s*<span\b[^>]*>(.+?)</span>zupload datez:(<div [^>]*\bdata-value\s*=[^>]+>)\s*<label>Views:</label>viewsz
data-valuez>All [Cc]omments? \(([\d,.]+)\)zcomment countc                    s&    j | |d d}|sg S td|S )Nr.   z<a[^>]+href=[^>]+>([^<]+))_search_regexrefindall)regexr   Ztag_box)rA   webpager3   r9   extract_tag_box   s    z0YouPornIE._real_extract.<locals>.extract_tag_boxz%(?s)Categories:.*?</[^>]+>(.+?)</div>r"   zL(?s)Tags:.*?</div>\s*<div[^>]+class=["\']tagBoxContent["\'][^>]*>(.+?)</div>r#   ZVideoObject)Zexpected_typer>   r%   )r   r   r   r   r   r   r   r   r!   comment_countr"   r#   r$   formatszWatch z online)!_match_valid_urlrJ   Z_set_cookie_download_webpagerL   rM   splitr   r	   r   ZIE_NAMEZ_search_jsonr   extendZ_extract_m3u8_formatsr   getsearchintupdateappendZ_html_search_regexZ_og_search_titleZ_html_search_metaZ_og_search_descriptionr   Z_rta_searchr   r   Z_search_json_ldpopr   
startswith)rA   r%   r   Z	watchablemsgZplayer_varsZdefinitionsrC   rS   Zhls_urlZ
definitionfrG   ZmobjrH   r   r   r   r   r   r   r$   r!   rK   rR   rQ   r"   r#   r@   resultr3   )rA   rB   rP   r9   _real_extract`   s"      
           
       
     
 zYouPornIE._real_extractN)	__name__
__module____qualname__
_VALID_URLZ_EMBED_REGEXrZ   list_TESTSrb   r3   r3   r3   r9   r      s    Fr   c                   @   s4   e Zd Zdd Zedd Zd
ddZddd	ZdS )YouPornListBasec              	   C   s$   t || jdtd|pdddd dS )Nz5<a [^>]*?\bhref\s*=\s*("|')(?P<url>(?:(?!\1)[^>])+)\1nextr0   z	next pager%   rJ   r/   )r   rL   r	   )rA   r%   pl_idhtmlr3   r3   r9   _get_next_url   s      zYouPornListBase._get_next_urlc                 C   s   t dd|S )N[_-] )rM   sub)cls
title_slugr3   r3   r9   _get_title_from_slug   s    z$YouPornListBase._get_title_from_slugNc           
   	   #   s   |pd}t |D ]}|s6| j |d| ||kd}|s@ d S td|D ]0}t|thd fddhf }rJ| |V  qJ|d k	r d S |  ||}	|	r|	 kr d S |	 d }qd S )Nr   zDownloading page )noter>   zvideo-titlehrefc                    s
   t  | S N)r   )xr%   r3   r9   r:      r;   z*YouPornListBase._entries.<locals>.<lambda>)	itertoolscountrU   r
   r   r   Z
url_resultrn   )
rA   r%   rl   rm   page_numstartpageelementZ	video_urlZnext_urlr3   ry   r9   _entries   s*        zYouPornListBase._entriesc           
   	      s  |  |   fdddD \}}}dd t| D }|pBd}| |}|rd|  d| }| g}|d kr|d7 }n"| d	td
d| }|	| |rt
tdjt| }	|dd|	 d7 }||	 d|}| j| j|||t|dd||dS )Nc                 3   s   | ]}  |V  qd S rw   )rX   ).0rI   Zm_dictr3   r9   	<genexpr>  s     z0YouPornListBase._real_extract.<locals>.<genexpr>)r   typesortc                 S   s   i | ]\}}|r||d  qS )r3   )r   rI   r6   r3   r3   r9   
<dictcomp>  s       z1YouPornListBase._real_extract.<locals>.<dictcomp>YouPornrp   z videosz videos by ro   =z (,)/r~   )rm   r|   )Zplaylist_idZplaylist_title)rT   	groupdictr   itemsrt   
capitalizelowerrM   rq   r\   rg   mapjoinsortedrW   Zplaylist_resultr   r   rX   )
rA   r%   rm   rl   Z	page_typer   qsZbase_idr   filtersr3   r   r9   rb     s,    





 zYouPornListBase._real_extract)NN)N)rc   rd   re   rn   classmethodrt   r   rb   r3   r3   r3   r9   ri      s
   

ri   c                   @   sN   e Zd ZdZdZddddddd	d
dddddd	dddddddgZdS )YouPornCategoryIEz8YouPorn category, with sorting, filtering and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
        (?P<type>category)/(?P<id>[^/?#&]+)
        (?:/(?P<sort>popular|views|rating|time|duration))?/?(?:[#?]|$)
    Full list with paginationz<https://www.youporn.com/category/popular-with-women/popular/zpopular-with-women/popularz-Category popular with women videos by popularr   r   '   ru   r%   r'   playlist_mincount/Filtered paginated list with single page resultzLhttps://www.youporn.com/category/popular-with-women/duration/?min_minutes=10z*popular-with-women/duration/min_minutes=10z?Category popular with women videos by duration (min_minutes=10)r   Single page of full listzBhttps://www.youporn.com/category/popular-with-women/popular?page=1z!popular-with-women/popular/page=1z6Category popular with women videos by popular (page=1)$   ru   r%   r'   Zplaylist_countN)rc   rd   re   IE_DESCrf   rh   r3   r3   r3   r9   r     s0   	
r   c                   @   sH   e Zd ZdZdZddddddd	d
ddddddgZedd ZdS )YouPornChannelIEz,YouPorn channel, with sorting and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
        (?P<type>channel)/(?P<id>[^/?#&]+)
        (?:/(?P<sort>rating|views|duration))?/?(?:[#?]|$)
    r   z(https://www.youporn.com/channel/x-feeds/zx-feedszChannel X-Feeds videosr   %   r   *Single page of full list (no filters here)z7https://www.youporn.com/channel/x-feeds/duration?page=1zx-feeds/duration/page=1z+Channel X-Feeds videos by duration (page=1)   r   c                 C   s   t dd|  S Nr5   rp   rM   rq   r   rs   r3   r3   r9   rt   [  s    z%YouPornChannelIE._get_title_from_slugNrc   rd   re   r   rf   rh   staticmethodrt   r3   r3   r3   r9   r   B  s&   	r   c                       sP   e Zd ZdZdZddddddd	d
ddddddddgZ fddZ  ZS )YouPornCollectionIEz?YouPorn collection (user playlist), with sorting and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
        (?P<type>collection)s/videos/(?P<id>\d+)
        (?:/(?P<sort>rating|views|time|duration))?/?(?:[#?]|$)
    r   z4https://www.youporn.com/collections/videos/33044251/Z33044251zCollection Sexy Lips videoszph-littlewillyb)r   r   r   2   r   r   z?https://www.youporn.com/collections/videos/33044251/time?page=1z33044251/time/page=1z,Collection Sexy Lips videos by time (page=1)   r   c                    s   |  |}| ||}t j||d}tddttd|p>d}| jd|ddd	d
\}}|r|	|d 
|d dd ||d |S )Nrm   z\s+rp   zcollection-infosr0   ze^\s*Collection: (?P<title>.+?) \d+ VIDEOS \d+ VIEWS \d+ days LAST UPDATED From: (?P<uploader>[\w_-]+)ztitle/uploader)r   r   )NNrk   r   r   r   r   )	_match_idrU   superrb   rM   rq   r   r   rL   r[   replacerV   )rA   r%   rl   rm   playlistinfosr   r   	__class__r3   r9   rb   {  s,    
    
z!YouPornCollectionIE._real_extractrc   rd   re   r   rf   rh   rb   __classcell__r3   r3   r   r9   r   `  s(   
r   c                       sj   e Zd ZdZdZddddddd	gd
ddddddd	gd
ddddddd	gd
gZ fddZ  ZS )YouPornTagIEz>YouPorn tag (porntags), with sorting, filtering and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
        porn(?P<type>tag)s/(?P<id>[^/?#&]+)
        (?:/(?P<sort>views|rating|time|duration))?/?(?:[#?]|$)
    r   z)https://www.youporn.com/porntags/austrianZaustrianzTag austrian videosr   !   z*YouPorn tag pages are not correctly cached)ru   r%   r'   r   Zexpected_warningsr   zBhttps://www.youporn.com/porntags/austrian/duration/?min_minutes=10z austrian/duration/min_minutes=10z0Tag austrian videos by duration (min_minutes=10)
   r   z1https://www.youporn.com/porntags/austrian/?page=1zaustrian/page=1zTag austrian videos (page=1)    c                    s   | j ddd t |S )NzMYouPorn tag pages are not correctly cached and often return incorrect resultsT)Z	only_once)Zreport_warningr   rb   )rA   r%   r   r3   r9   rb     s
    zYouPornTagIE._real_extractr   r3   r3   r   r9   r     s8   
"r   c                       s\   e Zd ZdZdZddddddd	d
ddddddddgZedd Z fddZ  Z	S )YouPornStarIEz:YouPorn Pornstar, with description, sorting and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
        (?P<type>pornstar)/(?P<id>[^/?#&]+)
        (?:/(?P<sort>rating|views|duration))?/?(?:[#?]|$)
    r   z(https://www.youporn.com/pornstar/daynia/ZdayniazPornstar Daynia videosz>re:Daynia Rank \d+ Videos \d+ Views [\d,.]+ .+ Subscribers \d+)r   r   r   (   r   r   z/https://www.youporn.com/pornstar/daynia/?page=1zdaynia/page=1zPornstar Daynia videos (page=1)z
re:.{180,}   r   c                 C   s   t dd|  S r   r   r   r3   r3   r9   rt     s    z"YouPornStarIE._get_title_from_slugc                    s   |  |}| ||}t j||d}d}| j||dddd }rptddtd	dttd
d|dd}|d|	 p~d iS )Nr   z(?x)
            <div [^>]*\bclass\s*=\s*('|")(?:[\w$-]+\s+|\s)*?pornstar-info-wrapper(?:\s+[\w$-]+|\s)*\1[^>]*>
            (?P<info>[\s\S]+?)(?:</div>\s*){6,}
        r   infor0   rk   z(?:\s*nl=nl)+\s*rp   z(?u)\s+
znl=nlz
ribe Subscr   )
r   rU   r   rb   rL   rM   rq   r   r   strip)rA   r%   rl   rm   r   ZINFO_ELEMENT_REr   r   r3   r9   rb     s"    
   
zYouPornStarIE._real_extract)
rc   rd   re   r   rf   rh   r   rt   rb   r   r3   r3   r   r9   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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d$d% Zd&S )'YouPornVideosIEzHYouPorn video (browse) playlists, with sorting, filtering and paginationz(?x)
        https?://(?:www\.)?youporn\.com/
            (?:(?P<id>browse)/)?
            (?P<sort>(?(id)
                (?:duration|rating|time|views)|
                (?:most_(?:favou?rit|view)ed|recommended|top_rated)?))
            (?:[/#?]|$)
    z-Full list with pagination (too long for test)zhttps://www.youporn.com/ZyoupornzYouPorn videosr   T)ru   r%   r'   r+   z#https://www.youporn.com/recommendedzyouporn/recommendedzYouPorn videos by recommendedz!https://www.youporn.com/top_ratedzyouporn/top_ratedzYouPorn videos by top ratedz#https://www.youporn.com/browse/timezbrowse/timezYouPorn videos by timer   z<https://www.youporn.com/most_favorited/?res=VR&max_minutes=2z+youporn/most_favorited/max_minutes=2/res=VRz7YouPorn videos by most favorited (max_minutes=2,res=VR)r   r   z*Filtered paginated list with several pagesz<https://www.youporn.com/most_favorited/?res=VR&max_minutes=5z+youporn/most_favorited/max_minutes=5/res=VRz7YouPorn videos by most favorited (max_minutes=5,res=VR)-   r   z*https://www.youporn.com/browse/time?page=1zbrowse/time/page=1zYouPorn videos by time (page=1)r   r   c                 C   s   | dkrdS | S )NZbrowser   r3   r   r3   r3   r9   rt   5  s    z$YouPornVideosIE._get_title_from_slugNr   r3   r3   r3   r9   r     sl   					
	;r   )rz   rM   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   ri   r   r   r   r   r   r   r3   r3   r3   r9   <module>   s   @ P9#-03