U
    ñhµ1  ã                   @   s”   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Zd dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZmZ G dd„ deƒZdS )	é    N)Ú	urlencodeÚquote)ÚSpider)ÚAESÚ
PKCS1_v1_5)ÚRSA)ÚpadÚunpadc                       sÒ   e Zd Z‡ fdd„Zdd„ Zd-dd„Zdd	„ Zd
d„ Zdd„ Zd.dd„Z	e
e
dœdd„Ze
e
dœdd„Ze
edœdd„Ze
edœdd„Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd/d%d&„Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS )0r   c                    s8   t ƒ  ¡  d| _d| _d| _d| _d| _d| _d| _d S )Nzhttps://api-h5.uvod.tvzhttps://www.uvod.tvÚ s   abcdefghijklmnopa”  -----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ4FBai1Y6my4+fc
8AD5tyYzxgN8Q7M/PuFv+8i1Xje8ElXYVwzvYd1y/cNxwgW4RX0tDy9ya562V33x
6SyNr29DU6XytOeOlOkxt3gd5169K4iFaJ0l0wA4koMTcCAYVxC9B4+zzS5djYmF
MuRGfYgKYNH99vfY7BZjdAY68ty5AgMBAAECgYB1rbvHJj5wVF7Rf4Hk2BMDCi9+
zP4F8SW88Y6KrDbcPt1QvOonIea56jb9ZCxf4hkt3W6foRBwg86oZo2FtoZcpCJ+
rFqUM2/wyV4CuzlL0+rNNSq7bga7d7UVld4hQYOCffSMifyF5rCFNH1py/4Dvswm
pi5qljf+dPLSlxXl2QJBAMzPJ/QPAwcf5K5nngQtbZCD3nqDFpRixXH4aUAIZcDz
S1RNsHrT61mEwZ/thQC2BUJTQNpGOfgh5Ecd1MnURwsCQQDFhAFfmvK7svkygoKX
t55ARNZy9nmme0StMOfdb4Q2UdJjfw8+zQNtKFOM7VhB7ijHcfFuGsE7UeXBe20n
g/XLAkEAv9SoT2hgJaQxxUk4MCF8pgddstJlq8Z3uTA7JMa4x+kZfXTm/6TOo6I8
2VbXZLsYYe8op0lvsoHMFvBSBljV0QJBAKhxyoYRa98dZB5qZRskciaXTlge0WJk
kA4vvh3/o757izRlQMgrKTfng1GVfIZFqKtnBiIDWTXQw2N9cnqXtH8CQAx+CD5t
l1iT0cMdjvlMg2two3SnpOjpo7gALgumIDHAmsVWhocLtcrnJI032VQSUkNnLq9z
EIfmHDz0TPTNHBQ=
-----END PRIVATE KEY-----
a  -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeBQWotWOpsuPn3PAA+bcmM8YD
fEOzPz7hb/vItV43vBJV2FcM72Hdcv3DccIFuEV9LQ8vcmuetld98eksja9vQ1Ol
8rTnjpTpMbd4HedevSuIhWidJdMAOJKDE3AgGFcQvQePs80uXY2JhTLkRn2ICmDR
/fb32OwWY3QGOvLcuQIDAQAB
-----END PUBLIC KEY-----
)	ÚsuperÚ__init__Úbase_urlÚweb_urlÚtokenÚ_ivÚ_client_privateZ_client_publicÚ_server_public©Úself©Ú	__class__© ú$/storage/emulated/0/lz/py/sy/UVod.pyr   
   s    
   zSpider.__init__c                 C   s   dS )NZUVODr   r   r   r   r   ÚgetName-   ó    zSpider.getNamer
   c                 C   s|   z8t |tƒr$| ¡  d¡r$t |¡nt |tƒr2|ni }W n tk
