
    h)                         d dl Z 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	 n# e
$ r ej                            e          Zej                            ej                            ej                            e                              Zee j        vre j                            d e           d dlm	Z	 Y nw xY w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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| _        |                                 | _        i | _        |                                  d S )Nzhttps://zh.boyfriend.show/z!application/json, text/plain, */*zzh-CN,zh;q=0.9,en;q=0.8zPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0)OriginRefererAcceptzAccept-Languagez
User-Agent)hostheadersdecode_key_compactstripchat_key_hash_cachecreate_session_with_retry)selfextendorigins      3   /storage/emulated/0/纯福利/PY1/boyfriend.show.pyinitzSpider.init   sg    ,	 |||98l
 
 "4466&&(((((    c                     dS )NBoyfriend Show r   s    r   getNamezSpider.getName'   s    r   c                 F    t          t          j        d|                    S )Nz(m3u8|mp4)(?:\?|$))boolresearchr   urls     r   isVideoFormatzSpider.isVideoFormat*   s    BI3S99:::r   c                     dS )NFr   r    s    r   manualVideoCheckzSpider.manualVideoCheck-   s    ur   c                 \    	 | j                                          d S # t          $ r Y d S w xY wN)sessionclose	Exceptionr    s    r   destroyzSpider.destroy0   sC    	L      	 	 	DD	s    
++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)r2   r5   r6   r7   c                 4    i | ]}|d |dk    rz   ndgS )tagr6   )keyvaluer   ).0tidVALUE	VALUE_MENs     r   
<dictcomp>z&Spider.homeContent.<locals>.<dictcomp>L   sI     
 
 
 %se||)e*;*;QVWWX
 
 
r   )classfiltersr   )r   filterCLASSESTIDSrN   rJ   rK   s        @@r   homeContentzSpider.homeContent6   s   &7;;#	::&599&7;;	
 !566!122!122!233!788!233$<==!122	
 11!677
	 4
 
 
 
 

 
 

 
 
 	
r   c                     g S r,   r   r    s    r   homeVideoContentzSpider.homeVideoContentU   s    	r   c                 |    d}|t          |          dz
  z  } j         d| d| d| d}d|v r|d|d         z   d	z   z  }                     |                                          } 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=falserE   z&filterGroupTags=%5B%5B%22z	%22%5D%5Dc           	         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.org/thumbs/snapshotTimestampr   idstatuspublic    🎫vod_idvod_namevod_picvod_remarks)strstripcountry_code_to_flagget)rH   vodr   s     r   
