
    V|hf`                         S SK r S SKrS SKrS SKrS SKrSSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJr  S r " S S5      r " S	 S
\5      r " S S\5      r " S S\5      rg)    N   )InfoExtractor   )ExtractorError
clean_htmldetermine_extdict_getextract_attributesfloat_or_noneint_or_nonejoin_nonemptyparse_durationstr_or_nonetry_calltry_getunified_strdateurl_or_nonec                 *    X S:  a  SS-  -  $ SS-  -  $ )Nr   r   l         )ns    S/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/xhamster.pyto_signed_32r      s#    1uu,--!u,--    c                   2    \ rS rSrS rS rS rS rS rSr	g)	_ByteGenerator   c                      [        U SU 35      U l        [	        U5      U l        g ! [         a    [        SU 35      ef = f)N_algozUnknown algorithm ID: )getattr
_algorithmAttributeErrorr   r   _s)selfalgo_idseeds      r   __init___ByteGenerator.__init__   sQ    	E%deG9,=>DO t$  	E #9'!CDD	Es	   ' A c                 4    [        US-  S-   5      =ol        U$ )Nif i_n<r   r#   r$   ss     r   _algo1_ByteGenerator._algo1&   s!     #1w;#;<<Gr   c                 x    [        XS-  -  5      n[        XS-  S-	  -  5      n[        XS-  -  5      =ol        U$ )N             r*   r+   s     r   _algo2_ByteGenerator._algo2,   sD     2g':~"456"1Q<00Gr   c                     [        US-   5      =ol        [        XS-  S-	  -  5      n[        U[        S5      -  5      n[        XS-  S-	  -  5      n[        U[        S5      -  5      n[        XS-  S-	  -  5      $ )Nl   yn< r1      l   wJ r0   l   =.e r*   r+   s     r   _algo3_ByteGenerator._algo34   s     #1z>22G:~"456\*556:~"456\*556Aj.R!7899r   c                 >    U R                  U R                  5      S-  $ )N   r!   r#   )r$   s    r   __next___ByteGenerator.__next__?   s    tww'$..r   r<   N)
__name__
__module____qualname____firstlineno__r'   r-   r4   r8   r=   __static_attributes__r   r   r   r   r      s    %	:/r   r   c                   >   \ rS rSrSrS\ S3rSSSSS	S
SSSSSSSSS\\S.S.SSSS	SSSSSSS\S\S.SS S!/00S"S#.S$.S%S&S	S'S(S)S*S*S+S\S,S\SS-.S.S/.S0S1S2.S3S1S2.S4S1S2.S5S1S2.S6S1S2.S7S1S2.S8S1S2.S9S1S2.S:S1S2.S;S1S2.S<S1S2.S=S1S2.S>S1S2.S?S1S2.S@S1S2./rSArSB r	SC r
SD rSErgF)G
XHamsterIEC   zX(?:xhamster\.(?:com|one|desi)|xhms\.pro|xhamster\d+\.(?:com|desi)|xhday\.com|xhvid\.com)zI(?x)
                    https?://
                        (?:[^/?#]+\.)?z/
                        (?:
                            movies/(?P<id>[\dA-Za-z]+)/(?P<display_id>[^/]*)\.html|
                            videos/(?P<display_id_2>[^/]*)-(?P<id_2>[\dA-Za-z]+)
                        )
                    zIhttps://xhamster.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445 e009ea6b849b129e3bebaeb9cf0dee511509445z%femaleagent-shy-beauty-takes-the-baitmp4z%FemaleAgent Shy beauty takes the baitiVzP20121014Ruseful2011ruseful2011i}     re:https?://.+\.jpgz&https://xhamster.com/users/ruseful2011 )id
display_idexttitle	timestampupload_dateuploaderuploader_idduration	age_limit	thumbnailuploader_urldescription
view_countcomment_count)urlmd5	info_dictzAhttps://xhamster.com/videos/britney-spears-sexy-booty-2221348?hd=2221348zbritney-spears-sexy-bootyzBritney Spears  Sexy Bootyi3R20130914
jojo747400   )rP   rQ   rR   rS   rT   rU   rV   rX   rY   r\   r]   rZ   r^   genericimpersonatechromem3u8)extractor_argsskip_downloadr_   ra   paramsz(http://xhamster.com/movies/5667973/.html5667973z....iV20160208
parejafreeH   z%https://xhamster.com/users/parejafree)rP   rR   rS   rT   rU   rV   rW   rX   rY   r^   r[   r\   r]   rZ   zInvalid URL)r_   ra   skipzLhttps://m.xhamster.com/videos/cute-teen-jacqueline-solo-masturbation-8559111Tr_   only_matchingzChttps://xhamster.com/movies/2272726/amber_slayed_by_the_knight.htmlz9https://it.xhamster.com/movies/7263980/la_mia_vicina.htmlz9https://pt.xhamster.com/videos/euro-pedal-pumping-7937821zIhttps://xhamster.one/videos/femaleagent-shy-beauty-takes-the-bait-1509445zJhttps://xhamster.desi/videos/femaleagent-shy-beauty-takes-the-bait-1509445zJhttps://xhamster2.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445zKhttps://xhamster11.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445zKhttps://xhamster26.com/videos/femaleagent-shy-beauty-takes-the-bait-1509445zMhttp://xhamster.com/movies/1509445/femaleagent_shy_beauty_takes_the_bait.htmlzDhttp://xhamster.com/movies/2221348/britney_spears_sexy_booty.html?hdzRhttp://de.xhamster.com/videos/skinny-girl-fucks-herself-hard-in-the-forest-xhnBJZxz4https://xhday.com/videos/strapless-threesome-xhh7yVfz&https://xhvid.com/videos/lk-mm-xhc6wn6zPhttps://xhamster20.desi/videos/my-verification-video-scottishmistress23-11937369s   xh7999c           	        ^^ [        S T 5       5      (       ac  [        R                  T5      n[        R	                  USS SSS9n[        US   U5      m[        U4S jUSS   5       5      R                  S	5      $ [        U4S
 j5      =(       d    S /S-  u  pVnU(       a  U(       d  U R                  SU S35        g US:X  aV  [        S [        UR                  5       [        R                  " U R                  5      5       5       5      R                  5       $ US:X  a  [        R                  " Xu5      $ U R                  SU SU S35        g )Nc              3   F   #    U  H  o[         R                  ;   v   M     g 7fN)string	hexdigits).0chars     r   	<genexpr>2XHamsterIE._decipher_format_url.<locals>.<genexpr>   s     ?JDv'''Js   !r   r3   littleT)	byteordersignedr   c              3   >   >#    U  H  o[        T5      -  v   M     g 7frw   )next)rz   bytebyte_gens     r   r|   r}      s     M}tDN2}s   zlatin-1c                  j   > [         R                  " T 5      R                  5       R                  S5      $ )N_)base64	b64decodedecode	partition)
format_urls   r   <lambda>1XHamsterIE._decipher_format_url.<locals>.<lambda>   s$    F$$Z0779CCCHr      zSkipping format "z": failed to decipher URLxorc              3   .   #    U  H  u  pX-  v   M     g 7frw   r   )rz   abs      r   r|   r}      s      JH !Hs   rot13z": unsupported cipher type "")allbytesfromhexint
from_bytesr   	bytearrayr   r   report_warningzipencode	itertoolscycle_XOR_KEYcodecs)	r$   r   	format_id	byte_datar&   cipher_typer   
ciphertextr   s	    `      @r   _decipher_format_urlXHamsterIE._decipher_format_url   s?   ?J???j1I>>)Aa.HT>RD%ilD9HMy}MMTTU^__%-H&J &XNRVVWZ 	#
 *"3I;>W XY% JJ%%')GHJ JJP&(S '!==99/	{:VWbVccdefr   c           
         ^ U H[  nUR                  S5      (       a  M  S H:  m[        U4S jUS   UR                  SS5      4 5       5      (       d  M4  TUS'     MY     M]     U$ )Nvcodec)av1h264c              3   6   >#    U  H  nS T S 3U;   v   M     g7f).Nr   )rz   f_urlr   s     r   r|   ,XHamsterIE._fixup_formats.<locals>.<genexpr>   s      a;`%6(!}-;`s   r_   manifest_urlrO   )getany)r$   formatsfr   s      @r   _fixup_formatsXHamsterIE._fixup_formats   s`    AuuX)aAeHaeeN\^F_;`aaa"(AhK *  r   c                   ^  T R                  U5      nUR                  S5      =(       d    UR                  S5      nUR                  S5      =(       d    UR                  S5      n[        R                  " SSU5      nT R	                  XS5      u  pgT R                  SUSS S	9nU(       a
  [        US
S9eT R                  U5      n	U 4S jn
T R                  T R                  SUSSS	9USS9nU(       Gal  US   nUS   n/ n[        5       n0 n[        US [        5      =(       d    0 nUR                  5        GH  u  nn[        U[        5      (       d  M  [        US [        5      =(       d    0 nUR                  5        H:  u  nn[        U[        5      (       d  M  [        UR!                  S5      5      UU'   M<     UR                  5        H  u  nnUS:X  a  M  Un[#        U5      nU(       a  UU;   a  M*  UR%                  U5        UR'                  U SU 3U[)        US5      U
" U5      UR!                  U5      SUR*                  0S.5        M     GM!     [        US [        5      nU(       Ga*  UR!                  S5      n[        U[        5      (       a{  S Hu  nUR!                  U5      nU(       d  M  T R-                  USU 35      nU(       a  UU;   a  MA  UR%                  U5        UR/                  T R1                  UUSS SSS!95        Mw     UR!                  S"5      n[        U[        5      (       Gab  UR                  5        GHM  u  nn[        U[2        5      (       d  M  U GH(  n [        U [        5      (       d  M  S GH  n!U R!                  U!5      n"U"(       d  M  [5        U R!                  S#5      5      =(       d#    [5        U R!                  S$5      5      =(       d    S%n[7        UU5      nT R-                  U"U5      n"U"(       a  U"U;   a  M  UR%                  U"5        [)        U"S5      n#U#S&:X  a%  UR/                  T R1                  U"USS SSS!95        M  UR'                  UU"U#U
" U5      UR!                  U5      SU"0S.5        GM	     GM+     GMP     UR!                  S'5      n$[        U$[2        5      (       a\  / n%U$ HS  n&[        U&[        5      (       d  M  U&R!                  S(5      n'[        U'[8        5      (       d  MB  U%R'                  U'5        MU     OS n%[#        [        US) 5      5      n(0 SU_SU_SU_S*UR!                  S*5      _S+[;        UR!                  S,5      5      _S-[        US. [8        5      _S/U(_S0U((       a  U(R=                  S15      S2   OS _S3UR!                  S45      _S5[;        UR!                  S55      5      _S6[;        UR!                  S75      5      _S8[;        [        US9 [>        5      5      _S:[;        [        US; [>        5      5      _S<[;        UR!                  S=5      5      _S>U	b  U	OS?_S'U%_S@T RA                  U5      _SASB0E$ T R                  / SCQUS5      n/ n[        5       nT R                  T R                  SDUSESS	9USS9nUR                  5        HN  u  nn[#        U5      nU(       d  M  UU;   a  M"  UR%                  U5        UR'                  UUU
" U5      SF.5        MP     T R                  / SGQUSHSS SI9n)U)(       a  U)U;  a  UR'                  SJU)05        [        RB                  " SKU5      nU(       a  UR                  SL5      OS n*[E        T R                  SMUSNSS95      n+T R                  SOUS-SPS	9n,T R                  SQSR/US3SS3SS9n-[G        T R                  STSU/US5SS95      n.[;        T R                  SVUSWSS95      n/[        RB                  " SXU5      nU(       a"  UR                  SY5      UR                  SZ5      4OS[u  n0n1[        RB                  " S\U5      nU(       a  UR                  S]5      OS^n2T R                  S_US'S S	9n3U3(       a1  [        RH                  " S`U35       V4s/ s H  n4[K        U45      PM     sn4OS n%0 SU_SU_SU_S*U*_SaU+_S-U,_S0U,(       a  U,RM                  5       OS _S3U-_S5U._S6U/_S8[;        U05      _S:[;        U15      _S<[;        U25      _S>U	_S'U%_S@U_$ s  sn4f )bNrP   id_2rQ   display_id_2z^(https?://(?:.+?\.)?)m\.z\1z2<div[^>]+id=["\']videoClosed["\'][^>]*>(.+?)</div>errordefaultT)expectedc           	      :   > [        TR                  SU SS S95      $ )Nz
^(\d+)[pP]heightr   )r   _search_regex)r,   r$   s    r   
get_height,XHamsterIE._real_extract.<locals>.get_height   s+    t11q(D  2  : ; ;r   )z.window\.initials\s*=\s*({.+?})\s*;\s*</script>z"window\.initials\s*=\s*({.+?})\s*;initialsz{}F)fatal
videoModelrS   c                     U S   $ )Nsourcesr   xs    r   r   *XHamsterIE._real_extract.<locals>.<lambda>  s    q|r   c                     U S   $ )Ndownloadr   r   s    r   r   r     s    a
mr   sizer   -rI   Referer)r   r_   rR   r   filesizehttp_headersc                     U S   S   $ )NxplayerSettingsr   r   r   s    r   r   r     s    A&7$8$Cr   hls)r_   fallbackzhls-m3u8_native)entry_protocolm3u8_idr   standardqualitylabelrO   ri   
categoriesnamec                     U S   S   $ )NauthorpageURLr   r   s    r   r   r   `  s    (I@Vr   r\   rT   createdrV   c                     U S   S   $ )Nr   r   r   r   s    r   r   r   h  s    Qx[%8r   r[   rW   /r   rZ   thumbURLrX   r]   views
like_countc                     U S   S   $ )Nratinglikesr   r   s    r   r   r   o  s    Qx[%9r   dislike_countc                     U S   S   $ )Nr   dislikesr   r   s    r   r   r   q  s    Qx[%<r   r^   commentsrY   rM   r   _format_sort_fields)resprototbr)z<h1[^>]*>([^<]+)</h1>z6<meta[^>]+itemprop=".*?caption.*?"[^>]+content="(.+?)"zY<title[^>]*>(.+?)(?:,\s*[^,]*?\s*Porn\s*[^,]*?:\s*xHamster[^<]*| - xHamster\.com)</title>zsources\s*:\s*({.+?})\s*,?\s*\nr   )r   r_   r   )z(file\s*:\s*(?P<q>["'])(?P<mp4>.+?)(?P=q)z<<a\s+href=(?P<q>["'])(?P<mp4>.+?)(?P=q)\s+class=["']mp4Thumbz3<video[^>]+file=(?P<q>["'])(?P<mp4>.+?)(?P=q)[^>]*>z	video url)groupr   r_   z!<span>Description: </span>([^<]+)r   z:hint=["\'](\d{4}-\d{2}-\d{2}) \d{2}:\d{2}:\d{2} [A-Z]{3,4}zupload datez><span[^>]+itemprop=["\']author[^>]+><a[^>]+><span[^>]+>([^<]+)	anonymousz:["']thumbUrl["']\s*:\s*(?P<q>["'])(?P<thumbnail>.+?)(?P=q)z=<video[^>]+"poster"=(?P<q>["'])(?P<thumbnail>.+?)(?P=q)[^>]*>)r   r   zA<[^<]+\bitemprop=["\']duration["\'][^<]+\bcontent=["\'](.+?)["\']zRuntime:\s*</span>\s*([\d:]+)z%content=["\']User(?:View|Play)s:(\d+)z
view countzChint=[\'"](?P<likecount>\d+) Likes / (?P<dislikecount>\d+) Dislikes	likecountdislikecount)NNz0</label>Comments \((?P<commentcount>\d+)\)</div>commentcountr   z+(?s)<table.+?(<span>Categories:.+?)</table>z<a[^>]+>(.+?)</a>rU   )'_match_valid_urlr   resub_download_webpage_handle_html_search_regexr   _rta_search_parse_jsonr   setr   dictitems
isinstancer   r   r   addappendr   r_   r   extend_extract_m3u8_formatslistr   r   strr   splitr   r   searchr   r   findallr   lower)5r$   r_   mobjvideo_idrQ   desktop_urlwebpageurlhr   rY   r   r   videorS   r   format_urlsformat_sizesr   r   formats_dictdownload_sourcesr   format_dictformat_itemr   xplayer_sourceshls_sourceshls_format_keyhls_urlstandard_sources
identifierformats_liststandard_formatstandard_format_keystandard_urlrR   categories_listr   cc_namer[   	video_urlr\   rU   rV   rZ   rX   r]   r   r   r^   categories_htmlcategorys5   `                                                    r   _real_extractXHamsterIE._real_extract   s 
   $$S)::d#9tzz&'9ZZ-KN1K
ff95#F55kL''AWd ( ,  66$$W-		; ##89@*   E $ # \*E'NEG%KLe%;TBHbG+2==?'	<!,55#*74KT#R#XVX ,<,B,B,D(G[%k488 ,9+//&:Q,RL) -E -9,>,>,@(G[ J. !!,J!,Z!8J%{)B OOJ/NN(1{!G9%=),Z?",W"5$0$4$4W$=%txx)	$ 	 -A ,;8 &CTKO-11%8k400*="-//."A&$"&";";GtNK[E\"]&'[*@$#0t'A'A#Xu]$) (B (8 9 +> $3#6#6z#B .554D4J4J4L0
L),==$/;O#-ot#D#D (7J 3/>/B/BCV/W'3$,+67J7J97U+V ,1.9/:M:Mg:V.W,1.0 !( -:*g,N	/3/H/HW`/a'3|{7R$, + =&3L%&H#&&=$+NN43M3M(4hVc05U 4N 4D %E %- '1:+7+..8.A0<0@0@0I(1<5&	0" 	!#' 8K 0< 5MH $ii5O/400
(A%a.. UU6]F!&#.."))&1 ) "
&wu6V'WXLhj  uyy7	
 [9)=> G8#?  l|11#6r:PT UYYz2 K		*(=> k%))G*<= k'93+@ A  W<c.C "D"  UYYz-B!C#$ )*?YR%& j'( 4..w7)* &'>+ 4 ''k W	 e""2GY   E	 # #
 &-]]_!Iz$Z0J[(OOJ'NN&!$Y/  &5 &&I [t	 ' =	
 +5NNy 
 yy=wG'+djjm%d&8&8I]% '9 '1 2 **MZ + 6 &&NQS[[ ' B	
 "$"4"4Q-/07e #5 #% &
 !!3!34\ "4 "0 1
 yy_ahi_ctzz+'>

>@Z&[iu#]yyLgV6:

>2,,:G$ - ( 8G <>:: /<3 4 <3xj* <3 4LP 	
(
*
 U
 ;	

 ;
 
 x8>>+T
 
 
 *
 +j1
 [7
 [7
 
 *
  w!
 	
4s   d	r   N)r?   r@   rA   rB   _DOMAINS
_VALID_URLr   _TESTSr   r   r   r(  rC   r   r   r   rE   rE   C   s   jH''/j 1J [1A<#%%(/D 
* S51#%$/ 
   )=8**EF#
#. :#%$' C/
  ', ^
 U
 K K
 [ \ \ ] ] _ V d F 8 bUmF^ H2v
r   rE   c                       \ rS rSrS\R
                   S3rS/rSSSS\S	S
SSSSSSSS\S.S./r	SSSSS\S	SSSSSSSS\S .S!S"0S#./r
S$ rS%rg&)'XHamsterEmbedIEi  https?://(?:[^/?#]+\.)?z/xembed\.php\?video=(?P<id>\d+)z_<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?xhamster\.com/xembed\.php\?video=\d+)\1z,http://xhamster.com/xembed.php?video=33285393328539rI   zPen MasturbationrO   zpen-masturbationieS20140728ManyakisArtr3   rM   rN   manyakisartz&https://xhamster.com/users/manyakisart)rP   rR   rS   r^   r\   rQ   rT   rU   rV   rX   rY   rZ   rW   r[   r]   )r_   ra   z https://xhamster.com/awards/2023xh2VnYnz"xHamster Awards 2023 - The Winnersz xhamster-awards-2023-the-winnersi$  z$re:https?://ic-vt-nss\.xhcdn\.com/.+iUe20231116xHamsterxhamsterz#https://xhamster.com/users/xhamster)rP   rR   rS   rY   r^   r\   rQ   rX   rZ   rT   rU   rV   rW   r[   r]   rk   ri   rl   c                    U R                  U5      nU R                  X5      nU R                  SU SU S3USS S9nU(       d/  U R                  U R                  SUS5      U5      n[	        US5      nU R                  US	5      $ )
Nz(href="(https?://xhamster\.com/(?:movies/z/[^"]*\.html|videos/[^/]*-z)[^"]*)"zxhamster urlr   zvars\s*:\s*({.+?})\s*,\s*\nvars)downloadLinkhomepageLinkcommentsLinkshareUrlXHamster)	_match_id_download_webpager   r   r	   
url_result)r$   r_   r  r  r%  player_varss         r   r(  XHamsterEmbedIE._real_extract  s    >>#&((7&&7zA[\d[eemn^T ' 3	 **""#A7FSK !.jkIy*55r   r   N)r?   r@   rA   rB   rE   r*  r+  _EMBED_REGEXr   r,  _WEBPAGE_TESTSr(  rC   r   r   r   r.  r.    s    +J,?,?+@@_`JvwL=' ,#%%/(D
 F, 29 <@#%"%A
" #F+) N.6r   r.  c                   ~    \ rS rSrS\R
                   S3rSSS0SS.S	SS
0SS.SSS0SS.SSS.SSS./rS rS r	Sr
g)XHamsterUserIEi  r/  z./(?:(?P<user>users)|creators)/(?P<id>[^/?#&]+)z/https://xhamster.com/users/netvideogirls/videosrP   netvideogirlsi  )r_   ra   playlist_mincountz+https://xhamster.com/users/firatkaan/videos	firatkaanr   z.https://xhamster.com/creators/squirt-orgasm-69zsquirt-orgasm-69.   z!https://xhday.com/users/mobhunterTrs   z!https://xhvid.com/users/pelushe21c              #     #    U(       a  SOSu  p4SU SU SU S3n[         R                  " S5       GH  nU R                  XQSU 35      n[        R                  " SU5       H  n[        U5      n	[        U	R                  S	5      5      n
U
(       a  [        R                  U
5      (       d  MK  [        R                  U
5      nU R                  U
[        R                  5       US
9v   M     [        R                  " SU5      nU(       d    g [        UR                  S5      5      n[        UR                  S	5      5      nU(       a  GM    g    g 7f)N)usersvideos)creators	exclusivezhttps://xhamster.com/r   z/1r   zDownloading page z;(<a[^>]+class=["\'].*?\bvideo-thumb__image-container[^>]+>)href)ier  z <a[^>]+data-page=["\']next[^>]+>r   )r   countr@  r   r
  r
   r   r   rE   suitabler?  rA  ie_keyr	  r   )r$   user_idis_userprefixsuffixnext_page_urlpagenumpage	video_tagr  r%  r  r  	next_pages                 r   _entriesXHamsterUserIE._entries8  s)    07,=V/xq	6("M q)G))*;G9(EGDZZR	 +95'		&(9:	 
(;(;I(F(F%//	:oo*"3"3"5 & J J 99@$GD*4::a=9I'	f(=>M =' *s   EE	Ec                     U R                  U5      R                  SS5      u  p#U R                  U R                  U[	        U5      5      U5      $ )NuserrP   )r   r   playlist_resultr_  bool)r$   r_   rb  rV  s       r   r(  XHamsterUserIE._real_extractP  sC    --c288F##DMM'4:$FPPr   r   N)r?   r@   rA   rB   rE   r*  r+  r,  r_  r(  rC   r   r   r   rG  rG    s    +J,?,?+@@noJ A/
 ! =+
  @$
   3 3/F80Qr   rG  )r   r   r   r   rx   commonr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   rE   r.  rG  r   r   r   <module>rh     se       	  !   $."/ "/JT
 T
n=6m =6@8Q] 8Qr   