U
    Рiѫ                    @   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mZm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 ejd d dlmZ G d	d
 d
eZdS )    N)	b64encode	b64decode)quoteunquote)PyQuery)Sessionadapters)Retryz..)Spiderc                   @   s  e Zd ZdhddZdd Zdd Zdd	 Zd
d ZdiddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdjddZd d! Zd"d# Zd$d% Zdkd(d)Zd*d+ Zd,d- Zdld/d0Zdmd2d3Zdnd4d5Zd6d7 Zdod8d9Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC Z dDdE Z!dFdG Z"dHdI Z#dJdK Z$dLdM Z%dNdO Z&dPdQ Z'dRdS Z(dTdU Z)dVdW Z*dXdY Z+dZd[ Z,d\d] Z-d^d_ Z.d`da Z/dbdc Z0ddde Z1dfdg Z2d&S )pr
    c              	   C   s   d| _ t | _tjtdddddddgd	d
dd}| jd| | jd| ddd| _| jj| j i | _	i | _
i | _g | _d S )Nzhttps://www.4c44.com   g      ?i    i  i  i  )totalbackoff_factorstatus_forcelist   2   )max_retriespool_connectionspool_maxsizezhttp://zhttps://zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zhttps://www.4c44.com/
User-AgentReferer)hostr   sessionr   HTTPAdapterr	   mountheadersupdate	lrc_cachecurrent_categoryZ
page_cachehome_recommend_cache)selfextendadapter r%   ,   /storage/emulated/0/lz/py/sy/世纪音乐.pyinit   s    $zSpider.initc                 C   s   dS )Nu&   世纪音乐网·爱听音乐风格版r%   r"   r%   r%   r&   getName)   s    zSpider.getNamec                 C   s   t td|pdtjS )Nz*\.(m3u8|mp4|mp3|flv|wav|aac|ogg|m4a)(\?|$)r   )boolresearchIr"   urlr%   r%   r&   isVideoFormat,   s    zSpider.isVideoFormatc                 C   s   dS )NFr%   r(   r%   r%   r&   manualVideoCheck/   s    zSpider.manualVideoCheckc                 C   s   | j   d S )N)r   closer(   r%   r%   r&   destroy2   s    zSpider.destroyFc                 C   sz   |sdS | drd| }n.| dr2| j| }n| dsJ| jd | }|rf|dd}|dd	}|rv|d
d}|S )Nr   //https:/httpparam=200y200param=500y500z?param=200y200z?param=500y500z?imageView=1&thumbnail=800yz?imageView=1&thumbnail=1280y720)
startswithr   replace)r"   r/   	is_singeris_mvr%   r%   r&   
_get_image6   s    



zSpider._get_imagec                 C   s  ddddddddddd	dd
ddg}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gdd d!d"d#dgd$d% t 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gdd.d/d0d#dd1d2dd3d4dd5d6dd7d8dgdd9d:d;d<dd=d>dd?d@dgdgdAdBdCd#ddddddddDdEddFdGddHdIdgddJdKdLdMddNdOddPdQddRdSddTdUddVdWddXdYddZd[dd\d]dd^d_dd`daddbdcdgdgdd}||g deS )fNu   🏠 首页推荐home)	type_nametype_id   📊 排行榜	rank_list   📀 歌单playlist   👤 歌手singer   🎬 MVmvsexu   👤 性别u   👩 女歌手girlnvu   👨 男歌手Zmaleu   🎭 乐队组合Zband)keynamevalueareau   🌏 地区u   🇨🇳 华语huayuu   🌍 欧美oumeiu   🇰🇷 韩国hanguou   🇯🇵 日本Zribrncharu   🔤 字母u   🔤 全部indexc                 S   s"   g | ]}t |t | d qS )rL   )chrlower).0ir%   r%   r&   
<listcomp>i   s     z&Spider.homeContent.<locals>.<listcomp>A   [   u   🌐 全部地区u   🇨🇳 内地neidiu   🇭🇰 港台gangtairibentypeu   🎬 类型u   🎬 全部类型u   📀 官方版guanfangu   🎤 原声	yuanshengu   🎸 现场版	xianchangu   🎮 网易出品wangyisortu   📊 排序u
   ✨ 最新newu   🔥 最热hotu   📈 上升最快riselangu   🌏 语种u   🌐 全部语种u   🇯🇵 日语Zriyuu   🇰🇷 韩语Zhanyuu   🇭🇰 粤语Zyueyustyleu   🎵 风格u   🎵 流行Zliuxingu   🎸 摇滚Zyaogunu   🎤 民谣Zminyaou
   ⚡ 电子Zdianziu   💃 舞曲Zwuquu   🎤 说唱Z	shuochangu   🎹 轻音乐Z	qingyinleu   🎺 爵士Zjueshiu   🌾 乡村Zxiangcunu   🎭 R&B/SoulZsoulu   🎻 古典gudianu   🏯 古风Zgufeng)rG   rI   rE   )classfilterslistrange)r"   filterclassesro   r%   r%   r&   homeContentG   s    

