U
    hc                     @   sl   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 e j	
d d dlmZ G dd deZdS )	    N)datetime)SequenceMatcher)quoteunquotez..)Spiderc                4   @   s  e 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 Zdd Zdd Zdd Zdd Zdd ZdfddZdfd d!Zd"d# Zd$d% Zd&Zd'd(d)Zd*d+d,d-d.d/d0d1d/d2d3d/d4d5d/gd6d7d8d-d.d/d2d9d/d4d:d/d;d5d/gd6d<d=d-d.d/d0d>d/d?d@d/gd6dAdBd-d.d/d4dCd/dDd5d/gd6dEdFd-d.d/d0dGd/dHdFd/dIdJd/gd6dKdLd-d.d/d0dMd/dNdOd/dPdQd/dRdSd/gd6dTdUd-d.d/dVdWd/dXdYd/dZd[d/d\d]d/d^d_d/d`dad/dbdcd/ddded/dfdgd/dhdid/djdkd/dldmd/dndod/dpdqd/drdsd/gd6dtdud-d.d/dvdwd/dxdyd/dzd{d/d|d}d/d~dd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/g'd6gd+d,d-d.d/d0d1d/d2d3d/d4d5d/gd6d7d8d-d.d/d2d9d/d4d:d/d;d5d/gd6d<d=d-d.d/d0d>d/d?d@d/gd6dAdBd-d.d/d4dCd/dDd5d/gd6dEdFd-d.d/d0dGd/dHdFd/dIdJd/gd6dTdUd-d.d/dVdWd/dXdYd/dZd[d/d\d]d/d^d_d/d`dad/dbdcd/ddded/dfdgd/dhdid/djdkd/dldmd/dndod/dpdqd/drdsd/gd6dtdud-d.d/dvdwd/dxdyd/dzd{d/d|d}d/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/g(d6gd7d8d-d.d/d0dd/ddd/d4d:d/d2d9d/ddd/ddd/dNdd/ddd/dRdd/ddd/ddd/dd5d/gd6dEdFd-d.d/d0dGd/dHdFd/dIdJd/gd6dtdud-d.d/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/dxdyd/dzd{d/gd6ddUd-d.d/ddWd/ddYd/dd[d/dd]d/dd_d/d dad/ddcd/dded/ddd/ddkd/ddmd/ddod/ddqd/d	dsd/gd6gd7d8d-d.d/d
dd/d2d9d/d4d:d/dNdd/dRdd/dd5d/gd6dEdFd-d.d/d0dGd/dHdFd/dIdJd/gd6dtdud-d.d/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/ddd/dd d/d!d"d/ddd/ddd/ddd/d#d$d/ddd/gd6ddUd-d.d/ddWd/ddYd/dd[d/dd]d/dd_d/d dad/ddcd/dded/ddd/ddkd/ddmd/ddod/ddqd/d	dsd/gd6gdEdFd-d.d/d0dGd/dHdFd/dIdJd/gd6dtdud-d.d/ddd/d%d&d/d'd(d/d)d*d/d+d,d/ddd/d-d.d/d/d0d/d1d2d/ddd/ddd/d3d4d/d5d6d/ddd/d7d8d/d9d:d/gd6gd;iZd<S (=  r   c                 C   s   dS )N
   B站番剧 selfr   r   ,   /storage/emulated/0/lz/py/sy/哔哩视频.pygetName   s    zSpider.getNamec                 C   s(   zt || _W n   i | _Y nX d S N)jsonloads
extendDict)r
   extendr   r   r   init   s    zSpider.initc                 C   s   d S r   r   r	   r   r   r   destroy   s    zSpider.destroyc                 C   s   d S r   r   )r
   urlr   r   r   isVideoFormat   s    zSpider.isVideoFormatc                 C   s   d S r   r   r	   r   r   r   manualVideoCheck   s    zSpider.manualVideoCheckc                 C   s  i }dddddd}g }|D ]}| ||| d q||d< |r| jd	 |d
< t j}|d
 D ]r}|d
 | D ]^}|d dkr*|d D ]}	|	d  rt|	d |k r |d |	}