rP   i }Y nX | d| j	¡| _	| d| j
¡| _
|  d¡S )NÚ{r   r   F)Ú
isinstanceÚstrÚstripÚ
startswithÚjsonÚloadsÚdictÚ	ExceptionÚgetr   r   ÚhomeContent)r   ÚextendZcfgr   r   r   Úinit/   s     8 
 zSpider.initc                    s   ˆ rt ‡ fdd„dD ƒƒS dS )Nc                 3   s   | ]}|ˆ   ¡ kV  qd S ©N)Úlower)Ú.0Úx©Úurlr   r   Ú	<genexpr>5   s     z'Spider.isVideoFormat.<locals>.<genexpr>)z.m3u8z.mp4F)Úany)r   r-   r   r,   r   ÚisVideoFormat5   r   zSpider.isVideoFormatc                 C   s   dS )NFr   r   r   r   r   ÚmanualVideoCheck6   r   zSpider.manualVideoCheckc                 C   s   d S r(   r   r   r   r   r   Údestroy7   r   zSpider.destroyé    c                    s(   t jt j ‰ d ‡ fdd„t|ƒD ƒ¡S )Nr
   c                 3   s   | ]}t  ˆ ¡V  qd S r(   )ÚrandomÚchoice)r*   Ú_©Úcharsr   r   r.   ;   s     z%Spider._random_key.<locals>.<genexpr>)ÚstringÚascii_lettersÚdigitsÚjoinÚrange)r   Únr   r7   r   Ú_random_key9   s    zSpider._random_key)Ú
plain_textÚreturnc                 C   s‚   |   d¡ d¡}tj|tj| jd}t | t	| d¡tj
ƒ¡¡ d¡}t | j¡}t |¡}t | |¡¡ d¡}|› d|› S )Nr3   úutf-8©ZivÚ.)r?   Úencoder   ÚnewÚMODE_CBCr   Úbase64Ú	b64encodeZencryptr   Ú
block_sizeÚdecoder   Ú
import_keyr   r   )r   r@   Úaes_keyÚcipherÚct_b64Zrsa_pubZ
rsa_cipherÚrsa_b64r   r   r   Ú_encrypt=   s    $ 
zSpider._encrypt)Úenc_textrA   c           	      C   sŽ   zp|  d¡}|\}}t | j¡}t |¡ t |¡d ¡}t	j|t	j
| jd}t| t |¡¡t	jƒ}| dd¡W S  tk
rˆ   | Y S X d S )NrD   rC   rB   Úignore)Úsplitr   rL   r   r   rF   ZdecryptrH   Ú	b64decoder   rG   r   r	   rJ   rK   r#   )	r   rR   ÚpartsrO   rP   Zrsa_privrM   rN   Úptr   r   r   Ú_decryptE   s    
  zSpider._decrypt)ÚpathÚpayloadc              	   C   s¨  t tt ¡ d ƒƒ}| jpd}|dkrF| dd¡}d|› d|› }n0|dkrÄ| d	¡}|r‚tt |ƒdd
 ¡ }d|› d|› }n@| dd¡}| dd¡}	| dd¡}d|› d|	› d|› d|› }n²|dkræd| dd¡› d|› }n|dkr2| dd¡}
| dd¡}| dd¡}d|
› d|› d|› d|› }nDdd „ |p@i  ¡ D ƒ}tt	| ¡ ƒd!d" ¡ }|› d|› d|› }t
 | d#¡¡ ¡ }d$|||| j| jd% d&d'd(œS ))Niè  r
   ú/video/latestÚparent_category_idée   z-parent_category_id=ú-ú/video/listÚkeyword)Úsafez	-keyword=z2&need_fragment=1&page=1&pagesize=42&sort_type=asc-Úpageé   Úpagesizeé*   z-page=z
&pagesize=z&parent_category_id=z&sort_type=asc-ú/video/infoz-id=Úidú/video/sourceÚqualityÚvideo_fragment_idÚvideo_idz	-quality=z&video_fragment_id=z
&video_id=c                 S   s   i | ]\}}|d kr||“qS ))r   Ú0r
   FNr   )r*   ÚkÚvr   r   r   Ú
