o
    Øi^,                     @   sD   d dl Z d dlZd dlZejd d dlmZ G dd deZdS )    Nz..)Spiderc                   @   s   e Zd Zdd Zd*ddZdd Zdd	 Zd
d ZdZdd Z	dd Z
dd Z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&d'Zd(d) ZdS )-r   c                 C      dS )Nu   樱花动漫 selfr   r   ,   /storage/emulated/0/lz/py/sy/樱花动漫.pygetName      zSpider.getName c                 C      d S Nr   )r   extendr   r   r   init   r	   zSpider.initc                 C   r   NFr   )r   urlr   r   r   isVideoFormat   r	   zSpider.isVideoFormatc                 C   r   r   r   r   r   r   r   manualVideoCheck   r	   zSpider.manualVideoCheckc                 C   r   r   r   r   r   r   r   destroy   r	   zSpider.destroyzhttps://www.dmvvv.comc                 C   s
   dddS )NzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zhttps://www.dmvvv.com/
User-AgentRefererr   r   r   r   r   
getHeaders   s   zSpider.getHeadersc                 C   s   dd l }dd l}ddlm}m} ||}||jdd}|jr%|d |j }| }|jj	|j
d|d}	|	jd||  d	 |	 }
|
 jd
dd}|	  |S )Nr   )urlparsequotez/:@!$&'()*+,;=)safe?   )timeoutcontextGET)headerszutf-8ignore)errors)http.clientsslurllib.parser   r   pathquerycreate_default_contextclientHTTPSConnectionnetlocrequestr   getresponsereaddecodeclose)r   r   httpr$   r   r   parsedr&   ctxconnrespdatar   r   r   _get$   s   zSpider._getc                 C   s   t |trAt|dkrA|d }t |tr?|dr?zt||ds$dnd d }W |S  ty>   |	d
d}Y |S w |S t |tr`z
t|d }W |S  ty_   |d}Y |S w t|}|S )u6   兼容 spider_runner 传入未解析的 JSON 字符串r   []r
   z["'z"']z[]"')
isinstancelistlenstr
startswith_jsonloadsendswith	Exceptionlstriprstripstrip)r   idsvidr   r   r   	_parse_id4   s*   "
	
zSpider._parse_idc                 C   0   t dt | d |}|r|d S dS )N<span>u   ：</span><em>([^<]+)</em>   r
   researchescapegrouprE   r   htmllabelmr   r   r   _li_emF      zSpider._li_emc                 C   rI   )NrJ   u   ：</span>([^<]+)rK   r
   rL   rQ   r   r   r   	_li_plainJ   rV   zSpider._li_plainc                 C   sJ   g }t d|t j}|D ]\}}}}||| | | d q|S )Nzd<li>\s*<a href="(/detail/\d+/)"[^>]*title="([^"]+)"[^>]*>.*?data-original="([^"]+)".*?<p>([^<]*)</p>vod_idvod_namevod_picvod_remarks)rM   findallDOTALLappendrE   )r   rR   videositemshreftitlecoverremarksr   r   r   _parse_home_listN   s   
zSpider._parse_home_listc                 C   s.   ddddddddddd	dg}|i d
S )NZguomanu   国产动漫)type_id	type_nameZrimanu   日本动漫Zomanu   欧美动漫Zdmfilmu   动漫电影)classfiltersr   )r   filterclassesr   r   r   homeContent_   s   
zSpider.homeContentc              
   C   s   z.|  | jd }| |}t }g }|D ]}|d |vr)||d  || qd|iW S  tyD } z
dg iW  Y d }~S d }~ww )N/rY   r;   )r7   BASE_URLrf   setaddr_   rB   )r   rR   r`   seenuniquever   r   r   homeVideoContenti   s   


zSpider.homeVideoContentNc                 C   s|   |rt dt | d |}|rtdd |D S t d|}|r+tdd |D S t d|}|r<tdd |D S d	S )
u$   解析分页区域，提取总页数/type/z/(\d+)/c                 s       | ]}t |V  qd S r   int.0xr   r   r   	<genexpr>}       z+Spider._parse_page_count.<locals>.<genexpr>z/type/[^/]+/(\d+)/c                 s   rx   r   ry   r{   r   r   r   r~      r   z[?&]page(?:no)?=(\d+)c                 s   rx   r   ry   r{   r   r   r   r~      r   N)rM   r]   rO   max)r   rR   tidrT   m2m3r   r   r   _parse_page_countx   s   zSpider._parse_page_countc           
   
   C   s   zP|rt |nd}|dkr| jd | d }n| jd | d t| d }| |}| |}| ||}|d u rFt|dkrD|d n|}|||d|d dW S  tyf }	 z