t|t|	d dD ]@}|d 	|
dt
| dt
|d  dt
|d |
d7 }
q qq qqqv|d dkrv|d D ]}	|	d  r>t|	d |k r|d |	}
t|t|	d dD ]B}|d 	|
dt
| dt
|d  dt
|d |
d7 }
q qvn qvq>qvqd|S )N14275)u   番剧u   国创   电影u   综艺u	   电视剧)	type_nametype_idclassfilterfilterskeyyearvaluen[,   )vr%   release_datez-01-01 00:00:00,z-01-01 00:00:00))appendconfigr   nowr#   isdigitintindexrangeinsertstr)r
   r    result
cateManualclasseskZcurrentYearZresultfilterrfZrfvposr#   r   r   r   homeContent   sP    

4

4zSpider.homeContentc                 C   s   |  dddi S )Nr   F)categoryContentr	   r   r   r   homeVideoContentL   s    zSpider.homeVideoContentc                 C   s4  t |}i }g }| d\}}}d|||}	|D ] }
|	d|
 dt||
  7 }	q2| j|	| j|dd}t| |j	}|d d }|D ]T}t
|d	  }| | |d
 }|d  }|d  }|||||d qt|}|d d dkr|d }n|}||d< ||d< ||d< ||d< ||d< |S )N{}zohttps://api.bilibili.com/pgc/season/index/result?order=2&sort=0&pagesize=20&type=1&st={}&season_type={}&page={}&=   headerscookiestimeoutdatalist	season_idtitlecover
index_showvod_idvod_namevod_picvod_remarksZhas_nextr)   page	pagecountlimittotal)r2   	getCookieformatr   fetchheaderr   r   	cleanTexttextr6   stripremoveHtmlTagsr.   len)r
   cidrS   r    extr7   videoscookie_r   r"   rrH   vodListvodaidrK   imgremark	lenvideosrT   r   r   r   r>   O   s>    

zSpider.categoryContentc              	   C   s4  |d }d |}| j|| jdd}t| |j}|| |d d |d d |d d |d d	 d
d| |d d d}|d d }d}|D ]v}|d }	|d }
| |d dddd}t	
dt	|d d }|dr|dd  }|d |||	|
 }qd|d< |d|d< d |gi}|S )!Nr   z9http://api.bilibili.com/pgc/view/web/season?season_id={0}
   rE   rG   r7   rK   rL   Zshare_sub_titleactors
u   ，evaluate)rO   rP   rQ   r   	vod_actorvod_contentepisodes idr`   Z
share_copy#-$*z%H:%M:%Sdurationi  z00:   z[{}]/{}${}_{}#r   vod_play_fromvod_play_urlrI   )rX   rY   rZ   r   r   r[   r\   r^   replacetimestrftimegmtime
startswithr]   )r
   didr   re   rH   rg   	videoListplayUrlvideoZeidr`   namerj   r7   r   r   r   detailContentq   s8    



zSpider.detailContentc                 C   s   |  ||dS )Nr   )searchContentPage)r
   r"   quickr   r   r   searchContent   s    zSpider.searchContentc                 C   s  g }d}d| j kr| j d }d| j krR| j| j d dd}d| krR| d }|dkr`d}n*t|tkr|dr| j|ddj }zt|tkrtj	|dd	}W n   Y nX | 
|\}}}d
| d| }| j|| j|dd}t| |j}	d|	d krd|idfS |	d d }
|
D ]}t|d  }| | |d }td || dk rr||krrq&|d d d  }| |d  }|||||d q&d|i}|S )Nrt   rc   r   rl   rG   r@   httpFensure_asciizWhttps://api.bilibili.com/x/web-interface/search/type?search_type=media_bangumi&keyword=z&page=rC   rD   r7   rH   rI   r)   rJ   rK   g333333?epsr   rL   rM   rN   )r   rY   r   typer6   r   r\   r]   dictdumpsrW   rZ   r   r[   r^   r   ratior.   )r
   r"   r   rS   rb   rc   re   rd   r   rH   rf   rg   ZsidrK   ri   rj   r7   r   r   r   r      sR    


  zSpider.searchContentPagec              
   C   sr  i }| d}|d }|d }d||}d}	| j}