<dictcomp>Y   s       z)Spider._build_headers.<locals>.<dictcomp>T)ÚdoseqrB   zapplication/jsonú/z*/*úoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36)zContent-TypezX-TOKENzX-TIMESTAMPzX-SIGNATUREÚOriginÚRefererÚAcceptú
User-Agent)r   ÚintÚtimer   r$   r   r)   Úitemsr   ÚsortedÚhashlibÚmd5rE   Ú	hexdigestr   )r   rY   rZ   Útsr   Z	parent_idÚtextr`   rb   rd   ri   Úfragment_idrk   ZfilteredÚqueryÚsigr   r   r   Ú_build_headersO   s4     
 
      
      zSpider._build_headersc           
   	   C   sî   | j  d¡| }zÂ|  tj|dd¡}|  ||¡}| j|||dd}|jdksT|jsZW d S |j 	¡ }d }z|  
|¡}	t |	¡}W n(   zt |¡}W n   Y nX Y nX t|tƒrÎ| d¡dkrÎ| d	¡W S W d S  tk
rè   Y d S X d S )
Nrq   F)Úensure_asciié   )ÚdataÚheadersÚtimeoutéÈ   Úerrorr   r†   )r   ÚrstriprQ   r    Údumpsrƒ   ÚpostÚstatus_coder   r   rX   r!   r   r"   r$   r#   )
r   rY   rZ   r-   Úbodyr‡   ÚrspÚtxtÚobjÚdecr   r   r   Ú	_post_api]   s,      
  
     zSpider._post_apic              	   C   sè   |   di ¡}t|tƒr.| d¡p4| d¡p4g n|p4g }g }|D ]`}| d¡p^| d¡p^| d¡}| d¡p|| d¡p|| d	¡}|r>|r>| t|ƒt|ƒd
œ¡ q>|sàddd
œddd
œddd
œddd
œddd
œddd
œddd
œg}d|iS )Nz/video/categoryÚlistÚcategoryrg   Úcategory_idÚvalueÚnameÚlabelÚtitle)Ú	type_nameÚtype_idu   ç”µå½±Z100u	   ç”µè§†å‰§Z101u   ç»¼è‰ºZ102u   åŠ¨æ¼«Z103u   ä½“è‚²Z104u	   çºªå½•ç‰‡Z105u   ç²¤å°ä¸“åŒºZ106Úclass)r”   r   r"   r$   Úappendr   )r   Úfilterr†   ÚlstÚclassesÚitÚcidr™   r   r   r   r%   l   s     *    <zSpider.homeContentc              	   C   sò   |   dddi¡}t|tƒrH| d¡pD| d¡pD| d¡pD| d¡pDg }nt|tƒrX|}ng }g }|D ]„}| d¡p„| d	¡p„| d
¡}|rd| t|ƒ| d¡pª| d¡pªd| d¡pÊ| d¡pÊ| d¡pÊd| d¡pà| d¡pàddœ¡ qdd|iS )Nr[   r\   r]   Zvideo_latest_listr•   Úrowsry   rg   rk   ÚvideoIdr›   r™   r
   ÚposterÚcoverÚpicÚscoreZremarks©Úvod_idÚvod_nameÚvod_picÚvod_remarks)r”   r   r"   r$   r•   rŸ   r   )r   r†   r¡   Úvideosrm   Úvidr   r   r   ÚhomeVideoContentt   s    
 .
  `zSpider.homeVideoContentc                 C   sr  t |ƒ ¡ rt|ƒnd}t |ƒd d d d d dd |ddddœ}t|tƒrddD ]}| |¡rH|| ||< qH|  d|¡}t|tƒr´| d¡p¤| d	¡p¤| d
¡p¤| d¡p¤g }	| dd¡}
nt|tƒrÈ|}	d}
n
g d }	}
g }|	D ]†}| d¡pú| d¡pú| d¡}|rÚ| t |ƒ| d¡p$| d¡p$d| d¡pJ| d¡pJ| d¡pJd| d¡pXddœ¡ qÚ||dd|
dœS )Nrc   r
   re   Úasc)r\   r—   ÚlanguageÚyearÚregionÚstater`   Úpaidrb   rd   Ú
sort_fieldÚ	sort_type)r—   rµ   r¶   r·   r`   r_   Ú
video_listr•   r¥   ry   Útotali?B r   rg   rk   r¦   r›   r™   r§   r¨   r©   rª   r«   i'  é   )r•   rb   Ú	pagecountÚlimitr¼   )	r   Úisdigitrw   r   r"   r$   r”   r•   rŸ   )r   ÚtidÚpgr    r&   rb   rZ   rm   r†   r¡   r¼   r°   r±   r   r   r   ÚcategoryContent   s(    "

 
 , 
  
 bzSpider.categoryContentc                 C   sj  |d }|   dd|i¡pi }t|tƒr2| di ¡ni }t|tƒrL| dg ¡ng }g }|rÀ|D ]b}| dd¡}| dd¡}	| d	g ¡}
|	r\|
r\|
r˜t|
ƒnd
}| |› d|› d|	› d|› d¡ q\|sÔ| d|› ¡ t|ƒ| d¡pð| d¡pðd| d¡p| d¡p| d¡pd| d¡p$d| d¡p2d| d¡pL| d¡pLddd |¡d dœ}d|giS )Nr   rf   rg   ÚvideoZvideo_fragment_listÚsymbolu   æ’­æ”¾r
   Ú	qualitiesé   ú$ú|z|[ú]u   æ’­æ”¾$r›   r™   r§   r¨   r©   rµ   ÚdurationÚdescriptionÚdescu   ä¼˜æ±ðŸ‘æºú#z$$$)r¬   r­   r®   Úvod_yearr¯   Úvod_contentÚvod_play_fromÚvod_play_urlr•   )r”   r   r"   r$   ÚmaxrŸ   r   r<   )r   Úidsr±   r†   Z
video_infoZ	fragmentsÚ	play_urlsÚfragmentr™   r€   rÆ   Zmax_qualityÚvodr   r   r   ÚdetailContent   s"          $ ŒzSpider.detailContentÚ1c                 C   s$  t |ƒ ¡ rt|ƒnd}d d d d d d |d |dddddœ}|  d|¡}t|tƒr|| d¡px| d¡px| d	¡px| d
¡pxg }nt|tƒrŒ|}ng }g }|D ]‚}	|	 d¡p¸|	 d¡p¸|	 d¡}
|
r˜| t |
ƒ|	 d¡pÞ|	 d¡pÞd|	 d¡p|	 d¡p|	 d¡pd|	 d¡pddœ¡ q˜d|iS )Nrc   re   r
   r³   )r\   r—   r´   rµ   r¶   r·   r`   r¸   rb   rd   r¹   rº   Zneed_fragmentr_   r»   r•   r¥   ry   rg   rk   r¦   r›   r™   r§   r¨   r©   rª   r«   )	r   rÀ   rw   r”   r   r"   r$   r•   rŸ   )r   ÚkeyÚquickrÂ   rb   rZ   r†   r¡   r°   rm   r±   r   r   r   ÚsearchContentœ   s     
 .
  ^zSpider.searchContentc                 C   sp   |sd S t |tƒr,| ¡ }|  |¡r(|S d S t |ttfƒrlt |tƒrL| ¡ n|D ]}|  |¡}|rP|  S qPd S r(   )r   r   r   r0   r"   r•   ÚvaluesÚ_extract_first_media)r   r’   Úsrn   Úrr   r   r   rÞ   ©   s     
  
 
zSpider._extract_first_mediac                 C   s&  |  d¡}|d }t|ƒdkr˜|d }|d  d¡ dd¡}d	d
„ |  d¡D ƒ}|r\|d nd}	|t|ƒ ¡ rvt|ƒn|t|	ƒ ¡ rŒt|	ƒn|	d dœ}
n|ddd dœ}
|  d|
¡p´i }| di ¡ dd¡pô| d¡pô| d¡pô| d¡pô|  	|¡pôd}|sd|dœS d| j
d | j
dœ}d||dœS )NrÉ   r   é   rc   é   z[]ú r
   c                 S   s   g | ]}|  ¡ r|  ¡ ‘qS r   )r   )r*   Úqr   r   r   Ú
<listcomp>µ   s      z(Spider.playerContent.<locals>.<listcomp>ú,Ú4)rk   rj   ri   ÚseekrÇ   rh   rÄ   r-   ÚplayUrlÚplay_url)Úparser-   rr   rq   )rv   rt   rs   )rë   r-   Úheader)rT   Úlenr   Úreplacer   rÀ   rw   r”   r$   rÞ   r   )r   Úflagrg   ÚvipFlagsrV   rk   r€   Zqualities_strrÆ   ri   rZ   r†   r-   r‡   r   r   r   ÚplayerContent²   s    
    8@ 
zSpider.playerContentc                 C   s   d S r(   r   )r   Úparamr   r   r   Ú
localProxy¾   r   zSpider.localProxy)r
   )r3   )rÙ   )Ú__name__Ú
__module__Ú__qualname__r   r   r'   r0   r1   r2   r?   r   rQ   rX   r"   rƒ   r”   r%   r²   rÃ   rØ   rÜ   rÞ   rñ   ró   Ú__classcell__r   r   r   r   r   	   s&   #



	r   )Úsysr    rx   rH   r4   r9   r{   Úurllib.parser   r   Úbase.spiderr   ZCrypto.Cipherr   r   ZCrypto.PublicKeyr   ZCrypto.Util.Paddingr   r	   r   r   r   r   Ú<module>   s   8