$`zSpider.homeContentc                 C   s,  z|  d}|r| dkrTtd td |  d}|rJ| dkrTdg iW S g }t }g | _|d D ]P}|dd}|s|d	d}|s|d
d}|	d}|rpd|krqp|
 }|d
 }|s|dd}	|	r|	
 }|d	d}
|
s|d	d}
|
sd}
|r2| d| n|}| |}||krp|| |dd dd}| j d| }| j|| || |
d||||d ||| || |
dd qp|d D ]}|d	d}|s|d
d}|	d}|rd|krq|
 }| |}||kr|| |dd dd}| j d| }| j|| |dd|d||d ||| |ddd q|d D ]}|d	d}|s|d
d}|	d}|rd|krq|
 }|d	d}
| |}||kr|| |dd dd}| j d | d!}| j|| ||
rt| j|
d"d#ndd$d"||d% ||| ||
r| j|
d"d#ndd$d qtd&t| d't| j d( d|d d) iW S  tk
r& } ztd*|  dg i W Y S d }~X Y nX d S )+Nr6   <html></html>u+   ⚠️ 首页获取失败，重试一次...   rp   z2#datalist li, .lkmusic_list li, .layui-row.lkbj liz.name a.urlr   .name aahref/mp3/z.singerzp a, .artist a, .author a.pic imgsrcimgz%https://p2.music.126.net/xxx/song.jpg - .htmlr   /data/down.php?ac=music&id=u   🎵 正在播放)vod_idvod_namevod_picvod_remarkssong_idrG   rP   play_url)r   r   r   r   z2.ilingkuplay_list li, .play_list li, .song_list liz$https://p2.music.126.net/xxx/new.jpgu   ✨ 新歌推荐 .video_list li, .ilingku_list li/mp4//data/down.php?ac=vplay&id=&q=1080Tr=   u   🎬 MV推荐)r   r   r   r   r=   mv_idr   u   🏠 首页推荐: 获取到 u    个项目，缓存     个<   u   ❌ 首页推荐错误: )getpqhtmlprinttimesleepsetr!   itemseqattrtext_absaddsplitr;   r   append_cleanr>   len	Exception)r"   docr   Zseen_idsliry   rz   rP   rG   singer_elempic	full_namer   r   r   r   er%   r%   r&   homeVideoContent   s    
















 zSpider.homeVideoContentc           -   K   C   s  t |pd}g }|dkr |  S |dkrdddddd	d
dddddddddddddddddddddd d!d"}d#d$d%d&d'd%d(d)d%d*d+d%d,d-d%d.d/d%d0d1d%d2d3d%d4d5d%d6d7d%d8d9d%d:d;d%d<d=d%d>d?d%d@dAd%dBdCd%dDdEd%dFdGd%dHdId%dJdKd%dLdMd%dNdOd%dPdQd%dRdSd%dTdUd%dVdWd%dXdYd%dZd[d%d\d]d%d^d_d%g}|d d` }|d` }	|||	 }
|
D ]@}||da db}|dc|da  |dd |dedfdgdhdi qt|dj d` }|||d`t|dkS |dlkr|dmdn}|dodp}|dnkr$dq| dr}n|r8dq| dr}nds}|dkr\tdtdu| dr|}| |}|dv D ]}|dw	dx}|
dy}|rrdz|krqr| }|d{
d|}|| || ||r| |ndpd}dfdgdhdi qrt|d~}|||r|d n|d`ddkS |dkr|dd}|dd}|ddn}|dnkr|dkrd| du| du| du| dr	}nd| du| du| dr}n6|dkrd| du| d| dr}nd| du| d}| |}| |}t|d~}|||r|d n|d`ddkS |dkr|ddn}|ddn}|dd&}||||d| _| ||||}td| j |  | |}dx}dx}dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgK}|dփ D ]}|dw	dx}|sP|d׃	dx}|
dy}|r(d|krnq(| }|}| |}d} | }!|D ]<}"|" |!krd} |d7 }td| d|" dݝ  qҐq| rܐq(dp}#|dރ	dx}$|$r|$ }#n.td|}%|%r,|%d }#|%d }|d{
d|}|sN|d
d|}dp}&|d}'|'rh|' }&|dud drdp}(dg})|#r|)|# |&r|)|& | |||r| j|ddndd|)|#|&rd|# d|& nd|# dfddh|(||||#d}*||* |d7 }q(td| du| du| d| d| d| d | |}|rb|d }+n|}+| |||},td| d| d|+ d|  |||+d`|,dkS ||dd`ddkS )Nrw   r?   rC   Vhttps://p2.music.126.net/sBqYS1rtmY6OUJ3rT_xN4A==/109951166953507139.jpg?param=500y500Vhttps://p2.music.126.net/8Lh8h0tLIn3n7RzvHzY0Wg==/109951166953506369.jpg?param=500y500Vhttps://p2.music.126.net/gHjcNZjLRJwPmgI0oO0c0A==/109951166953507432.jpg?param=500y500Vhttps://p2.music.126.net/Dr7Wwiy-Jq7D7lgX3hZk3A==/109951166953506898.jpg?param=500y500Vhttps://p2.music.126.net/_o_bh5iUjO5gNx0fLzlN_w==/109951166953507739.jpg?param=500y500Vhttps://p2.music.126.net/SCP69gC-x7W1aX8K3fQp2g==/109951166953508058.jpg?param=500y500Vhttps://p2.music.126.net/AeMq1vF46KSxIJ1_Lk7DnA==/109951166953508286.jpg?param=500y500Vhttps://p2.music.126.net/xB5yPyMqnWktaRk44fUwCQ==/109951166953508516.jpg?param=500y500Vhttps://p2.music.126.net/NN7gD80fO-FC6D08ZfP6YA==/109951166953508879.jpg?param=500y500Vhttps://p2.music.126.net/7G3bJzOtdS5T9C-OynOR6A==/109951166953509153.jpg?param=500y500Vhttps://p2.music.126.net/RZqN-nhudVw9J6A1FhxY3Q==/109951166953509535.jpg?param=500y500Vhttps://p2.music.126.net/QWzC_wLjJ4vC7__6R3PUFg==/109951166953509853.jpg?param=500y500Vhttps://p2.music.126.net/Aq-YLyaG0inF8-eBY0e0rw==/109951166953510130.jpg?param=500y500Vhttps://p2.music.126.net/WE0C0US8Z2-6v4kQ8ey8nA==/109951166953510408.jpg?param=500y500Vhttps://p2.music.126.net/n3SlR1n7ZdbQOU5ADK5P4g==/109951166953510646.jpg?param=500y500Vhttps://p2.music.126.net/sYpp9uCiY2Fim92O6QZ_Lw==/109951166953510939.jpg?param=500y500Vhttps://p2.music.126.net/BgK4mI6XKEl4SWqPp7Z4nw==/109951166953511260.jpg?param=500y500Vhttps://p2.music.126.net/hIHhU4tVfOL8lyS-fc06WQ==/109951166953511595.jpg?param=500y500Vhttps://p2.music.126.net/ZOH6qS52kizTxy8pyY7q2A==/109951166953511895.jpg?param=500y500Vhttps://p2.music.126.net/f15S_YcOq6lNpJ4vKzYPPg==/109951166953512238.jpg?param=500y500Vhttps://p2.music.126.net/5OYrUqR_HH0N7hSmX7jPBQ==/109951166953512545.jpg?param=500y500Vhttps://p2.music.126.net/pZ_BIGjX0T5rq66lA7yS9Q==/109951166953512864.jpg?param=500y500Vhttps://p2.music.126.net/Hg-h8E7n2qK9K_4mXm3hJQ==/109951166953513214.jpg?param=500y500Vhttps://p2.music.126.net/jQZ5jO99pF5m9r4jBpdgXg==/109951166953513484.jpg?param=500y500Vhttps://p2.music.126.net/XbOH_Cbw38WcZbc0pI33Dw==/109951166953513803.jpg?param=500y500Vhttps://p2.music.126.net/Vm4Yq0Yd8SqptpXBPoLLFg==/109951166953514101.jpg?param=500y500Vhttps://p2.music.126.net/2DjhjJ-19L8vxVlnV5m4wQ==/109951166953514410.jpg?param=500y500Vhttps://p2.music.126.net/GMF5Q6bE0VR5d_BWX8a4jQ==/109951166953514699.jpg?param=500y500Vhttps://p2.music.126.net/T1HeE3jH9Df12FmXl6ZkOg==/109951166953515018.jpg?param=500y500Vhttps://p2.music.126.net/m1j7GdA6IVs7ZAlfHP_mFg==/109951166953515346.jpg?param=500y500rj   rh   originaltopdouyinkuaishouzwdjri   japanrT   koreaamericaacgacgyxacgdmomtopdianuktoprm   raptopdytopqianliyytopystopxyztopdjtopktvtopchetopaytopsqtoprj      🔥 音乐飙升榜)idrP   rh      ✨ 新歌排行榜r      🎸 音乐原创榜r      🎵 Top热歌榜r      🎶 抖音热歌榜r      📱 快手热歌榜r      💃 中文DJ榜ri      🌐 网络热歌榜r      🗾 日本歌曲榜rT      🌍 欧美新歌榜r      🇰🇷 韩国音乐榜r      🇺🇸 美国音乐榜r      🎮 ACG新歌榜r      🕹️ ACG游戏榜r      📺 ACG动画榜r      🌎 欧美热歌榜r      ⚡ 电子舞曲榜r      🇬🇧 UK排行榜rm      🎻 古典音乐榜r      🎤 RAP说唱榜r      🔊 电音热歌榜r      🚀 潜力热歌榜r      🇭🇰 粤语金曲榜r      🎬 影视金曲榜r      🌏 小语种热歌r      🔄 串烧舞曲榜r      🎤 KTV点唱榜r      🚗 车载嗨曲榜r      🌙 熬夜修仙榜r      😴 睡前放松榜   r   ;https://p2.music.126.net/xxx/rank_default.jpg?param=500y500rank_rP   u   📊 点击播放完整榜单rectHzG?rb   ratior   r   r   r   rl      rp   page	pagecountlimitr   rE   rk   rW   rl   r   z/playlists/r   z/playlists/index.html\.html$r6   r   rx   r   rz   
/playlist/r|   r}   rD   C   .pages a:contains('下一页'), .pagination a:contains('下一页')'  rG   rJ   rK   rR   rS   rV   z/singerlist//index/z/index.htmlrI   rb   rg   )rR   rb   rg   r
  u   🎬 MV URL:    采访   访谈   专访	   见面会	   发布会	   记者会   直播   现场   彩排   后台   综艺   节目cutCUT   片段reactionReactionREACTION   广告	   宣传片   预告   花絮   幕后teaserTeaserTEASERtrailerTrailerTRAILERpromoPromoPROMObehindBehindBEHINDmakingMakingMAKING   饭拍FANCAMfancamFancam   直拍focusFocusFOCUS   访问talkTalkTALKskitSkitSKITvlogVlogVLOGlogLogLOG   采访视频   采访片段   广告拍摄   广告花絮   广告幕后   MV拍摄花絮   MV幕后	MV making	   特别版	   特别篇   SP版CMCFz/.video_list li, .play_list li, .ilingku_list liza.url, a.name, ar   FTu   🎬 过滤非MV内容:     (包含关键词: )z.singer a, .artist a, .author az^(.+?)\s*-\s*(.+)$   r~   z!.duration, .time, .length, .timerr   rH   r   z+https://p2.music.126.net/xxx/mv_default.jpg    ·    🎬 MV · {Gz?)r   r   r   r   	vod_actorvod_contentrl   Z_mv_idZ_areaZ_typeZ_sortZ_artistu   🎬 MV分类 u    第u   页 获取到 u    个MV，过滤掉 u    个非MV内容u   📊 分页信息: 当前页=u   , 有下一页=u   , 总页数=u   , 本页数量=i  )intr   getr   r   r+   subr   r   r   r   r   r   r   r>   r*   _parse_singer_listr    _build_mv_urlr   r   _clean_song_namerY   r,   groupstripr   r;   join_check_has_next_page_estimate_total_count)-r"   tidpgrs   r#   r   	rank_picsrC   startendZ
page_itemsZrankr   total_pagesrk   rl   r/   r   r   ry   rz   rP   has_nextrJ   rR   rV   type_rg   mv_countZfiltered_countfilter_keywordsZname_originalshould_filterZ
name_lowerkeywordartistartist_elemartist_matchdurationZduration_elemr   Zremarks_partsZmv_itemr  r   r%   r%   r&   categoryContentO  s^   
"!	




	


 




                                                      #






.

 	zSpider.categoryContentc              	   C   s  ddddddddd	g	}|D ]H}||}|r| d
s| ds|d}|r|dkr|dkr dS qg }|d D ]&}|  }| rt|t| qt|rt|}	| 	|}
|	|
krdS ddddg}|D ]4}||}|r|d}|r|dkr|dkr dS qdS )u$   检查是否有下一页 - 增强版u   .pages a:contains('下一页')u#   .pagination a:contains('下一页')u   .page a:contains('下一页')u   .pages a:contains('下页')u    .pagination a:contains('下页')z.pages .nextz.pagination .nextu   a:contains('下一页')u   a:contains('下页')disableddisablerz   #zjavascript:void(0)T .pages a, .pagination a, .page au   .pages a:contains('末页')u    .pagination a:contains('末页')u   .pages a:contains('最后')u    .pagination a:contains('最后')F)
Z	has_classr   r   r   ri  isdigitr   rb  max_get_current_page)r"   r   Znext_selectorsselectorZ	next_linkrz   page_numbersry   r   max_pagecurrent_pageZlast_selectorsZ	last_linkr%   r%   r&   rk    sN    


zSpider._check_has_next_pagec                 C   s   |d  D ]$}|  }| rt|  S qg }|d  D ]&}|  }| rB|t| qB|r~|rz|d S dS dS )u   获取当前页码zZ.pages .current, .pagination .current, .page .current, .pages .active, .pagination .activer  r   rw   )r   r   ri  r  rb  r   )r"   r   ry   r   r  r%   r%   r&   r    s    zSpider._get_current_pagec                 C   s   |d  }td|}|r*t|dS td|}|rPt|d}|d S g }|d D ]&}	|	   }
|
 r`|t|
 q`|rt	|}|d S |dk r|d d | S dS )u   估计总条数z.pages, .pagination, .pageu   共(\d+)条rw   u   共(\d+)页r   r  r  )
r   r+   r,   rb  rh  r   ri  r  r   r  )r"   r   Zcurrent_countr  Z	page_infoZtotal_matchZpages_matchrr  r  ry   r   r  r%   r%   r&   rl    s&    zSpider._estimate_total_countc              	   C   sp  ddddddd}ddd	d
dd}dddd}| |d}| |d}	| |d}
|dkr|dkrv|	dkrvd|
 dS |dkr|	dkrd| d|
 dS |dkr|	dkrd|	 d|
 dS d| d|	 d|
 dS n|dkr|	dkrd|
 d| dS |dkr"|	dkr"d| d|
 d| dS |dkrN|	dkrNd|	 d|
 d| dS d| d|	 d|
 d| d	S dS )u   构建MV分类URLrW   r_   r`   rT   rU   ra   rW   r_   r`   rT   rU   ra   rc   rd   re   rf   rW   rc   rd   re   rf   rh   ri   rj   rh   ri   rj   rw   z/mvlist/index/index/r   z/mvlist/r  z/mvlist/index/r6   N)rc  )r"   rR   rt  rg   rn  Zarea_mapZtype_mapZsort_mapZarea_valZtype_valZsort_valr%   r%   r&   rf    sF    
	zSpider._build_mv_url1c              
   C   s:  dt | d| }| |}g }|d D ]}|dd}|d }	sPq.| }
|ddphd	}d
|	krd}ddd}n>d|	krd}ddd}n&d|	krd}ddd}nd}ddd}|| |	| |
|r| j	||dk|dkdnd	||d q.t
|d}|rt|d nt|}|t||dddS )N/so.php?wd=z&page=.play_list li, .video_list lirx   r   rz   r~   r}   r   r{   u   🎵 歌曲r  r  r  r   rH   r_  r  rD   rF   ovalrw   )r<   r=   r  r  r   r  r	  )r   r   r   r   r   r   r   r   r   r>   r*   rb  )r"   rO   quickrn  r/   r   r   r   ry   rz   rP   r   remarksrl   rs  r  r%   r%   r&   searchContentC  sF    


	zSpider.searchContentc           	      C   s  |  |d }d|kr@|dd| jddd}| ||S | jD ]2}|d |krFtd|d   | ||  S qFd|kr| |}| ||S d	|kr| |}| 	||S d
|krz| |}| 
|d p|d dd }|dddp|ddd}|r.|dd}|d| |rL| j|ddnd| ||d}|| || d|giS d|kr0| |}| 
|d p|d dd }|dddp|ddd}|d| |r| |nd| ||d}|| | d|d< d|giS | |}| 
|d p`|d dd }|dddp|dddp|ddd}|||r| |nd| ||d}d|giS )Nr   r  r   r6   r   u   🏠 使用首页推荐缓存: r   r   r{   /singer/h1title_z.singer_info .pic imgr}   r|   r8   r9   u   👤 Tr<   )r   r   r   ra  rp   r  .video_list .pic imgu   📀 rD   vod_play_from.playhimg imgz
.djpic img)r   r;   r   _get_rank_detailr!   r   _get_home_recommend_detailr   _get_mv_detail_with_playlist_get_song_detail_with_playlistr   r   r   r   r   r>   _get_contentr   _get_singer_detail_get_playlist_songs)	r"   idsr/   	rank_typecached_itemr   r  r   vodr%   r%   r&   detailContentn  s`    