d|
krD|
d }	d|
krv| j|
d dd	}d| krv| d }	|	dkrd
}	n*t|	tkr|	dr| j|	dd	j	 }	zt|	t
krtj|	dd}	W n   Y nX | |	\}}}tt|}d|
krt|
d }nd}d|d< d|d< d| dt| d| d| d| 
|d< | j|d< d||d< d|d< |S )Nrd   r   r)   zchttps://api.bilibili.com/pgc/player/web/playurl?ep_id={0}&cid={1}&qn=120&fnval=4048&fnver=0&fourk=1rt   rc   r   rl   r   r@   r   Fr   thread0parser   z3http://127.0.0.1:9978/proxy?do=py&type=mpd&cookies=&url=&aid=&cid=&thread=r   rZ   z/https://api.bilibili.com/x/v1/dm/list.so?oid={}danmakuapplication/dash+xmlrX   )splitrX   r   rY   r   r   r6   r   r\   r]   r   r   rW   r   rZ   )r
   flagpidvipFlagsr7   ZpidListrh   r`   r   rc   r   re   cookiesDictrd   rF   r   r   r   r   playerContent   sD    

*
zSpider.playerContentc                 C   s0   |d dkr|  |S |d dkr,| |S d S )Nr   mpdmedia)proxyMpd
proxyMedia)r
   paramsr   r   r   
localProxy   s
    

zSpider.localProxyc           
   
   C   s  |  |\}}}|dkr"dd|gS |}|d d d }z8| j|| jddd	}|j}z|  W n   Y nX W n   z|  W n   Y nX d
}|D ]Z}z| j|| jddd	}|j}W n   d
}Y nX |dkr qz|  W q   Y qX qY nX |dkr*| jdkr*|  jd7  _| |d | j }	d|krJ|d |	d< d|krh||	d< ddd |	gS dd| j||	ddjgS d S )Nr      r   durlr   
backup_urlTr)   rE   streamrG     r4   Rangez127.0.0.1:7777Locationi.  z
video/MP2T   application/octet-streamrE   r   )	getDashrY   rZ   status_codecloseretryr   copycontent)
r
   r   r   	durlinfos	mediaTyper   Zdurlinfore   
statusCoderZ   r   r   r   r      sP    






zSpider.proxyMpdFc              
   C   s  |  |\}}}d|kr:t|d }|d | }|d }n4d|krdt|d }|d | }|d }n
dddgS z8| j||d	 d
d}	|	j}
z|	  W n   Y nX W n   z|	  W n   Y nX d}
|d D ]^}z| j|| jd
dd}	|	j}
W n   d}
Y nX |
dkr q4z|	  W q   Y qX qY nX |
dkrj| jdkrj|  jd7  _| |d
 | j }d|kr|d |d< dd| j||d
dj	gS )Nvideoidr   baseUrlaudioidaudior   z
text/plainrt   rE   Tr   	backupUrlr)   r   r   r   r4   r   r   r   )
r   r2   rY   r   r   rZ   r   r   r   r   )r
   r   forceRefreshrd   	dashinfosr   dashinfor   r   re   r   rZ   r   r   r   r     sT    








zSpider.proxyMediac           %      C   sZ  |d }|d }t |d }d|kr.|d }nd}| j }| d|d  t|d }d| d	| }	|rz| |	 n$| |	}
|
r|
d
 |
d |
d fS | }| j|||dd}t| 	|j
}
|
d dkrdi dfS d|
d kr|
d d d d }z t| jd|ddd }W n   tt d }Y nX t|dkrz| d W n   | d Y nX dt| d| }| |	|d|
d |d ||
d dfS |
d d }|d }|d  }d}d}g }|d! D ]}z t| jd|d" dd}W n   tt d }Y nX || |d# }|d$ }|d% }|d& }|d' }|d( }| }||d)< d*tt| d+t| d,| d-| d.| 
}|d/| d0| d1| d2| d3| d4| d5| d6|d7 d8  d9|d7 d:  d; }|d7 }qd}d} |d< D ]}!z t| jd|!d" dd}W n   tt d }Y nX || |!d$ }|!d# }|!d( }"| }#| |#d=< d*tt| d+t| d,| d-| d>|  
}|d?| d0| d3|" d5| d6|!d7 d8  d9|!d7 d:  d; }| d7 } q
d@| dA| dB|  dC|  dD	}$t|d }| |	dE|$dFdG||dH |$dFdG|dEfS )INrh   r`   r   r   r   debugrF   ZbilimdmpdCache_rd   r   r   r   rC   rF   rE   rG   codert   dashr7   r   zdeadline=(\d+))regsrcr)   <   iX  zhttp://127.0.0.1:7777zhttp://127.0.0.1:9978/gozhttp://127.0.0.1:7777?url=r   mp4)r   r   r   	expiresAtrz   minBufferTimer   r   codecs	bandwidth	frameRateheightwidthru   r   z5http://127.0.0.1:9978/proxy?do=py&type=media&cookies=r   r   r   z	&videoid=z"	      <Representation bandwidth="z
" codecs="z" frameRate="z
" height="z" id="z	" width="z">
	        <BaseURL>z-</BaseURL>
	        <SegmentBase indexRange="SegmentBase
