o
    iW                     @   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/ 3744d24c50438cf5b6f6d59feb5055c2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 Jennifer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=4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Unknown20110418)r   r   r   r   r   r   r!   r"   r#   r$   r%   r&   r'   skip_downloadT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/16290308ztinderspecial-trailer1g     r@20201123Erstieszre:https://.+\.jpgiݻ_zTinder In Real Life)r   r'   r%   r   r    r   r"   r!   r&   r   	timestampr   r$   )r(   r*   c                    s0    |dd\} ddd  d  jddd d	}|sHtd
ttdp1dd }t	|rC j
 d| ddddd dd}|d } fdd}g }t||ddd dfdD ]}	| j|	dddd qj||dD ]E}
t|
ddthfd }t|
d!}td"|
d }|r|st|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 u rt jd1d0dd*} jd2d3dd*}t jd4d5dd*} }d } jd6d7d d	}|r?tt|d8}t jd9d:d d	} fd;d<}|d=d>}|d?d@} jdAddB}|dCd  t||||||||||||||dD}|d,}|r| dE|d) dFr|d,= |S )GNr   r   z.youporn.comage_verified1zhttps://www.youporn.com/watch/zC(<div\s[^>]*\bid\s*=\s*('|")?watch-container(?(2)\2|(?!-)\b)[^>]*>)watchabilitydefaultz\s{2}mainContent r   z says: zVideo unavailableT)expectedz\bplayervars\s*:zplayer vars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_typerA   L/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/youporn.py<lambda>q   s    zBYouPornIE._real_extract.<locals>.get_format_data.<locals>.<lambda>videoUrlzDownloading z
 info JSONFfatalc                    s   |d  kot |d S )Nr@   rI   )r   rB   rE   rA   rG   rH   v   s    )r   r   any_download_json)datarF   info_url)selfvideo_idrE   rG   get_format_datap   s   
z0YouPornIE._real_extract.<locals>.get_format_datahlsc                 S   s   t |d t S )NdefaultQuality)
isinstanceboolrB   rA   rA   rG   rH   {   s    z)YouPornIE._real_extract.<locals>.<lambda>rI   ).rI   r   F)rK   m3u8_id	videoSize)r(   filesizequalityz0(?P<height>\d{3,4})[pP]_(?P<bitrate>\d+)[kK]_\d+heightbitratezp-k)	format_idtbrz8(?s)<div[^>]+class=["\']watchVideoTitle[^>]+>(.+?)</div>r   rJ   z8(?s)<div[^>]+\bid=["\']description["\'][^>]*>(.+?)</div>r   z9(?:imageurl\s*=|poster\s*:)\s*(["\'])(?P<thumbnail>.+?)\1r   )rK   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   tag_box)rP   webpagerA   rG   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&   VideoObject)expected_typerK   r(   )r   r   r   r   r   r    r!   r"   r$   comment_countr%   r&   r'   formatszWatch z online)!_match_valid_urlr`   _set_cookie_download_webpagerb   rc   splitr   r	   r   IE_NAME_search_jsonr   extend_extract_m3u8_formatsr   getsearchintupdateappend_html_search_regex_og_search_title_html_search_meta_og_search_descriptionr   _rta_searchr   r   _search_json_ldpopr   
startswith)rP   r(   r   	watchablemsgplayer_varsdefinitionsrR   rl   hls_url
definitionfr[   mobjr\   r   r   r   r    r!   r"   r'   r$   ra   rk   rh   r%   r&   rN   resultrA   )rP   rQ   rg   rG   _real_extract`   s   



 zYouPornIE._real_extractN)	__name__
__module____qualname__
_VALID_URL_EMBED_REGEXrw   list_TESTSr   rA   rA   rA   rG   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 )YouPornListBaseIEc              	   C   s$   t || jdtd|pdddd dS )Nz5<a [^>]*?\bhref\s*=\s*("|')(?P<url>(?:(?!\1)[^>])+)\1nextr=   z	next pager(   r`   r;   )r   rb   r	   )rP   r(   pl_idhtmlrA   rA   rG   _get_next_url   s
   zYouPornListBaseIE._get_next_urlc                 C   s   t dd|S )N[_-] )rc   sub)cls