(*



**


*@
zSpider.detailContentc           
      C   s  ddddddddd	d
ddddddddddddddddddddd}d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d}| |d>| }| |d?}| |}|rt|d@}|||| dA| dBdC|dD}	n*|||| dEdCdF| dG| j  dD}	dH|	giS )Iu<   处理排行榜详情 - 使用网易云音乐的封面图片r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u
   排行榜 r  r      · 共u&   首歌曲

网易云音乐风格封面rB   )r   r   r   ra  r  vod_play_urlu-    · 暂无歌曲

网易云音乐风格封面   暂无歌曲$0@@@@rp   )rc  _get_rank_playlistr   r   e64r   )
r"   r  r/   ro  Z
rank_namesZ	rank_nameZrank_picrE   
song_countr  r%   r%   r&   r    s    #!

	zSpider._get_rank_detailc              	   C   s  | dr | |}| ||S | dd}| dd}| dd}|s|| |}td|}|r||d}| j d| }|r| d	| n|}| d
| d|  g}	| jD ]z}
|
 d|kr|
 ds|
 dd}|
 dd}|
 dd}|r|r
| d	| n|}|		| d
| d|   qt
|	dk r`| jdt
|	 d}|r`|	| g }t }|	D ]D}
|
d
}t
|dkrn|d }||krn|| |	|
 qnd|}|d|d  |d d|d  dt