indexRangez#">
	        <Initialization range="Initializationz5"/>
	        </SegmentBase>
	      </Representation>
r   r   z	&audioid=z<	      <Representation audioSamplingRate="44100" bandwidth="z<?xml version="1.0" encoding="UTF-8"?>
	<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" type="static" mediaPresentationDuration="PTzS" minBufferTime="PTzS">
	  <Period>
	    <AdaptationSet mimeType="video/mp4" startWithSAP="1" scanType="progressive" segmentAlignment="true">
	      z|
	    </AdaptationSet>
	    <AdaptationSet mimeType="audio/mp4" startWithSAP="1" segmentAlignment="true" lang="und">
	      z+
	    </AdaptationSet>
	  </Period>
	</MPD>r   rA   z&amp;)r   r   r   r   )r   rZ   r   setCacher   r   delCachegetCacherY   r[   r\   r2   regStrgroupr   r   r.   r   r]   minr~   )%r
   r   r   rh   r`   r   r   rZ   
cookieDictr"   rH   rF   re   purlr   r   rz   r   	videoinfor   deadlineListr   deadliner   r   r   r   r   void	vidparamsr   	audioinfor   r   aoid	aidparamsr   r   r   r   r   C  s    



  
0(


 
0


zSpider.getDashc           
      C   s<  d|krd|krt |}ntdd |ddD }| d}|rb|d }|d }|||fS d	d
i}| jd||dd}t |j}|d }	|	dkr|d d d ddd dd }|d d d ddd dd }| 	d||t
t d d |||fS | jd|dd}|j }d}d}|||fS )N{}c                 S   s   g | ]}|  d dqS )rB   r)   )r]   r   ).0cor   r   r   
<listcomp>  s     z$Spider.getCookie.<locals>.<listcomp>;bbloginimgKeysubKey
User-AgentrMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36z+http://api.bilibili.com/x/web-interface/navrl   r   r   r   rH   wbi_imgimg_url/r)   .sub_urli  )r   r   r   zhttps://www.bilibili.com/rC   rm   rt   )r   r   r   r]   r   r   rY   r\   rsplitr   r2   r   rF   get_dict)
r
   rc   rF   r   r   r   rZ   re   rH   r   r   r   r   rW     s0    

 
&& 

zSpider.getCookiec                 C   s$   ddl m}m} |d}||d|S )Nr   )subcompilez<.*?>rt   )rer   r   )r
   r   r   r   cleanr   r   r   r^     s    zSpider.removeHtmlTagsr   r   zhttps://www.bilibili.com)r   Refererr    Zseason_versionu   类型z-1u   全部r+   r   u   正片r   r   3u   其他)r"   r   r$   areau   地区u   日本u   美国z1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70Z	is_finishu   状态u   完结r   u   连载	copyrightu   版权u   独家z1,2,4Zseason_statusu   付费u   免费z2,6z4,6u	   大会员Zseason_monthu   季度u   1月r   u   4月r   u   7月10u   10月r#   u   年份z[2023,2024)2023z[2022,2023)2022z[2021,2022)2021z[2020,2021)2020z[2019,2020)2019z[2018,2019)2018z[2017,2018)2017z[2016,2017)2016z[2015,2016)2015z[2010,2015)z	2014-2010z[2005,2010)z	2009-2005z[2000,2005)z	2004-2000z[1990,2000)u   90年代z[1980,1990)u   80年代z[,1980)u   更早Zstyle_idu   风格Z10010u   原创Z10011u	   漫画改Z10012u	   小说改Z10013u	   游戏改Z10102u   特摄Z10015u	   布袋戏Z10016u   热血Z10017u   穿越Z10018u   奇幻Z10020u   战斗Z10021u   搞笑Z10022u   日常Z10023u   科幻Z10024u   萌系Z10025u   治愈Z10026u   校园Z10027u   少儿Z10028u   泡面Z10029u   恋爱Z10030u   少女Z10031u   魔法Z10032u   冒险Z10033u   历史Z10034u   架空Z10035u   机战Z10036u   神魔Z10037u   声控Z10038u   运动Z10039u   励志Z10040u   音乐Z10041u   推理Z10042u   社团Z10043u   智斗Z10044u   催泪Z10045u   美食Z10046u   偶像Z10047u   乙女Z10048u   职场Z10014u	   动态漫Z10019u   玄幻Z10078u   武侠Z10057u   悬疑Z10049u   古风u   中国大陆z6,7u   中国港台8u   韩国9u   法国u   英国15u   德国u   泰国Z35u	   意大利13u	   西班牙z5,11,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70Z10104u   短片Z10050u   剧情Z10051u   喜剧Z10052u   爱情Z10053u   动作Z10054u   恐怖Z10055u   犯罪Z10056u   惊悚Z10058u   战争Z10059u   动画Z10060u   传记Z10061u   家庭Z10062u   歌舞Z10063u   纪实Z10064u   灾难r-   z)[2023-01-01 00:00:00,2024-01-01 00:00:00)z)[2022-01-01 00:00:00,2023-01-01 00:00:00)z)[2021-01-01 00:00:00,2022-01-01 00:00:00)z)[2020-01-01 00:00:00,2021-01-01 00:00:00)z)[2019-01-01 00:00:00,2020-01-01 00:00:00)z)[2018-01-01 00:00:00,2019-01-01 00:00:00)z)[2017-01-01 00:00:00,2018-01-01 00:00:00)z)[2016-01-01 00:00:00,2017-01-01 00:00:00)z)[2010-01-01 00:00:00,2016-01-01 00:00:00)z	2015-2010z)[2005-01-01 00:00:00,2010-01-01 00:00:00)z)[2000-01-01 00:00:00,2005-01-01 00:00:00)z)[1990-01-01 00:00:00,2000-01-01 00:00:00)z)[1980-01-01 00:00:00,1990-01-01 00:00:00)z[,1980-01-01 00:00:00)z1,6,7u   中国z5,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70Z10079u   青春Z10103u   短剧Z10080u   都市Z10081u   古装Z10082u   谍战Z10083u   经典Z10084u   情感Z10085u   神话Z10086u   年代Z10087u   农村Z10088u   刑侦Z10089u   军旅Z10090u   访谈Z10091u	   脱口秀Z10092u	   真人秀Z10094u   选秀Z10095u   旅游Z10098u   晚会Z10096u	   演唱会Z10097u   亲子Z10100u   文化Z10069u   萌宠Z10099u   养成)r   r   r   r   r   N)__name__
__module____qualname__r   r   r   r   r   r=   r?   r>   r   r   r   r   r   r   r   r   rW   r^   r   rZ   r/   r   r   r   r   r      sF   -" +%+-i           Rr   )sysr   r   r   Zdifflibr   urllib.parser   r   pathr.   base.spiderr   r   r   r   r   <module>   s   