
    Qi)                         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	m
Z
 d dlmZmZ d dlmZ e j                            d            G d d	e          ZdS )
    N)Tuple)Spider)datetime	timedelta)quoteunquote)Retryz..c                       e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zdedeeef         fdZddZd Zd Z ej        d          Zd Zd Zd ZdedefdZdededefdZd Zd ZdS )r   {}c                     d}|| _         || ddd| _        d| _        |                     d          | _        |                     d          | _        i | _        |                                  d S )Nzhttps://zh.stripchat.com/zPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0)OriginRefererz
User-AgentH265z@NDUgNTEgNzUgNjUgNjUgNDcgNjggMzIgNmIgNjEgNjUgNzcgNjEgMzMgNjMgNjg=z@NGYgNmYgNmIgMzcgNzEgNzUgNjEgNjkgNGUgNjcgNjkgNzkgNzUgNjggNjEgNjk=)hostheadersstripchat_preferredVideoCodecdecode_key_compactstripchat_decrypt_keystripchat_auth_key_hash_cachecreate_session_with_retry)selfextendorigins      1   /storage/emulated/0/纯福利/PY1/py_stripchat.pyinitzSpider.init   s    +	 |||l
 

 .4*%)%<%<=  &A  &A""&"9"9:|"}"}&&(((((    c                     d S N r   s    r   getNamezSpider.getName#       r   c                     d S r    r!   r   urls     r   isVideoFormatzSpider.isVideoFormat&   r$   r   c                     d S r    r!   r"   s    r   manualVideoCheckzSpider.manualVideoCheck)   r$   r   c                     d S r    r!   r"   s    r   destroyzSpider.destroy,   r$   r   c           
          ddddddddddd	dg}d
dddddddddddddddddddddddfddddddfd}fd |D             }||d!S )"Nu
   女主播ggirls)	type_nametype_idu   情侣ccouplesu
   男主播mmenu
   跨性别ttransu   中国tagLanguageChinese)nvu   亚洲ethnicityAsianu   白人ethnicityWhiteu   拉丁ethnicityLatinou   混血ethnicityMultiracialu   印度ethnicityIndianu	   阿拉伯ethnicityMiddleEasternu   黑人ethnicityEbonyu   情侣sexGayCouplesu   直男orientationStraight)r.   r1   r2   r3   c                 4    i | ]}|d |dk    rz   ndgS )tagr2   )keyvaluer!   ).0tidVALUE	VALUE_MENs     r   
<dictcomp>z&Spider.homeContent.<locals>.<dictcomp>4   sI     
 
 
 %se||)e*;*;QVWWX
 
 
r   )classfiltersr!   )r   filterCLASSESTIDSrJ   rF   rG   s        @@r   homeContentzSpider.homeContent/   s   !-'BBR[hqDrDr  CO  \a  ub  ub  r~  KR  dS  dS  T&:;;8Rb=c=cks  {K  fL  fL  T\  ct  Nu  Nu  }E  Lb  wc  wc  ks  zK  eL  eL  T_  f~  N  N  GO  Vf  Ag  Ag  h#/::(Qf<g<gh	3
 
 
 
 

 
 

 
 
 	
r   c                     d S r    r!   r"   s    r   homeVideoContentzSpider.homeVideoContent=   r$   r   c                 v    d}|t          |          dz
  z  } j         d| d| d| d}d|v r| d|d          d	}                     |                                          } fd
|                    dg           D             }	t          |                    dd                    }
|	||
|z   dz
  |z  ||
dS )N<      z:/api/front/models?improveTs=false&removeShows=false&limit=z&offset=z&primaryTag=zA&sortBy=stripRanking&rcmGrp=A&rbCnGr=true&prxCnGr=false&nic=falserA   z&filterGroupTags=[["z"]]c           	         g | ]}t          |d                                                                        t          |d                                                              t          |d                                                     d|d          d|d          |                    d          dk    rdnd	d
S )usernamecountry!https://img.doppiocdn.net/thumbs/snapshotTimestampr   idstatuspublic    🎫vod_idvod_namevod_picvod_remarks)strstripcountry_code_to_flagget)rD   vodr   s     r   
<listcomp>z*Spider.categoryContent.<locals>.<listcomp>G   s     
 
 
  c*o..4466#88S^9L9L9R9R9T9TUUuWZ[^_i[jWkWkWqWqWsWsuuesCV?WeeZ]^bZcee%(WWX%6%6(%B%Brr	 
 
 
r   modelsfilteredCountr   )listpage	pagecountlimittotal)intr   fetchjsonrf   )r   rE   pgrK   r   rn   offsetr'   rspvideosro   s   `          r   categoryContentzSpider.categoryContent@   s!   #b''A+&  @  @V[  @  @ek  @  @y|  @  @  @F??@@fUm@@@Cjjoo""$$
 
 
 
 wwx,,
 
 
 CGGOQ//00%-!+5
 
 	