| dd||d}d|giS dS )u   处理首页推荐详情r=   rP   r   rG   r   /mp3/([^/]+)\.htmlrw   r   r   $r  r   r   r   r  r\  r   r     🎵 r   r   u   🎵 首页推荐 · u   
共   首歌曲循环播放u   🎵 首页推荐播放列表)r   r   r   ra  r  r  r`  rp   N)rc  r   r  r+   r,   rh  r   r  r!   r   r   _get_hot_song_playlistr#   r   r   r   rj  )r"   r  r/   r   	song_namerG   r   r   display_namerE   itemZother_play_urlZother_song_nameZother_singerZother_display	hot_songsunique_playlist	seen_urlspartsurl_partplay_url_strr  r%   r%   r&   r    sZ    




 





z!Spider._get_home_recommend_detailNr   c              
   C   sj  g }z,d}|  |}|d D ]
}t||kr: q0|dd}|sNq"|d}|r"d|krfq"|rt||krtq"| }	| |	}	d}
|dd}|r| }
n.td	|	}|r|	d

 }
|	|
d d}	|
r|
 d|	 n|	}|dd dd}| j d| }|| d| d|   q"W n2 tk
rd } ztd|  W 5 d}~X Y nX |S )u   获取热门歌曲播放列表z/list/rise.html.play_list lirx   r   rz   r{   r   .singer a, .artist a^(.+?)\s*-\s*rw   r   r6   r   r   r   r  r  u   ❌ 获取热门歌曲失败: N)r   r   r   r   r   r   rg  r+   r,   rh  ri  r;   r   r   r   r  r   r   )r"   
exclude_idr  rE   r/   r   r   ry   rz   rP   ry  rz  r{  r  r   r   r   r%   r%   r&   r  Y  s@    



$ zSpider._get_hot_song_playlistc              	   C   s  g }d| d}zR|  |}|d D ]}|dd}|d }sLq*d|kr*| }| |}|dd	 dd
}	| j d|	 }
|	| d| 
d|
   q*zd| d}|  |}|d D ]}|dd}|d }sqd|kr| }| |}|dd	 dd
}	| j d|	 }
|	| d| 
d|
   qW n   Y nX W n   Y d S X |rd|S d S )Nz/list/r   r  rx   r   rz   r{   r6   r   r   r   r  r  z/2.htmlr  )r   r   r   r   r   rg  r   r;   r   r   r  rj  )r"   r  epsr/   r   r   ry   rz   rP   r   r   Zurl2Zdoc2r%   r%   r&   r    s@    

 

$
zSpider._get_rank_playlistc           4   J   C   s  t d|}|r|dnd}| |d p0d}| |}d}|dd}|r^| }n.t d|}|r|d }||d	 d}|d
d	dp|dd	dp|dd	d}| j
 d| d}	td|	  | jdd}
| jdd}| jdd}| jdd}td|
 d| d| d|  dddddd dd!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHddIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbgJ}g }t|dcD ] }t|ddkr  q| |
|||}tde| df|  | |}|rB| dgkrH qg }|dh D ]H}|did}|svqX|	dj}|rXdk|krqX| }|}| |}dl}| }|D ]4}| |krdm}tdn| do| dp  qq|rqXd}|dqd}|r| }n0t d|}|rL|d }||d	 d}|r`| d	| n|}|drds dtd}| j
 d| d}|||||du qXtdv| dwt| dx ||krds} t|D ]"\}!}"|"dy |kr|!}  qq| dkrR|| dz D ],}"||"d{  d|| d}|"d~    qtd| d  d n:|D ],}"||"d{  d|| d}|"d~    qVtd n2|D ],}"||"d{  d|| d}|"d~    q| |}#|#stdv| d  qqt|dk r6tdt| d t|d ddsD ]}t|ddkr6 q6| |