<listcomp>z*Spider.categoryContent.<locals>.<listcomp>_   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jsonrj   )r   rI   pgrO   r   rr   offsetr'   rspvideosrs   s   `          r   categoryContentzSpider.categoryContentX   s    #b''A+&  @  @V[  @  @ek  @  @y|  @  @  @F??/&-?+MMC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userr]   rZ   isLiver`   u
    已下播r`   r`   show	createdAtgroupShowAnnouncementstartAtz%Y-%m-%dT%H:%M:%SZ   )hoursu   %m月%d日 %H:%Mu   🎫 始于 topic	avatarUrlr   $)rc   rd   re   vod_directorrf   vod_play_fromvod_play_urlro   )ru   r   rv   rg   rh   ri   rj   r   strptimer   strftime)r   arrayrY   ry   infor~   r]   rZ   r   flagremarkr   r   BJtimerk   s                  r   detailContentzSpider.detailContentr   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   rF   returnc                 $   ddddd}|                     d          }t          |          dk    rK|                    |d                                                   x}r||d                                         fS d|                                fS )	Nr2   r5   r6   r7   )GCMTrW   )maxsplitr   )splitlenrj   upperrh   )r   rF   tagspartsrE   s        r   process_keyzSpider.process_key   s    95wGG		1	%%u::>>dhhuQx~~/?/?&@&@@s>a((((ciikk!!r   1c                     i }t          |          dk    r|S                      |          \  }} j         d| d| }                     |                                          } fd|                    dg           D             |d<   |S )NrW   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   rY   rZ   r[   r\   r   r]   r^   r_   r`   ra   rb   )rg   rh   ri   )rH   r~   r   s     r   rl   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   rm   ro   )rt   r   r   ru   rv   rj   )r   rF   quickrw   resultrE   r'   ry   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 }	t	          |          D ]\  }
}|                    d          r:|                    d          x}r#t          |          dk    r|d	         |d
         }}d|v r|                    d          dz   }|                    d|          }|||         }||
dz            }| d| d| }|                                  dt          |           }|	
                    ||g           |	dd| j        dS )Nz#https://edge-hls.doppiocdn.net/hls/z/master/z"_auto.m3u8?playlistType=lowLatency
r   z#EXT-X-MOUFLON::         z#EXT-X-STREAM-INFzNAME="   "rW   z&psch=z&pkey=z&url=0r`   )r'   parsecontentTypeheader)ru   textrh   r   	enumerate
startswithr   findgetProxyUrlr   r   r   )r   r   r]   vipFlagsr'   ry   linespschpkeyurlsiliner   
name_startname_endqnurl_basefull_url	proxy_urls                      r   playerContentzSpider.playerContent   s   fBfffffjjoo  &&t,,
d '' 	- 	-GAt011 8 JJsOO+5 85zzQ%*1XuQxd"d**!YYx0014
99S*55*X-. Q<&@@d@@$@@#//11IIhII	RO,,,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`   z#EXT-X-MOUFLON:FILEzapplication/vnd.apple.mpegur)r   ru   status_coder$   subr   process_m3u8_content_v2)r   paramr'   datas       r   
localProxyzSpider.localProxy   s    eEl##zz#s""::bf%57JCPPQQDs""****y D((//55D3T::r   c                    |                                                     d          }t          |          D ]\  }}|                    d          rd||dz            v r|                    dd          d                                          }	 |                     || j                  }n&# t          $ r |                     |d          }Y nw xY w||dz                                d|          ||dz   <   d                    |          S )Nr   z#EXT-X-MOUFLON:FILE:z	media.mp4rW   r   r   Zokee2OhPh9kugh4)	rh   r   r   r   decryptr   r/   replacejoin)r   m3u8_contentr   r   r   encrypted_datadecrypted_datas          r   r   zSpider.process_m3u8_content_v2   s   ""$$**400 '' 	Q 	QGAt 677 QK5QRUVQV<<W<W!%C!3!3A!6!<!<!>!>V%)\\.$BT%U%UNN  V V V%)\\.BT%U%UNNNV$QU|33KPPa!eyys   B)) CC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   )rH   cs     r   rl   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   ri   zSpider.country_code_to_flag   sS    |!!)=)=)?)?!WW]]P\]]]^^
r   c                     d}t          j        |                              d          }t          d |                    d          D                       }|                    d          S )Nz@NTEgNzUgNjUgNjEgNmUgMzQgNjMgNjEgNjkgMzkgNjIgNmYgNGEgNjEgMzUgNjE=utf-8c              3   6   K   | ]}t          |d           V  dS )   N)rt   )rH   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   sa    W
":..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   rF   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   rF   padding
hash_bytesr   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  )rs   backoff_factorstatus_forcelist)max_retrieszhttp://zhttps://)requestsSessionr-   r	   adaptersHTTPAdaptermount)r   retry_strategyadapters      r   r   z Spider.create_session_with_retry  s    '))666
 
 

 #//N/KK9g...:w/////r   c                 F    | j                             || j        d          S )N
   )r   timeout)r-   rj   r   r&   s     r   ru   zSpider.fetch  s!    |T\2FFFr   N)r   )r   )__name__
__module____qualname__r   r!   r(   r*   r0   rR   rT   r{   r   rg   r   r   r   r   r   r   ri   r   r   r   r   r   ru   r   r   r   r   r      s       ) ) ) )     ; ; ;    
 
 
>  
 
 
4  8"s "uS#X " " " "   &
 
 
<
; 
; 
;
  
  
   ) ) )% % % % % %/S /s /s / / / /"	0 	0 	0G G G G Gr   r   )sysr$   osr   r   r  typingr   base.spiderr   ModuleNotFoundErrorpathabspath__file__CURRENT_FILEdirnamePROJECT_ROOTinsertr   r   urllib.parser   r   urllib3.util.retryr	   r   r   r   r   <module>r     s                       #""""""" # # #7??8,,L7??27??27??<3P3P#Q#QRRL38##<(((""""""""# ) ( ( ( ( ( ( ( ' ' ' ' ' ' ' ' $ $ $ $ $ $    yG yG yG yG yGV yG yG yG yG yGs   ' BB=<B=