r   c           	      <   |d         }|                      | j         d| d                                          }|d         }|d         d         }t          |d                   }t          |d                                                   }|d         rd	nd
}|                     |          }	d\  }
}|                    d          x}r|                    d          }n,|                    d          x}r|                    d          }|r>t          j        |d          t          d          z   
                    d          }d| }
|t          |d                                                   t          |d                   |	 | | |
d| d| d}d|giS )Nr   z/api/front/v2/models/username/z/camcamuserrY   rV   isLiver\   u
    已下播r\   r\   show	createdAtgroupShowAnnouncementstartAtz%Y-%m-%dT%H:%M:%SZ   )hoursu   %m月%d日 %H:%Mu   🎫 始于 topic	avatarUrl	StripChat$)r_   r`   ra   vod_directorrb   vod_play_fromvod_play_urlrk   )rq   r   rr   rc   rd   re   rf   r   strptimer   strftime)r   arrayrU   ru   inforz   rY   rV   r{   flagremarkr   r}   BJtimerg   s                  r   detailContentzSpider.detailContentY   s   8jjDISSXSSSTTYY[[5z6{6"d__d9o&&,,..H~7<((11 88F###4 	*hh{++GGXX5666T 	*hhy))G 	-'1EFFYZI[I[I[[eefxyyF,F,,FDM**00224,--#7X7v77!(!LLBLL
 
 r   rB   returnc                 $   ddddd}|                     d          }t          |          dk    rK|                    |d                                                   x}r||d                                         fS d|                                fS )	Nr.   r1   r2   r3   )GCMTrS   )maxsplitr   )splitlenrf   upperrd   )r   rB   tagspartsrA   s        r   process_keyzSpider.process_keyu   s    95wGG		1	%%u::>>dhhuQx~~/?/?&@&@@s>a((((		##r   1c                     i }t          |          dk    r|S                      |          \  }} j         d| d| }                     |                                          } fd|                    dg           D             |d<   |S )NrS   z1/api/front/v4/models/search/group/username?query=z&limit=900&primaryTag=c           	      <   g | ]}|d          
t          |d                                                                       t          |d                                                              |d          d|d          d|d          |d         dk    rd	nd
dS )r{   rU   rV   rW   rX   r   rY   rZ   r[   r\   r]   r^   )rc   rd   re   )rD   rz   r   s     r   rh   z(Spider.searchContent.<locals>.<listcomp>   s     	
 	
 	
 H~	
d:.//5577#88T)_9M9M9S9S9U9UVVjX\]gXhjjgtDW?Xgg[_`d[egg%)(^x%?%?rrV	 	
 	
 	
r   ri   rk   )rp   r   r   rq   rr   rf   )r   rB   quickrs   resultrA   r'   ru   s   `       r   searchContentzSpider.searchContent|   s    r77Q;;M##C((SmmSmmhkmmjjoo""$$	
 	
 	
 	
 "--	
 	
 	
v r   c                    |                      d| d| d          }|j                                                            d          }d\  }}g }d}	t	          |          D ]\  }
}|                    d          r>|	s<|                    d          x}r%t          |          d	k    r|d
         |d         }}d}	d|v r|                    d          dz   }|                    d|          }|||         }||
dz            }| d| d| d| j         }| 	                                 dt          |           }|                    ||g           |dd| j        dS )Nz#https://edge-hls.doppiocdn.net/hls/z/master/z"_auto.m3u8?playlistType=lowLatency
r|   Fz#EXT-X-MOUFLON::         Tz#EXT-X-STREAM-INFzNAME="   "rS   z&psch=z&pkey=z&preferredVideoCodec=z&url=0r\   )r'   parsecontentTypeheader)rq   textrd   r   	enumerate
startswithr   findr   getProxyUrlr   r   r   )r   r   rY   vipFlagsru   linespschpkeyr'   mouflon_processediliner   
name_startname_endqnurl_basefull_url	proxy_urls                      r   playerContentzSpider.playerContent   s   jjqrqq2qqqrr  &&t,,
d! '' 	, 	,GAt011 1:K 1 JJsOO+5 15zzQ%*1XuQxd,0)"d**!YYx0014
99S*55*X-. Q<&yydyy$yyUYUwyy#//11IIhII	