|||}tde| d|  | |}|r| dgkr|qg }|dh D ]J}|did}|sq|	dj}|rdk|krȐq| }|}| |}dl}| }|D ]4}| |krdm}td| do| dp  q$q|r.qd}|dqd}|rP| }n0t d|}|r|d }||d	 d}|r| d	| n|}|drds dtd}| j
 d| d}|d||||du qtdv| dwt| d g }$|D ],}"|$|"d{  d|| d}|"d~    q|$| }qg }%t }&| d|| d}|	  }'| d}|	 }(|&|( |%|' |D ]N})|)d|}*t|*dkr~|*ds }+|+|&kr~|+|(kr~|&|+ |%|) q~tdt|% d d|%},ddddddd}-dddddd}.dddd}/|-|
|
}0|.||}1|/||}2|d| |r\| j|dmdnd|d| dt|% d|0 dr|1 dr|2 
d|,d}3d|3giS )uX   获取MV详情并创建当前分类播放列表 - 从当前MV开始按分类顺序播放/mp4/([^/]+)\.htmlrw   r   r     当前MVz5.play_singer .name a, .singer_info .name a, .artist ar   r  r   r  r}   r|   r  r   r   u   🎬 当前MV播放URL: rR   rW   rb   rg   ri   r
  u   🎬 当前分类: 地区=u	   , 类型=u	   , 排序=u   , 当前页=r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  
      u   🎬 获取第u   页MV: rv   .video_list li, .play_list lirx   rz   r   FTu'   🎬 过滤非MV内容（详情页）: rZ  r[  r  r6   r   r   )rP   r   rz   r      🎬 第   页获取到 u    个MV（过滤后）r   NrP   r  r  r   u   🎬 从当前页第u   个MV开始添加u0   🎬 未找到当前MV，添加当前页所有MVu!   页没有下一页，停止获取r   u%   🎬 当前页及之后页MV不足（u    个），获取之前页面的MVu   页MV（之前页）: u1   🎬 过滤非MV内容（详情页-之前页）: u    个MV（之前页-过滤后）r\  u   🎬 最终播放列表: uF    个MV（从当前MV开始，按分类顺序，已过滤非MV内容）r  u   全部u   内地u   港台u   欧美u   韩国u   日本r  u	   官方版u   原声u	   现场版u   网易出品r  u   最新u   最热u   上升最快r  u   🎬 r   r^  r  u"   个MV循环播放

当前分类：u   🎬 MV播放列表r   r   r   r`  ra  r  r  rp   )r+   r,   rh  r   r   rg  r   ri  r;   r   r   r   r    rc  rr   r   rf  r   r   r   rY   r   r   	enumerater  rk  insertr   r   rj  r>   )4r"   r   r/   video_idrP   ry  rz  r{  r   current_play_urlrR   rt  rg   r  rv  Zall_mvsr
  page_urlpage_docZpage_mvsr   ry   rz   mv_nameZmv_name_originalrw  Zmv_name_lowerrx  Z	mv_artistr  r   r   Zcurrent_indexr[   rI   rs  Z	temp_listr  r  Zcurrent_mv_entryZcurrent_url_partr  r  r  r  Z
area_namesZ
type_namesZ
sort_namesZ	area_namer@   Z	sort_namer  r%   r%   r&   r    s   

<                                                      







**
*






*




$
z#Spider._get_mv_detail_with_playlistr   c              
   C   s  g }t d|d D ]}t|dkr* q| ||||}| |}	d}
|	d D ]}t|dkrl qp|dd}|sqT|d}|rTd|krqT|r||krqT| }| |}d}|d	d}|r| }n0t	
d
|}|r|d }||d d}|r| d| n|}|dd dd}| j d| d}|| d| d|   |
d7 }
qTtd| d|
 d | |	}|s qq|S )u)   获取分类页面的所有MV（多页）rw   r   r   r  rx   rz   r   r   r  r  r   r6   r   r   r   r   r  r  r  r  u    个MV)rr   r   rf  r   r   r   r   r   rg  r+   r,   rh  ri  r;   r   r   r   r  r   rk  )r"   rR   rt  rg   r  	max_pagesrE   r
  r/   r   
page_countr   ry   rz   r  ry  rz  r{  r  r   r   rs  r%   r%   r&   _get_all_category_mvs  sL    





zSpider._get_all_category_mvsr\  c              
   C   s6  g }dt | d}| |}d}|d D ]}|| kr.|d} qNq.|sV|S | |}| |}	d}
|	d D ]6}| }d|ksd|ksd	| krz|d}
 qqz|
s|S | |
}
td
|d
 D ]\}t|dkr q2|
}|d
krt	
dd| d|
}| |}d}|d D ]}t|dkr@ q|dd}|sXq(|d}|r(d|krvq(|r||krq(| }| |}||kr| d| }|dd dd}| j d| d}|| d| d|   |d
7 }q(td| d| d | |}|s q2q|S )u&   获取同歌手的所有MV（多页）r  &page=1Na[href*='/singer/']rz   z.ilingku_fl a, .nav a, .tag a   视频MVrI   rw   r   r  r6   r   r   r  rx   r   r   r   r   r   r   r  r  u   🎬 歌手MV第r  r   )r   r   r   r   r   r   rY   rr   r   r+   rd  r   rg  r   r;   r   r   r  r   rk  )r"   ry  r  r  rE   
search_urlr   
singer_urlry   
singer_docZmv_urlr   r
  r  mv_docr  r   rz   r  r   r   rs  r%   r%   r&   _get_singer_all_mvs  sj    











zSpider._get_singer_all_mvsc              
   C   s@  g }t d|d D ]&}t|dkr* q<|dkr8d}nd| d}| |}d}|d D ]}t|dkrt q|dd}	|	sq^|	d	}
|
r^d
|
krq^|r||
krq^|	 }| |}|
dd 	dd}| j
 d| d}|| d| d|   |d7 }q^td| d| d | |}|s q<q|S )u   获取热门MV（多页）rw   (   z/mvlist/index/index/hot.htmlz/mvlist/index/index/hot/r   r   r  rx   rz   r   r6   r   r   r   r   r  r  u   🎬 热门MV第r  r   )rr   r   r   r   r   r   r   rg  r   r;   r   r   r  r   rk  )r"   r  r  rE   r
  r/   r   r  r   ry   rz   r  r   r   rs  r%   r%   r&   _get_all_hot_mvsQ  s>    




zSpider._get_all_hot_mvsc              	   C   sT  t d|}|r|dnd}| |d p0d}| |}d}|dd}|r^| }n.t d|}|r|d }||d	 d}|d
d	d}| j
 d| }	|r| d	| n|}
|
 d| d|	  g}|r| j||dd}|r|| tdt| d t|dk r| jdt| d}|rdd |D }|D ]2}|dd }||krT|| || qTtdt| d g }t }|D ]D}|d}t|dkr|d }||kr|| || qtdt| d d|}|d| |r(| |nd|d| dt| d d!|d"}d#|giS )$u'   获取歌曲详情并创建播放列表r  rw   r   r  u   当前歌曲*.play_singer .name a, .singer a, .artist ar   r  r   z.playhimg img, .pic imgr}   r   r  r  r   )r  r  u   🎵 添加了 u    个同歌手歌曲r   r  c                 S   s   g | ]}| d d qS )r  r   )r   )rZ   r  r%   r%   r&   r\     s     z9Spider._get_song_detail_with_playlist.<locals>.<listcomp>r   u    个热门歌曲r\  u   🎵 最终播放列表: 
    首歌曲r  r  u   🎵 歌曲 · r  r  u   🎵 歌曲播放列表r  rp   )r+   r,   rh  r   r   rg  r   ri  r;   r   r   r  _get_singer_song_playlistr#   r   r   r  r   r   r   r   rj  r>   )r"   r   r/   r   rP   ry  rz  r{  r   r  r  rE   Zsinger_songsr  Zexisting_urlssongZsong_urlr  r  r  r  r  r  r  r%   r%   r&   r    sf    









z%Spider._get_song_detail_with_playlistc              	   C   s6  g }dt | d}| |}d}|d D ]}|| kr.|d} qNq.|r2| |}| |}	|	d D ]}
t||kr q2|
dd}|sqt|d}|rtd	|krqt|r||krqt| }| |}||kr| d
| }|	dd 
dd}| j d| }|| d| d|   qt|S )u!   获取同歌手歌曲播放列表r  r  Nr  rz   r  rx   r   r{   r   r6   r   r   r   r   r  r  )r   r   r   r   r   r   r   r   rg  r   r;   r   r   r  )r"   ry  r  r  rE   r  r   r  ry   r  r   rz   r  r   r   r%   r%   r&   r    s<    





 z Spider._get_singer_song_playlistc                 C   sr  |  |dd }|d}|d dd}d|| jd | jd dd	d
dd}d|ksbd|krn||d< |S d}d}	d}
d|krtd|}|r|d}n"d|krtd|}|r|d}|s|S d| }|| jkr| j| |d< t	d|  |S t	d|  z| j d| d}| j
j|| jdd}|jdkrt|j}|d p`|d  }td!d|}| }|d"d}|r|  }	d#|kr|d#d}t|d$kr|d  }	|d  }
n|}
n|}
W n   Y nX | |}|r$||d< || j|< t	d%|  |S | |}|rX||d< || j|< t	d&|  |S | |}|r||d< || j|< t	d'|  |S | |	|
}|r||d< || j|< t	d(|	 d#|
  |S | |	|
}|r||d< || j|< t	d)|	 d#|
  |S | |	|
}|r@||d< || j|< t	d*|	 d#|
  |S t	d+|  | |	|