dg iW  Y d }	~	S d }	~	ww )NrK   rw   rn   $   r;   page	pagecountlimittotalr;   )rz   ro   r=   r7   rf   r   r<   rB   )
r   r   pgrk   r   r   rR   r`   max_pgru   r   r   r   categoryContent   s(   

zSpider.categoryContentc                 C   s  |  |}z| | j| }d}td|tj}|r!|d }|s7td|}|r7|ddd  }d}td|}|rF|d}| 	|d}	| 
|d	}
| 
|d
}| 
|d}| 
|d}d}td|tj}|r|tdd|d }td|}td|tj}g }g }t|D ]5\}}|t|k r||  ndt|d  }td|}|sqdd |D }|| |d| q||||
||||	|d|d|d}d|giW S  ty } z
dg iW  Y d }~S d }~ww )Nr
   z'<div class="detail">.*?<h2>([^<]+)</h2>rK   z<title>([^<]+)-r   z6<div class="cover">\s*<img[^>]+data-original="([^"]+)"u   状态u   年份u   地区u   类型u   主演z2class="blurb"[^>]*>.*?<span>[^<]+</span>(.*?)</li>z<[^>]+>z/<i class="iconfont icon-shipin"></i>([^<]+)</a>z0<div class="row"[^>]*>\s*<ul>(.*?)</ul>\s*</div>u   线路z(<a href="(/play/[^"]+)"[^>]*>([^<]+)</a>c                 S   s    g | ]\}}|  d  | qS )$)rE   )r|   rb   epr   r   r   
<listcomp>   s     z(Spider.detailContent.<locals>.<listcomp>#z$$$)rY   rZ   r[   vod_yearvod_areaZvod_type	vod_actorr\   vod_contentvod_play_fromvod_play_urlr;   )rH   r7   ro   rM   rN   r^   rP   rE   splitrU   rW   subr]   	enumerater<   r=   r_   joinrB   )r   rF   rG   rR   rc   tt2rd   cre   yeararearh   actordescdZ	tab_namesZ
row_blocksZsources_fromZsources_urliblockZtab_namelinksepisodesvodru   r   r   r   detailContent   sj   

(
zSpider.detailContentFrK   c              
   C   s  zddl m} ||}|rt|nd}|dkr| jd | }n| jd | d t| }| |}g }td|tj}	|	D ]C}
t	d|
}t	d|
}t	d	|
}t	d
|
}|r[|s\q=|
|d|d |rq|d nd|r{|d ndd q=t	d|}|rt|d}|d d }ntd|}|rtdd |D nt|dkr|d n|}|||d|d dW S  ty } z
dg iW  Y d }~S d }~ww )Nr   )r   rK   z/search/?wd=z&pageno=z<li>\s*<a class="cover".*?</li>z&<a class="cover" href="(/detail/\d+/)"ztitle="([^"]+)"zdata-original="([^"]+)"u/   <div class="item"><span>状态：</span>([^<]*)r
   rX   u   找到\s*<em>(\d+)</em>      zpageno=(\d+)c                 s   rx   r   ry   r{   r   r   r   r~      r   z'Spider.searchContent.<locals>.<genexpr>r   r;   )r%   r   rz   ro   r=   r7   rM   r]   r^   rN   r_   rP   rE   r   r<   rB   )r   keywordquickr   r   kwr   rR   r`   ZlisliZhref_mZtitle_mZcover_mZ	remarks_mZtotal_mtotal_countr   Zpnosru   r   r   r   searchContent   sN   

.zSpider.searchContentc           	   
   C   s   zJ| dr|n| j| }| |}td|}|r.d|d|  d | jd ddW S td	|}|rBd|d|  dW S d||  dW S  tyd } zd||  dW  Y d }~S d }~ww )
Nr1   zurl:\s*'(https?://[^']+)'r   rK   r   rn   r   )parser   headerz+(https?://[^\s\'"]+\.m3u8(?:\?[^\s\'">]*)?))r>   ro   r7   rM   rN   rP   r   rB   )	r   flagidvipFlagsr   rR   rT   r   ru   r   r   r   playerContent  s&   

	zSpider.playerContent)r
   r   )FrK   )__name__
__module____qualname__r   r   r   r   r   ro   r   r7   rH   rU   rW   rf   rm   rv   r   r   r   r   r   r   r   r   r   r   	   s(    



A.r   )rM   sysjsonr?   r&   r_   base.spiderr   r   r   r   r   <module>   s   