B	?+++l	
 
 	
r   c                 &   t          |d                   }|                     |          }|j        dk    r)|                     t          j        dd|                    }|j        dk    rg dS |j        }d|v r|                     |          }dd|gS )	Nr'   i  z(_\d+p\d*)?\.m3u8z_160p_blurred.m3u8   )i  z
text/plainr\   #EXT-X-MOUFLON:URI:zapplication/vnd.apple.mpegur)r   rq   status_coderesubr   process_m3u8)r   paramr'   ru   datas        r   
localProxyzSpider.localProxy   s    eEl##jjoo?c!!**RV$8:NPSTTUUC?c!!****x D(($$T**D3T::r   z6https://media-hls\.doppiocdn\.\w+/b-hls-\d+/media\.mp4c                 x   |                                                     d          }t          |          D ]\  }}|                    d          rd||dz            v r|                    dd          d                                          }t	          j        dd|          }|                    d	d          }|d         }|d d d
         }	|                     |	| j                  }
|	                    ||
          }| j
                            |||dz                      ||dz   <   d                    |          S )Nr   r   z	media.mp4rS   r   r   z(_part\d+)?\.mp4$r\   _)rd   r   r   r   r   r   rsplitdecryptr   replaceURL_PATTERNjoin)r   contentr   r   r   mouflonencrypted_strippedr   	encryptedreversed_encrypted	decryptedreplacements               r   r   zSpider.process_m3u8   s1   %%d++ '' 		P 		PGAt 566 P;%PQTUPU,;V;V**S!,,Q/5577%'V,@"g%N%N"*11#q99!!H	%.ttt_" LL);T=WXX	%ooiCC#/33[%A,OOa!eyyr   c                     t          |          dk    s|                                s|S d                    d |D                       }|S )Nr   r\   c                     g | ]C}t          t          |                                          t          d           z
  dz             DS )Ai )chrordr   )rD   cs     r   rh   z/Spider.country_code_to_flag.<locals>.<listcomp>   s>    ]]]1c#aggii..3s88";g"EFF]]]r   )r   isalphar   )r   country_code
flag_emojis      r   re   zSpider.country_code_to_flag   sS    |!!)=)=)?)?!WW]]P\]]]^^
r   c                     t          j        |                              d          }t          d |                    d          D                       }|                    d          S )Nutf-8c              3   6   K   | ]}t          |d           V  dS )   N)rp   )rD   hex_strs     r   	<genexpr>z,Spider.decode_key_compact.<locals>.<genexpr>   s,      MMw#gr**MMMMMMr    )base64	b64decodedecodebytesr   )r   
base64_strdecoded	key_bytess       r   r   zSpider.decode_key_compact   s\    ":..55g>>MM'--:L:LMMMMM	(((r   c                     || j         vrWt          j                    }|                    |                    d                     |                                | j         |<   | j         |         S )u   计算并缓存SHA-256哈希r   )r   hashlibsha256updateencodedigest)r   rB   r   s      r   compute_hashzSpider.compute_hash   s^    d&&&^%%FMM#**W--...$*MMOODS!$$r   encrypted_b64c                 b   t          |          dz  }|r|dd|z
  z  z  }|                     |          }t          j        |          }t	                      }t          |          D ]5\  }}||t          |          z           }	|                    ||	z             6|                    d          S )Nr   =r   )r   r   r   r   	bytearrayr   appendr   )
r   r   rB   padding
hash_bytesencrypted_datadecrypted_bytesr   cipher_bytekey_bytes
             r   r   zSpider.decrypt   s    m$$q( 	1SAK00M &&s++
)-88 $++'77 	; 	;NA{!!c*oo"56H"";#9::::%%g...r   c                 
   t          j                    | _        t          ddg d          }t           j                            |          }| j                            d|           | j                            d|           d S )Nr   g333333?)i  i  i  i  i  )ro   backoff_factorstatus_forcelist)max_retrieszhttp://zhttps://)requestsSessionsessionr	   adaptersHTTPAdaptermount)r   retry_strategyadapters      r   r   z Spider.create_session_with_retry   s    ')) 888
 
 

 #//N/KK9g...:w/////r   c                 F    | j                             || j        d          S )N
   )r   timeout)r  rf   r   r&   s     r   rq   zSpider.fetch   s!    |T\2FFFr   N)r   )r   )__name__
__module____qualname__r   r#   r(   r*   r,   rN   rP   rw   r   rc   r   r   r   r   r   r   compiler   r   re   r   r   r   r   r   rq   r!   r   r   r   r      s       ) ) ) )        
 
 
  
 
 
2  8$s $uS#X $ $ $ $   &
 
 
<
; 
; 
; "*VWWK       ) ) )
% % % % % %/S /s /s / / / /"	0 	0 	0G G G G Gr   r   )sysr   r   r   r
  typingr   base.spiderr   r   r   urllib.parser   r   urllib3.util.retryr	   pathr   r!   r   r   <module>r     s                    ( ( ( ( ( ( ( ( ' ' ' ' ' ' ' ' $ $ $ $ $ $    fG fG fG fG fGV fG fG fG fG fGr   