|}||d< || j|< |S ),u$   播放器 - 多源获取真实歌词z@@@@r   z|||r   z\/r6   r   z*/*zidentity;q=1, *;q=0zbytes=0-)r   r   AcceptAccept-EncodingRange)parser/   headerr   zac=vplayr/   Nr   zac=musicz
id=([^&]+)rw   r{   r  Zlrc_lrcu   📦 使用缓存歌词: u   🎵 尝试获取歌词 ID: r   r   r   timeout   r  r  uS   \s*[-|]\s*(?:MP3|免费下载|LRC|歌词|动态歌词|热门歌单|推荐音乐).*$r  r   r\  u   ✅ 源1获取成功: u   ✅ 源2获取成功: u   ✅ 源3获取成功: u!   ✅ 源4(网易云)获取成功: u    ✅ 源5(QQ音乐)获取成功: u   ✅ 源6(酷狗)获取成功: u3   ❌ 所有歌词源都失败，使用备用歌词: )d64r   r;   r   r   r+   r,   rh  r   r   r   rc  status_codepqr   rd  ri  r   r   _get_lrc_from_source1_get_lrc_from_source2_get_lrc_from_source3_get_lrc_from_netease_get_lrc_from_qq_get_lrc_from_kugou_generate_fallback_lyrics)r"   flagr   vipFlagsrawr  r/   resultr   ry  r  Zsong_id_match	cache_keymp3_urlrespr   r  r   lrc_contentZfallback_lrcr%   r%   r&   playerContent  s    















zSpider.playerContentc                 C   s   z|| j  d| }| jj|| jdd}|jdkrzdD ]D}z.|j|}td|rd| 	|W   W S W q4   Y q4Y q4X q4W n   Y nX dS )u   源1: 从down.php获取/down.php?ac=music&lk=txt&id=   r  r  utf-8gbkgb2312big5\[\d{2}:\d{2}N
r   r   rc  r   r  contentdecoder+   r,   _filter_lrc_adsr"   r   lrc_urllrc_respencodingr  r%   r%   r&   r    s    
zSpider._get_lrc_from_source1c                 C   s   z| j  d| d}| jj|| jdd}|jdkr|j}td|}|sTtd|}|r|d}| j  d	| }| jj|| jdd}|jdkrd
D ]D}	z.|j	
|	}
td|
r| |
W   W S W q   Y qY qX qW n   Y nX dS )u   源2: 从lkdown参数获取r{   r   r   r  r  zlkdown\(\'([^\']+)\'\)zlkdown\("([^"]+)"\)rw   r  r  r  N)r   r   rc  r   r  r   r+   r,   rh  r  r	  r
  )r"   r   r  Zmp3_respr   Zlkdown_matchZlrc_idr  r  r  r  r%   r%   r&   r    s.    


zSpider._get_lrc_from_source2c                 C   s   z~| j  d| d}| jj|| jdd}|jdkr|dD ]D}z.|j|}td|rf| 	|W   W S W q6   Y q6Y q6X q6W n   Y nX dS )	u   源3: 从data/lrc/获取z
/data/lrc/z.lrcr   r  r  r  r  Nr  r  r%   r%   r&   r    s    
zSpider._get_lrc_from_source3c                 C   s  |r|sdS zd}| d| dddd}dd	d
}| j j|||dd}|jdkr| }|d dkr|d d r|d d d }|d }	d}
|	dddd}| j j|
||dd}|jdkr| }d|kr|d d r|d d }td|r| |W S W n   Y nX dS )u$   源4: 从网易云音乐获取歌词Nz(https://music.163.com/api/search/get/web rw   r   r   )srb   offsetr  <Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zhttps://music.163.com/r   paramsr   r  r  coder  songsr   z$https://music.163.com/api/song/lyricr   )r   lvkvZtvr  lyricr  )r   rc  r  jsonr+   r,   r
  )r"   ry  r  r  r  r   search_respdatar  r   r  
lrc_paramsr  lrc_datar  r%   r%   r&   r    sD    

zSpider._get_lrc_from_neteasec                 C   sb  |r|sdS zBd}| d| dddd}dd	d
}| j j|||dd}|jdkrN| }|d dkrN|d d d rN|d d d d }|d }	d}
|	dd}| }d	|d< | j j|
||dd}|jdkrN|j}td|}|rNt|	d}d|krN|d rN|d }ddl
}||d}td|rN| |W S W n   Y nX dS )u   源5: 从QQ音乐获取歌词Nz1https://c.y.qq.com/soso/fcgi-bin/client_search_cpr  r  rw   r   )wformatprM   r  zhttps://y.qq.com/r   r  r  r  r   r  r  rp   songmidz9https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg)r"  r   r   z({.*})r  r  r  )r   rc  r  r  copyr   r+   r,   loadsrh  base64r   r	  r
  )r"   ry  r  r  r  r   r  r  r  Zsong_midr  r  Zlrc_headersr  lrc_textmatchr  r  r%  r%   r%   r&   r    sN     zSpider._get_lrc_from_qqc                 C   sT  |r|sdS z4d}d| d| ddd}| j j||dd}|jd	kr@| }|d
 dkr@|d d r@|d d d }|d }d}	ddd|d|kr|d d ndd}
| j j|	|
dd}|jd	kr@| }|d
 dkr@d|kr@|d d d r@|d d d }ddl}||d}td|r@| 	|W S W n   Y nX dS )u!   源6: 从酷狗音乐获取歌词Nz-http://mobilecdn.kugou.com/api/v3/search/songr  r  rw   r   )r   rx  r
  pagesize)r  r  r  statusr  infor   hashzhttp://krcs.kugou.com/searchyesmobir|  i  )verZmanclientr+  Z
timelengthZlyricsr  r  r  )
r   rc  r  r  r%  r   r	  r+   r,   r
  )r"   ry  r  r  r  r  r  r  r   r  r  r  r  r  r%  r%   r%   r&   r  ,  sD    *zSpider._get_lrc_from_kugouc                 C   s   |sdS |  }g }dddddddd	d
ddddddddddddg}|D ]}| }|sb|| qFtd|rd}|D ]}t||tjrvd} qqv|s|| qFtd|tjr|| qF|| qFd|S )u!   过滤LRC歌词中的广告内容r   u   欢迎访问.*u   欢迎来到.*u   本站.*u
   .*广告.*u   QQ群.*u   微信.*z	.*www\..*z.*http.*z	.*\.com.*z.*\.cn.*z	.*\.net.*u   .*音乐网.*u
   .*提供.*u
   .*下载.*u
   .*免费.*u
   .*版权.*u
   .*声明.*u
   .*邮箱.*u
   .*联系.*ZoeeccZfoxmailz^\[\d{2}:\d{2}FTz%^\[(ar|ti|al|by|offset|total|length):
)	
splitlinesrstripr   r+   r'  r,   
IGNORECASEr-   rj  )r"   r&  linesZfiltered_linesZad_patternslineZis_adpatternr%   r%   r&   r
  Z  sV    
zSpider._filter_lrc_adsc           
      C   s   |s|rd| nd}|r&d| dnd}|d| d7 }|d7 }t dd	D ]}|d
 }|d
 d }d|dd|dd}|d dkrd| d}	n@|d dkrd|r|d nd | d}	n|d dkrd}	nd}	|| d|	 d7 }qL|S )u   生成备用歌词u   歌曲 u   未知歌曲z[ar: z]
r   z[ti: u   [by: 世纪音乐网]

r   $      r   [Z02d:z.00]   u   ♪ u    ♪rw   u   ♫ r   u    ♫r\  u   正在播放...u   暂无歌词，请欣赏音乐r  r0  rq   )
r"   ry  r  r   fallbackr[   minutessecondsZtime_tagr  r%   r%   r&   r    s$    z Spider._generate_fallback_lyricsc                 C   s   t |dd}|d}|dkrfz(dd| jj|d| jd id	d
ji gW S    dddi g Y S X n^|dkrz<| jj|d| jd id	d
}| |j}dd|di gW S    dddi g Y S X d S )Nr/   r   rb   r~   r  z
image/jpegr   r6   r   r  i  z
text/plainzImage Errorr  zapplication/octet-streamr  z	LRC Error)r   rc  r   r   r  r
  r   encode)r"   paramr/   rt  rr  r%   r%   r&   
localProxy  s    
(zSpider.localProxyc              	   C   s  t d|}|r|dnd}| |d p0d}| |}d}|dd}|r^| }n.t d|}|r|d }||d	 d}|d
d	dp|dd	d}|sd}g }	| j
 d| d}
|	| d| d|
   |rd }|d D ]T}| }|	d}|rd|ksNd|ksNd| ksNd|kr|} q\q|r| |}d|krd|kr| |}|d D ]B}d| ksd| kr|	d}|r| |} qڐqtd|  | |}d}|d D ]}|dd}|	d }rd|kr2q||kr@q| }| |}|dd d d}| j
 d| d}|	| d| d|   |d7 }|d!kr qqtd"| d# d$|	|r| j|d%d&nd|d'S )(Nr  rw   r   r  r  .play_singer .name ar   r  r   r  r}   r|   z#https://p2.music.126.net/xxx/mv.jpgr   r   r  r  z-.ilingku_fl a, .singer_info a, .play_singer arz   r  r  rI   r  video.ilingku_fl au   🎬 获取同歌手MV: r  rx   r   r6   r   r      u   🎬 找到同歌手MV: r   r  Tr   )r  r   r`  )r+   r,   rh  r   r   rg  r   ri  r;   r   r   r   r  r   rY   r   r   r   r   rj  r>   )r"   r   r/   r  rP   ry  rz  r{  r   	play_urlsr   Zsinger_linkry   r   rz   r  r  Zmv_pager  ru  r   r  r   Zmv_play_urlr%   r%   r&   _get_mv_detail  st    

(
2










zSpider._get_mv_detailc              	   C   s`  g }d}g }|d  D ]@}| }d|ks@d|ks@d| kr|d}|r|| qtt|}|r<|d }| |}	td|	  | 	|	}
|
d  D ]}|d	
d}|d }sqd
|kr| }| |}|dd dd}| j d| d}|| d| d|   |d7 }|dkr q<q|r\td| d d|S d S )Nr   rE  r  r  rI   rz   u   🎬 获取歌手MV列表: r  rx   r   r6   r   r   r   r   r   r  r  rw   r      🎬 歌手MV: 获取到     部r  )r   r   rY   r   r   rp   r   r   r   r   r   rg  r   r;   r   r  rj  )r"   r   r/   r  ru  Z
video_urlsry   r   Z
video_linkZ	video_urlZ	video_docr   rz   rP   r  r   r%   r%   r&   _get_singer_mvs	  s@    




zSpider._get_singer_mvsc              
   C   sj  g }g }g }d}|d  D ]}|dd}|d }	s>qd|	kr| }
| |
}
|	dd dd	}| j d
| }||
 d| 	d|   |d7 }q|
d}|ds|d }g }|d  D ]&}|  }| r|t| q|rt|}td| d td|d D ]}t|dkrHtd  qd|kr|drvtdd| d|}n|
dd| d }n|d| d }td| d|  | |}|r| dkrtd| d q&d}|d  D ]}t|dkr q|dd}|d }	s.qd|	kr| }
| |
}
|	dd dd	}| j d
| }||
 d| 	d|   |d7 }|d7 }qtd| d| d | |}|s&td| d   qq&|rd!}t|| d | }t|D ]}|| }t|| t|}||| }|d }|dkr\|d"t| d# n"|d$| d| d%t| d# |d&| qtd'| d(| d) | ||}|rt|d&}|d*| d+ || td,| d- |r|rd.|d.|d/S |r4d"| d#d&|d/S |rLd*| d+|d/S d0d1| 	d|  d/S d S )2Nr   r  rx   rz   r{   r6   r   r   r   r   r  r  rw   r  u   📊 歌手歌曲共有 u,    页，当前第1页，将获取剩余页面r\  r   u5   📊 已达到500首上限，停止获取更多页面r  r  r  Zindex_u   📄 获取第 u    页歌曲: rv   u   ⚠️ 第 u    页获取失败，跳过u	   📄 第 u    页获取到 r  u"    页没有下一页，停止获取d   u   🎵 歌手歌曲 · u   首u   🎵 歌手歌曲 r]  r  u#   🎵 歌手歌曲: 总共获取到 u    首，分成 u    页u   🎬 歌手MV · u   部rI  rJ  z$$$)r  r  u   暂无内容r  )r   r   r   r   rg  r   r;   r   r   r  r2  endswithri  r  rb  r  r   rr   r   r+   rd  r   r   rk  minrj  rK  )r"   r   r/   Z	play_fromr   r  r  r   ry   rz   rP   r   Zplay_url_mp3base_urlZpagesr   r  r
  r  r  r  rs  	page_sizerr  rp  rq  Z
page_songsZpage_numZmvsru  r%   r%   r&   r  <	  s    










"


zSpider._get_singer_detailc           
   
   C   s   g }|d  D ]}|dd}|s(q|d}|s8q|dd}| }|dd}|d}	|| || ||	r| j|	dd	nd
ddddd q|S )Nz.singer_list liz.pic ar   rz   rx   r~   r}   Tr  r   rF   r  rw   r  r  )r   r   r   r   r   r   r   r>   )
r"   r   r   r   Zpic_arz   Zname_arP   r~   r   r%   r%   r&   re  	  s(    


zSpider._parse_singer_listc           	   	   C   s   g }|d  D ]}|dd}|d }s2qd|kr| }| |}|dd dd	}| j d
| }|| d| 	d|   q|rdd
|iS dd| 	d| j  iS )Nr  rx   r   rz   r{   r6   r   r   r   r   r  r  r  r  r  )r   r   r   r   rg  r   r;   r   r   r  rj  )	r"   r   r  r   ry   rz   rP   r   r   r%   r%   r&   r  	  s    
 zSpider._get_playlist_songsc                 C   sX   t d|}|r|dnd}| j d| }|d p<d}d| d|  |dS )	Nr  rw   r   r   rC  u   播放$r  )r  r`  )r+   r,   rh  r   r   r  )r"   r   r/   r   r   rG   r%   r%   r&   _get_song_detail	  s    zSpider._get_song_detailc                 C   s:   |sdS t dd|}t dd|}t dd|}| S )Nr   z\s*-\s*$z^\s*-\s*z\s+r  )r+   rd  ri  )r"   rP   r%   r%   r&   rg  	  s    zSpider._clean_song_namec                 C   sr   g }|d   }r || n@|d   }r`|d|  |d   }r`|d|  |rnd|S dS )Nz.singer_info .info prC  u	   歌手：za[href*="/album/"]u	   专辑：r0  u   世纪音乐网)r   r   rj  )r"   r   r/   r  descrG   Zalbumr%   r%   r&   r  	  s    zSpider._get_contentc                 C   s$   |sdS t jdd|t jd}| S )Nr   u   (世纪音乐网|MP3免费下载|LRC动态歌词下载|高清MV|车载MV|夜店视频|热门榜单|全部歌曲|第\d+页|刷新|首页|免责声明|版权|非営利性|自动收录|联系邮箱|oeecc#foxmail\.com))flags)r+   rd  r-   ri  r"   r   r%   r%   r&   r   
  s    zSpider._cleanc                 C   s   t dD ]}z| |}td|  | jj|d| jd | jd dddd	d
dd}d|_|jdkr|j	rtd|  t
|j	W   S td|j  W q tk
r } z,td|d  d| d|  td W 5 d }~X Y qX qtd|  t
dS )Nr   u   🌐 请求:    r   r6   zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8z#zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3zgzip, deflatez
keep-aliver  )r   r   r  zAccept-Languager  
ConnectionzUpgrade-Insecure-Requests)r  r   r  r  u   ✅ 请求成功: u   ⚠️ 请求失败: u   ⚠️ 请求异常 (rw   z/3): r   u   ❌ 请求最终失败: rv   )rr   r   r   r   rc  r   r   r  r  r   r  r   r   r   )r"   r/   r[   full_urlr  r   r%   r%   r&   r   
  s4    
zSpider.getpqc                 C   sJ   |sdS | dr|S | dr(d| S | dr<| j| S | jd | S )Nr   r7   r4   r5   r6   )r:   r   r.   r%   r%   r&   r   .
  s    



zSpider._absc                 C   s   t |ddS Nr  )r   r?  r	  rT  r%   r%   r&   r  9
  s    z
Spider.e64c                 C   s,   zt |ddW S    | Y S X d S rX  )r   r?  r	  rT  r%   r%   r&   r  <
  s    z
Spider.d64)r   )FF)r  )Nr   )Nr   )Nr\  )Nr\  )Nr   )3__name__
__module____qualname__r'   r)   r0   r1   r3   r>   ru   r   r}  rk  r  rl  rf  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  rB  rH  rK  r  re  r  rQ  rg  r  r   r   r   r  r  r%   r%   r%   r&   r
      sn   

l   Y6!1
+GbB
0&  
<
T
2J
1 /5.<K( 

"r
   )r+   sysr  r   hashlib	threadingr%  r   r   urllib.parser   r   Zpyqueryr   r  requestsr   r   Zurllib3.util.retryr	   pathr   base.spiderr
   r%   r%   r%   r&   <module>   s   