title_slugrA   rA   rG   _get_title_from_slug   s   z&YouPornListBaseIE._get_title_from_slugNc           
      c   s    |pd}t |D ]N}|s| j||d| ||kd}|s! d S td|D ]}t|thdt|hf }r<| |V  q&|d urD d S | |||}	|	rQ|	|krT d S |	}d }q
d S )Nr   zDownloading page )noterK   zvideo-titlehref)		itertoolscountro   r
   r   r   r   
url_resultr   )
rP   r(   r   r   page_numstartpageelement	video_urlnext_urlrA   rA   rG   _entries   s*   zYouPornListBaseIE._entriesc           
   	      s  |  |   fdddD \}}}dd t| D }|p!d}| |}|r2|  d| }| g}|d u r@|d7 }n| d	td
d| }|	| |rot
tdjt| }	|dd|	 d7 }||	 d|}| j| j|||t|dd||dS )Nc                 3   s    | ]}  |V  qd S N)ru   ).0r]   m_dictrA   rG   	<genexpr>  s    z2YouPornListBaseIE._real_extract.<locals>.<genexpr>)r   typesortc                 S   s   i | ]\}}|r||d  qS )rA   )r   r]   rD   rA   rA   rG   
<dictcomp>  s    z3YouPornListBaseIE._real_extract.<locals>.<dictcomp>YouPornr   z videosz videos by r   =z (,)/r   )r   r   )playlist_idplaylist_title)rm   	groupdictr   itemsr   
capitalizelowerrc   r   ry   r   mapjoinsortedrs   playlist_resultr   r   ru   )
rP   r(   r   r   	page_typer   qsbase_idr   filtersrA   r   rG   r     s*   





zYouPornListBaseIE._real_extractNNr   )r   r   r   r   classmethodr   r   r   rA   rA   rA   rG   r      s    

r   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   '   r   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)$   r   r(   r*   playlist_countN)r   r   r   IE_DESCr   r   rA   rA   rA   rG   r     s2    	
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      t dd|  S NrC   r   rc   r   r   r   rA   rA   rG   r   [     z%YouPornChannelIE._get_title_from_slugNr   r   r   r   r   r   staticmethodr   rA   rA   rA   rG   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/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
\}}|rD|	|d 
|d dd ||d |S )Nr   z\s+r   zcollection-infosr=   ze^\s*Collection: (?P<title>.+?) \d+ VIDEOS \d+ VIEWS \d+ days LAST UPDATED From: (?P<uploader>[\w_-]+)ztitle/uploader)r   r!   r   r   r   r   r   r   )	_match_idro   superr   rc   r   r   r   rb   rx   replacerp   )rP   r(   r   r   playlistinfosr   r!   	__class__rA   rG   r   {  s$   

z!YouPornCollectionIE._real_extractr   r   r   r   r   r   r   __classcell__rA   rA   r   rG   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/austrianaustrianzTag austrian videosr   !   z*YouPorn tag pages are not correctly cached)r   r(   r*   r   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)	only_once)report_warningr   r   )rP   r(   r   rA   rG   r     s
   zYouPornTagIE._real_extractr   rA   rA   r   rG   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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/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   r   r   r   r   rA   rA   rG   r     r   z"YouPornStarIE._get_title_from_slugc                    s   |  |}| ||}t j||d}d}| j||dddd }r8tddtd	dttd
d|dd}i |d|	 pAd 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   infor=   r   z(?:\s*nl=nl)+\s*r   z(?u)\s+
znl=nlz
ribe Subscr   )
r   ro   r   r   rb   rc   r   r   r   strip)rP   r(   r   r   r   INFO_ELEMENT_REr   r   rA   rG   r     s    
zYouPornStarIE._real_extract)
r   r   r   r   r   r   r   r   r   r   rA   rA   r   rG   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/youpornzYouPorn videosr   T)r   r(   r*   r2   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 )Nbrowser   rA   r   rA   rA   rG   r   5  s   z$YouPornVideosIE._get_title_from_slugNr   rA   rA   rA   rG   r     sn    					
	;r   )r   rc   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   rA   rA   rG   <module>   s    @ P9#-03