o
    Р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dmd4d5Zd6d7 Zdkd8d9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 )nr
    c                 C   s   d| _ t | _tjtddg d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      dS )Nu&   世纪音乐网·爱听音乐风格版r%   r"   r%   r%   r&   getName)      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   r(   )NFr%   r)   r%   r%   r&   manualVideoCheck/   r+   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r| j| }n| ds%| jd | }|r3|dd}|dd	}|r;|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"   r1   	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 )rN   )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)rI   rK   rG   )classfilterslistrange)r"   filterclassesrq   r%   r%   r&   homeContentG   s   

$`zSpider.homeContentc                 C   s  z|  d}|r| dkr*td td |  d}|r%| dkr*dg iW S g }t }g | _|d D ]}|dd}|sJ|d	d}|sS|d
d}|	d}|r^d|vr_q8|
 }|d
 }|sx|dd}	|	rx|	
 }|d	d}
|
s|d	d}
|
sd}
|r| d| n|}| |}||vr|| |dd dd}| j d| }| j|| || |
d||||d ||| || |
dd q8|d D ]e}|d	d}|s|d
d}|	d}|rd|vrq|
 }| |}||vrI|| |dd dd}| j d| }| j|| |dd|d||d ||| |ddd q|d D ]}|d	d}|sc|d
d}|	d}|rpd|vrrqP|
 }|d	d}
| |}||vr|| |dd dd}| j d | d!}| j|| ||
r| j|
d"d#ndd$d"||d% ||| ||
r| j|
d"d#ndd$d qPtd&t| d't| j d( d|d d) iW S  ty
 } ztd*|  dg iW  Y d }~S d }~ww )+Nr8   <html></html>u+   ⚠️ 首页获取失败，重试一次...   rr   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_idrI   rR   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   seen_idslir{   r|   rR   rI   singer_elempic	full_namer   r   r   r   er%   r%   r&   homeVideoContent   s   















 zSpider.homeVideoContentc           -       C   sd  t |pd}g }|dkr|  S |dkri 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/d0d1d2d3}dd4d5dd6d5dd7d5d
d8d5dd9d5dd:d5dd;d5dd<d5dd=d5dd>d5dd?d5dd@d5ddAd5ddBd5d dCd5d"dDd5d$dEd5dFdGd5dHdId5dJdKd5dLdMd5dNdOd5dPdQd5dRdSd5dTdUd5dVdWd5dXdYd5dZd[d5d\d]d5d^d_d5g}|d d` }|d` }	|||	 }
|
D ]}||da db}|dc|da  |dd |dedfdgdhdi qt|dj d` }|||d`t|dkS |dlkr|dmdn}|dodp}|dnkr5dq| dr}n|r?dq| dr}nds}|dkrQtdtdu| dr|}| |}|dv D ]@}|dw	dx}|
dy}|rrdz|vrtq\| }|d{
d|}|| || ||r| |ndpd}dfdgdhdi q\t|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}n|dkrd| 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}g d}|d D ]}|dw	dx}|s|d	dx}|
dy}|rd|vrqn| }|}| |}d} | }!|D ]}"|" |!v rd} |d7 }td| d|" d  nq| rƐqndp}#|d	dx}$|$r|$ }#ntd|}%|%r|%d }#|%d }|d{
d|}|s|d
d|}dp}&|d}'|'r|' }&|dud drdp}(dg})|#r"|)|# |&r*|)|& | |||r9| j|ddndd|)|#|&rJd|# d|& nd|# dfddh|(||||#d}*||* |d7 }qntd| du| du| d| d| d| d | |}|r|d }+n|}+| |||},td| d| d|+ d|  |||+d`|,dkS ||dd`ddkS )Nry   rA   rE   rl   Vhttps://p2.music.126.net/sBqYS1rtmY6OUJ3rT_xN4A==/109951166953507139.jpg?param=500y500rj   Vhttps://p2.music.126.net/8Lh8h0tLIn3n7RzvHzY0Wg==/109951166953506369.jpg?param=500y500originalVhttps://p2.music.126.net/gHjcNZjLRJwPmgI0oO0c0A==/109951166953507432.jpg?param=500y500topVhttps://p2.music.126.net/Dr7Wwiy-Jq7D7lgX3hZk3A==/109951166953506898.jpg?param=500y500douyinVhttps://p2.music.126.net/_o_bh5iUjO5gNx0fLzlN_w==/109951166953507739.jpg?param=500y500kuaishouVhttps://p2.music.126.net/SCP69gC-x7W1aX8K3fQp2g==/109951166953508058.jpg?param=500y500zwdjVhttps://p2.music.126.net/AeMq1vF46KSxIJ1_Lk7DnA==/109951166953508286.jpg?param=500y500rk   Vhttps://p2.music.126.net/xB5yPyMqnWktaRk44fUwCQ==/109951166953508516.jpg?param=500y500japanVhttps://p2.music.126.net/NN7gD80fO-FC6D08ZfP6YA==/109951166953508879.jpg?param=500y500rV   Vhttps://p2.music.126.net/7G3bJzOtdS5T9C-OynOR6A==/109951166953509153.jpg?param=500y500koreaVhttps://p2.music.126.net/RZqN-nhudVw9J6A1FhxY3Q==/109951166953509535.jpg?param=500y500americaVhttps://p2.music.126.net/QWzC_wLjJ4vC7__6R3PUFg==/109951166953509853.jpg?param=500y500acgVhttps://p2.music.126.net/Aq-YLyaG0inF8-eBY0e0rw==/109951166953510130.jpg?param=500y500acgyxVhttps://p2.music.126.net/WE0C0US8Z2-6v4kQ8ey8nA==/109951166953510408.jpg?param=500y500acgdmVhttps://p2.music.126.net/n3SlR1n7ZdbQOU5ADK5P4g==/109951166953510646.jpg?param=500y500omtopVhttps://p2.music.126.net/sYpp9uCiY2Fim92O6QZ_Lw==/109951166953510939.jpg?param=500y500dianVhttps://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uktopro   raptopdytopqianliyytopystopxyztopdjtopktvtopchetopaytopsqtop   🔥 音乐飙升榜)idrR      ✨ 新歌排行榜   🎸 音乐原创榜   🎵 Top热歌榜   🎶 抖音热歌榜   📱 快手热歌榜   💃 中文DJ榜   🌐 网络热歌榜   🗾 日本歌曲榜   🌍 欧美新歌榜   🇰🇷 韩国音乐榜   🇺🇸 美国音乐榜   🎮 ACG新歌榜   🕹️ ACG游戏榜   📺 ACG动画榜   🌎 欧美热歌榜   ⚡ 电子舞曲榜r      🇬🇧 UK排行榜ro      🎻 古典音乐榜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_rR   u   📊 点击播放完整榜单rectHzG?rd   ratior   r   r   r   rn      rr   page	pagecountlimitr   rG   rm   rY   rn   r   z/playlists/r   z/playlists/index.html\.html$r8   r   rz   r   r|   
/playlist/r~   r   rF   C   .pages a:contains('下一页'), .pagination a:contains('下一页')'  rI   rL   rM   rT   rU   rX   z/singerlist//index/z/index.htmlrK   rd   ri   )rT   rd   ri   r  u   🎬 MV URL: )K   采访   访谈   专访	   见面会	   发布会	   记者会r     直播   现场   彩排   后台   综艺   节目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FOCUSr     访问talkTalkTALKskitSkitSKITvlogVlogVLOGlogLogLOGr     采访视频   采访片段   广告拍摄   广告花絮   广告幕后   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   rJ   r   z+https://p2.music.126.net/xxx/mv_default.jpg    ·    🎬 MV · {Gz?)r   r   r   r   	vod_actorvod_contentrn   Z_mv_idZ_area_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_namer[   r.   groupstripr   r=   join_check_has_next_page_estimate_total_count)-r"   tidpgru   r#   r   	rank_picsrE   startendZ
page_itemsrankr   total_pagesrm   rn   r1   r   r   r{   r|   rR   has_nextrL   rT   rX   type_ri   mv_countZfiltered_countfilter_keywordsZname_originalshould_filterZ
name_lowerkeywordartistartist_elemartist_matchdurationZduration_elemr   remarks_partsZmv_itemr  r   r%   r%   r&   categoryContentO  s  
	
"!
	




	


 




#





.

 	zSpider.categoryContentc                 C   s   g d}|D ]$}||}|r*| ds*| ds*|d}|r*|dkr*|dkr* dS qg }|d D ]}|  }| rF|t| q3|rXt|}	| 	|}
|	|
krXdS g d	}|D ]}||}|rx|d}|rx|dkrx|dkrx dS q^d
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disabler|   #zjavascript:void(0)T .pages a, .pagination a, .page a)u   .pages a:contains('末页')u    .pagination a:contains('末页')u   .pages a:contains('最后')u    .pagination a:contains('最后')F)
	has_classr   r   r   rm  isdigitr   rf  max_get_current_page)r"   r   Znext_selectorsselectorZ	next_linkr|   page_numbersr{   r   max_pagecurrent_pageZlast_selectorsZ	last_linkr%   r%   r&   ro    s:   


zSpider._check_has_next_pagec                 C   s   |d  D ]}|  }| rt|  S qg }|d  D ]}|  }| r4|t| q!|r?|r=|d S dS dS )u   获取当前页码zZ.pages .current, .pagination .current, .page .current, .pages .active, .pagination .activer  r   ry   )r   r   rm  r  rf  r   )r"   r   r{   r   r  r%   r%   r&   r    s   zSpider._get_current_pagec                 C   s   |d  }td|}|rt|dS td|}|r(t|d}|d S g }|d D ]}	|	   }
|
 rC|t|
 q0|rNt	|}|d S |dk rZ|d d | S dS )u   估计总条数z.pages, .pagination, .pageu   共(\d+)条ry   u   共(\d+)页r  r  r  )
r   r-   r.   rf  rl  r   rm  r  r   r  )r"   r   Zcurrent_countr  Z	page_infoZtotal_matchZpages_matchrw  r  r{   r   r  r%   r%   r&   rp    s(   zSpider._estimate_total_countc              	   C   sb  ddddddd}ddd	d
dd}dddd}| |d}| |d}	| |d}
|dkri|dkr;|	dkr;d|
 dS |dkrL|	dkrLd| d|
 dS |dkr]|	dkr]d|	 d|
 dS d| d|	 d|
 dS |dkrz|	dkrzd|
 d| dS |dkr|	dkrd| d|
 d| dS |dkr|	dkrd|	 d|
 d| dS d| d|	 d|
 d| d	S )u   构建MV分类URLrY   ra   rb   rV   rW   rc   rY   ra   rb   rV   rW   rc   re   rf   rg   rh   rY   re   rf   rg   rh   rj   rk   rl   rj   rk   rl   ry   z/mvlist/index/index/r   z/mvlist/r  z/mvlist/index/r8   )rg  )r"   rT   ry  ri   rr  Zarea_mapZtype_mapZsort_mapZarea_valZtype_valZsort_valr%   r%   r&   rj    sF   
	zSpider._build_mv_url1c              
   C   s8  dt | d| }| |}g }|d D ]h}|dd}|d }	s(q| }
|ddp4d	}d
|	v rAd}ddd}nd|	v rMd}ddd}nd|	v rYd}ddd}nd}ddd}|| |	| |
|rx| j	||dk|dkdnd	||d qt
|d}|rt|d nt|}|t||dddS )N/so.php?wd=z&page=.play_list li, .video_list lirz   r   r|   r   r   r   r}   u   🎵 歌曲r  r  r  r   rJ   rb  r  rF   rH   ovalry   )r>   r?   r
  r  r  r  r  )r   r   r   r   r   r   r   r   r   r@   r,   rf  )r"   rQ   quickrr  r1   r   r   r   r{   r|   rR   r   remarksrn   rx  r  r%   r%   r&   searchContentC  sF   


	zSpider.searchContentc           	      C   s  |  |d }d|v r |dd| jddd}| ||S | jD ]}|d |kr<td|d   | ||  S q#d|v rL| |}| ||S d	|v r[| |}| 	||S d
|v r| |}| 
|d pv|d dd }|dddp|ddd}|r|dd}|d| |r| j|ddnd| ||d}|| || d|giS d|v r| |}| 
|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pJ|dddpJ|ddd}|||rU| |nd| ||d}d|giS )Nr   r  r   r8   r   u   🏠 使用首页推荐缓存: r   r   r}   /singer/h1title_z.singer_info .pic imgr   r~   r:   r;   u   👤 Tr>   )r   r   r   rd  rr   r  .video_list .pic imgu   📀 rF   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"   idsr1   	rank_typecached_itemr   r  r   vodr%   r%   r&   detailContentn  sb   



((



((


*@

zSpider.detailContentc           
      C   s  i 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/d0}i dd1dd2dd3dd4d	d5dd6dd7dd8dd9dd:dd;dd<dd=dd>dd?dd@d!dAdBdCdDdEdFdGdHdIdJdKdLdMdNd0}| |dO| }| |dP}| |}|rt|dQ}|||| dR| dSdT|dU}	n|||| dVdTdW| dX| j  dU}	dY|	giS )Zu<   处理排行榜详情 - 使用网易云音乐的封面图片rl   r   rj   r   r   r   r   r   r   r   r   r   r   r   rk   r   r   r   rV   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&   首歌曲

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

网易云音乐风格封面   暂无歌曲$0@@@@rr   )rg  _get_rank_playlistr   r   e64r   )
r"   r  r1   rs  Z
rank_namesZ	rank_nameZrank_picrG   
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| }|rG| d	| n|}| d
| d|  g}	| jD ]<}
|
 d|kr|
 ds|
 dd}|
 dd}|
 dd}|r|r| d	| n|}|		| d
| d|   qYt
|	dk r| jdt
|	 d}|r|	| g }t }|	D ]}
|
d
}t
|dkr|d }||vr|| |	|
 qd|}|d|d  |d d|d  dt
| dd||d}d|giS )u   处理首页推荐详情r?   rR   r   rI   r   /mp3/([^/]+)\.htmlry   r   r   $r  r   r   r  r  r_  r   r     🎵 r   r   u   🎵 首页推荐 · u   
共   首歌曲循环播放u   🎵 首页推荐播放列表)r   r   r   rd  r  r  rc  rr   )rg  r   r  r-   r.   rl  r   r  r!   r   r   _get_hot_song_playlistr#   r   r   r   rn  )r"   r  r1   r   	song_namerI   r   r   display_namerG   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    s^   











z!Spider._get_home_recommend_detailNr  c              
   C   sh  g }zd}|  |}|d D ]}t||kr W |S |dd}|s&q|d}|r1d|vr2q|r9||v r9q| }	| |	}	d}
|dd}|rR| }
ntd	|	}|ri|	d

 }
|	|
d d}	|
rr|
 d|	 n|	}|dd dd}| j d| }|| d| d|   qW |S  ty } ztd|  W Y d}~|S d}~ww )u   获取热门歌曲播放列表z/list/rise.html.play_list lirz   r   r|   r}   r   .singer a, .artist a^(.+?)\s*-\s*ry   r   r8   r   r   r   r  r  u   ❌ 获取热门歌曲失败: N)r   r   r   r   r   r   rk  r-   r.   rl  rm  r=   r   r   r   r  r   r   )r"   
exclude_idr  rG   r1   r   r   r{   r|   rR   r~  r  r  r  r   r   r   r%   r%   r&   r  Y  sJ   
#


 %zSpider._get_hot_song_playlistc              	   C   s~  g }d| d}z|  |}|d D ]@}|dd}|d }s%qd|v rT| }| |}|dd	 dd
}	| j d|	 }
|	| d| 
d|
   qzTd| d}|  |}|d D ]@}|dd}|d }sxqgd|v r| }| |}|dd	 dd
}	| j d|	 }
|	| d| 
d|
   qgW n   Y W n   Y d S |rd|S d S )Nz/list/r   r  rz   r   r|   r}   r8   r   r   r   r  r  z/2.htmlr  )r   r   r   r   r   rk  r   r=   r   r   r  rn  )r"   r  epsr1   r   r   r{   r|   rR   r   r   Zurl2Zdoc2r%   r%   r&   r    sH   




zSpider._get_rank_playlistc           4      C   s  t d|}|r|dnd}| |d pd}| |}d}|dd}|r/| }nt d|}|rF|d }||d	 d}|d
d	dpc|dd	dpc|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|  g d}g }t|dD ]q}t|dkr ng| |
|||}td| d|  | |}|r| d kr nEg }|d! D ]}|d"d}|sq|	d#}|rd$|vrq| }|}| |}d%}| }|D ]}| |v r$d&}td'| d(| d)  nq|r*qd}|d*d}|r;| }nt d|}|rS|d }||d	 d}|r]| d	| n|}|d+d, d-d}| j
 d| d}|||||d. qtd/| d0t| d1 ||krd,} t|D ]\}!}"|"d2 |kr|!}  nq| dkr|| d3 D ]}"||"d4  d5| d6|"d7    qtd8| d  d9 n7|D ]}"||"d4  d5| d6|"d7    qtd: n|D ]}"||"d4  d5| d6|"d7    q| |}#|#std/| d;  nqt|d<k rAtd=t| d> t|d dd,D ]}t|dkrC n| |
|||}td| d?|  | |}|rd| d krfq7g }|d! D ]}|d"d}|s|qn|	d#}|rd$|vrqn| }|}| |}d%}| }|D ]}| |v rd&}td@| d(| d)  nq|rqnd}|d*d}|r| }nt d|}|r|d }||d	 d}|r| d	| n|}|d+d, d-d}| j
 d| d}|d||||d. qntd/| d0t| dA g }$|D ]}"|$|"d4  d5| d6|"d7    q$|$| }q7g }%t }&| d5| d6|	  }'| d6|	 }(|&|( |%|' |D ]'})|)d5}*t|*dBkr|*d, }+|+|&vr|+|(kr|&|+ |%|) qetdCt|% dD dE|%},dFdGdHdIdJdKdL}-dFdMdNdOdPdQ}.dRdSdTdU}/|-|
|
}0|.||}1|/||}2|dV| |r| j|d&dWnd|dX| dYt|% dZ|0 d+|1 d+|2 
d[|,d\}3d]|3giS )^uX   获取MV详情并创建当前分类播放列表 - 从当前MV开始按分类顺序播放/mp4/([^/]+)\.htmlry   r   r     当前MVz5.play_singer .name a, .singer_info .name a, .artist ar   r  r   r  r   r~   r  r   r   u   🎬 当前MV播放URL: rT   rY   rd   ri   rk   r  u   🎬 当前分类: 地区=u	   , 类型=u	   , 排序=u   , 当前页=)Jr  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  r  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  
      u   🎬 获取第u   页MV: rx   .video_list li, .play_list lirz   r|   r   FTu'   🎬 过滤非MV内容（详情页）: r]  r^  r  r8   r   r   )rR   r   r|   r      🎬 第   页获取到 u    个MV（过滤后）r   NrR   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   ra  r  u"   个MV循环播放

当前分类：u   🎬 MV播放列表r   r   r   rc  rd  r  r  rr   )r-   r.   rl  r   r   rk  r   rm  r=   r   r   r   r    rg  rt   r   rj  r   r   r   r[   r   r   	enumerater  ro  insertr   r   rn  r@   )4r"   r   r1   video_idrR   r~  r  r  r   current_play_urlrT   ry  ri   r  r{  Zall_mvsr  page_urlpage_docZpage_mvsr   r{   r|   mv_nameZmv_name_originalr|  Zmv_name_lowerr}  Z	mv_artistr  r   r   current_indexr]   rK   rx  Z	temp_listr  r  Zcurrent_mv_entryZcurrent_url_partr  r  r  r  Z
area_namesZ
type_namesZ
sort_namesZ	area_namerB   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 |S | ||||}| |}	d}
|	d D ]}t|dkr3 n|dd}|s=q)|d}|rHd|vrIq)|rP||v rPq)| }| |}d}|d	d}|ri| }nt	
d
|}|r|d }||d d}|r| d| n|}|dd dd}| j d| d}|| d| d|   |
d7 }
q)td| d|
 d | |	}|s |S q	|S )u)   获取分类页面的所有MV（多页）ry   r   r   r  rz   r|   r   r   r  r  r   r8   r   r   r   r   r  r  r  r  u    个MV)rt   r   rj  r   r   r   r   r   rk  r-   r.   rl  rm  r=   r   r   r   r  r   ro  )r"   rT   ry  ri   r  	max_pagesrG   r  r1   r   
page_countr   r{   r|   r  r~  r  r  r  r   r   rx  r%   r%   r&   _get_all_category_mvs  sR   4





zSpider._get_all_category_mvsr_  c              
   C   s  g }dt | d}| |}d}|d D ]}|| v r&|d} nq|s+|S | |}| |}	d}
|	d D ]}| }d|v sQd|v sQd	| v rX|d}
 nq=|
s]|S | |
}
td
|d
 D ]}t|dkrt |S |
}|d
krt	
dd| d|
}| |}d}|d D ]b}t|dkr nY|dd}|sq|d}|rd|vrq|r||v rq| }| |}||vr| d| }|dd dd}| j d| d}|| d| d|   |d
7 }qtd| d| d | |}|s |S qi|S )u&   获取同歌手的所有MV（多页）r  &page=1Na[href*='/singer/']r|   z.ilingku_fl a, .nav a, .tag a   视频MVrK   ry   r  r  r8   r   r   r  rz   r   r   r   r   r   r   r  r  u   🎬 歌手MV第r  r   )r   r   r   r   r   r   r[   rt   r   r-   rh  r   rk  r   r=   r   r   r  r   ro  )r"   r~  r  r  rG   
search_urlr   
singer_urlr{   
singer_docZmv_urlr   r  r  mv_docr  r   r|   r  r   r   rx  r%   r%   r&   _get_singer_all_mvs  st   





-




zSpider._get_singer_all_mvsc              
   C   s<  g }t d|d D ]}t|dkr |S |dkrd}nd| d}| |}d}|d D ]W}t|dkr8 nN|dd}	|	sBq.|	d	}
|
rMd
|
vrNq.|rU||
v rUq.|	 }| |}|
dd 	dd}| j
 d| d}|| d| d|   |d7 }q.td| d| d | |}|s |S q	|S )u   获取热门MV（多页）ry   (   z/mvlist/index/index/hot.htmlz/mvlist/index/index/hot/r   r   r  rz   r|   r   r8   r   r   r   r   r  r  u   🎬 热门MV第r  r   )rt   r   r   r   r   r   r   rk  r   r=   r   r   r  r   ro  )r"   r  r  rG   r  r1   r   r  r   r{   r|   r  r   r   rx  r%   r%   r&   _get_all_hot_mvsQ  sD   )




zSpider._get_all_hot_mvsc              	   C   sB  t d|}|r|dnd}| |d pd}| |}d}|dd}|r/| }nt d|}|rF|d }||d	 d}|d
d	d}| j
 d| }	|ra| 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 ]}|dd }||vr|| || qtdt| d g }t }|D ]}|d}t|dkr|d }||vr|| || qtdt| d d|}|d| |r| |nd|d| dt| d d!|d"}d#|giS )$u'   获取歌曲详情并创建播放列表r  ry   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   )r\   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  rr   )r-   r.   rl  r   r   rk  r   rm  r=   r   r   r  _get_singer_song_playlistr#   r   r   r  r   r   r   r   rn  r@   )r"   r   r1   r   rR   r~  r  r  r   r  r  rG   Zsinger_songsr  Zexisting_urlssongZsong_urlr  r  r  r  r  r  r  r%   r%   r&   r    sj   










z%Spider._get_song_detail_with_playlistc              	   C   s4  g }dt | d}| |}d}|d D ]}|| v r&|d} nq|r| |}| |}	|	d D ]^}
t||krD |S |
dd}|sNq9|d}|rYd	|vrZq9|ra||v raq9| }| |}||vru| d
| }|	dd 
dd}| j d| }|| d| d|   q9|S )u!   获取同歌手歌曲播放列表r  r  Nr  r|   r  rz   r   r}   r   r8   r   r   r   r   r  r  )r   r   r   r   r   r   r   r   rk  r   r=   r   r   r  )r"   r~  r  r  rG   r  r   r  r{   r  r   r|   r  r   r   r%   r%   r&   r    s@   





 z Spider._get_singer_song_playlistc                 C   sd  |  |dd }|d}|d dd}d|| jd | jd dd	d
dd}d|v s1d|v r7||d< |S d}d}	d}
d|v rOtd|}|rN|d}nd|v r`td|}|r`|d}|sd|S d| }|| jv r~| j| |d< t	d|  |S t	d|  zg| j d| d}| j
j|| jdd}|jdkrt|j}|d p|d  }td!d|}| }|d"d}|r|  }	d#|v r|d#d}t|d$kr|d  }	|d  }
n|}
n|}
W n   Y | |}|r||d< || j|< t	d%|  |S | |}|r%||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\/r8   r   z*/*zidentity;q=1, *;q=0zbytes=0-)r   r   AcceptAccept-EncodingRange)parser1   headerr   zac=vplayr1   Nr   zac=musicz
id=([^&]+)ry   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.   rl  r   r   r   rg  status_codepqr   rh  rm  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  r1   resultr   r~  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r9dD ]!}z|j|}td|r2| 	|W   W S W q   Y qW dS W dS    Y 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   rg  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   zt| j  d| d}| jj|| jdd}|jdkri|j}td|}|s*td|}|rl|d}| j  d	| }| jj|| jdd}|jdkrod
D ]'}	z|j	
|	}
td|
rb| |
W   W S W qJ   Y qJW dS W dS W dS W dS    Y dS )u   源2: 从lkdown参数获取r}   r   r  r  r  zlkdown\(\'([^\']+)\'\)zlkdown\("([^"]+)"\)ry   r  r	  r  N)r   r   rg  r   r  r   r-   r.   rl  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 ]!}z|j|}td|r3| 	|W   W S W q   Y qW dS W dS    Y 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   s0  |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|v r|d d r|d d }td|r| |W S W dS W dS W dS W dS W dS W dS W dS    Y dS )u$   源4: 从网易云音乐获取歌词Nz(https://music.163.com/api/search/get/web ry   r   r  )srd   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   rg  r  jsonr-   r.   r  )r"   r~  r  r  r  r   search_respdatar  r   r  
lrc_paramsr  lrc_datar  r%   r%   r&   r    s`   

zSpider._get_lrc_from_neteasec                 C   sx  |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 d r|d d d d }|d }	d}
|	dd}| }d	|d< | j j|
||dd}|jdkr|j}td|}|rt|	d}d|v r|d r|d }ddl
}||d}td|r| |W S W dS W dS W dS W dS W dS W dS W dS W dS    Y dS )u   源5: 从QQ音乐获取歌词Nz1https://c.y.qq.com/soso/fcgi-bin/client_search_cpr  r"  ry   r  )wformatprO   r  zhttps://y.qq.com/r   r  r  r  r   r$  r  rr   songmidz9https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg)r*  r(  r   z({.*})r!  r
  r  )r   rg  r  r"  copyr   r-   r.   loadsrl  base64r   r  r  )r"   r~  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   sj  |r|sdS zd}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|v rO|d d ndd}
| j j|	|
dd}|jd	kr| }|d
 dkrd|v r|d d d r|d d d }ddl}||d}td|r| 	|W S W dS W dS W dS W dS W dS W dS W dS W dS    Y dS )u!   源6: 从酷狗音乐获取歌词Nz-http://mobilecdn.kugou.com/api/v3/search/songr"  r  ry   r  )r(  r}  r  pagesize)r  r  r  statusr$  infor   hashzhttp://krcs.kugou.com/searchyesmobir  i  )verZmanclientr3  Z
timelengthZlyricsr  r
  r  )
r   rg  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  ,  sd   

$			zSpider._get_lrc_from_kugouc                 C   s   |sdS |  }g }g d}|D ]B}| }|s|| qtd|r?d}|D ]}t||tjr6d} nq(|s>|| qtd|tjrM|| q|| qd|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/   rn  )r"   r.  linesZfiltered_linesZad_patternslineZis_adpatternr%   r%   r&   r  Z  s0   


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 ]N}|d
 }|d
 d }d|dd|dd}|d dkrJd| d}	n |d dkr_d|rW|d nd | d}	n|d dkrhd}	nd}	|| d|	 d7 }q&|S )u   生成备用歌词u   歌曲 u   未知歌曲z[ar: z]
r   z[ti: u   [by: 世纪音乐网]

r   $      r  [Z02d:z.00]   u   ♪ u    ♪ry   u   ♫ r   u    ♫r_  u   正在播放...u   暂无歌词，请欣赏音乐r  r8  rs   )
r"   r~  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r1zdd| jj|d| jd id	d
ji gW S    dddi g Y S |dkr_z| jj|d| jd id	d
}| |j}dd|di gW S    dddi g Y S d S )Nr1   r   rd   r   r  z
image/jpegr   r8   r  r  i  z
text/plainzImage Errorr  zapplication/octet-streamr
  z	LRC Error)r   rg  r   r   r  r  r   encode)r"   paramr1   ry  rr  r%   r%   r&   
localProxy  s   
(zSpider.localProxyc              	   C   s  t d|}|r|dnd}| |d pd}| |}d}|dd}|r/| }nt d|}|rF|d }||d	 d}|d
d	dpY|dd	d}|s^d}g }	| j
 d| d}
|	| d| d|
   |rPd }|d D ]#}| }|	d}|rd|v sd|v sd| v sd|v r|} nq|rP| |}d|v rd|vr| |}|d D ]}d| v sd| v r|	d}|r| |} nqtd|  | |}d}|d D ]T}|dd}|	d }r	d|vr
q||v rq| }| |}|dd d d}| j
 d| d}|	| d| d|   |d7 }|d!krG nqtd"| d# d$|	|ra| j|d%d&|d'S d|d'S )(Nr  ry   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 ar|   r  r  rK   r  video.ilingku_fl au   🎬 获取同歌手MV: r  rz   r   r8   r   r      u   🎬 找到同歌手MV: r   r  Tr   )r  r   rc  )r-   r.   rl  r   r   rk  r   rm  r=   r   r   r   r  r   r[   r   r   r   r   rn  r@   )r"   r   r1   r  rR   r~  r  r  r   	play_urlsr   Zsinger_linkr{   r   r|   r  r  Zmv_pager  rz  r   r  r   Zmv_play_urlr%   r%   r&   _get_mv_detail  s   

(
(







zSpider._get_mv_detailc              	   C   sZ  g }d}g }|d  D ] }| }d|v s d|v s d| v r,|d}|r,|| qtt|}|r|d }| |}	td|	  | 	|	}
|
d  D ]K}|d	
d}|d }saqPd
|v r| }| |}|dd dd}| j d| d}|| d| d|   |d7 }|dkr nqP|rtd| d d|S d S )Nr   rM  r  r  rK   r|   u   🎬 获取歌手MV列表: r  rz   r   r8   r   r   r   r   r   r  r  ry   r      🎬 歌手MV: 获取到     部r  )r   r   r[   r   r   rr   r   r   r   r   r   rk  r   r=   r   r  rn  )r"   r   r1   r  rz  Z
video_urlsr{   r   Z
video_link	video_urlZ	video_docr   r|   rR   r  r   r%   r%   r&   _get_singer_mvs	  sD   





zSpider._get_singer_mvsc              
   C   sJ  g }g }g }d}|d  D ]D}|dd}|d }	sqd|	v rR| }
| |
}
|	dd dd	}| j d
| }||
 d| 	d|   |d7 }q|
d}|dsa|d }g }|d  D ]}|  }| r||t| qi|rct|}td| d td|d D ]}t|dkrtd  nd|v r|drtdd| d|}n|
dd| d }n|d| d }td| d|  | |}|r| dkrtd| d qd}|d  D ]R}t|dkr nI|dd}|d }	sqd|	v rD| }
| |
}
|	dd dd	}| j d
| }||
 d| 	d|   |d7 }|d7 }qtd| d| d | |}|sbtd| d   nq|rd!}t|| d | }t|D ]D}|| }t|| t|}||| }|d }|dkr|d"t| d# n|d$| d| d%t| d# |d&| qvtd'| d(| d) | ||}|rt|d&}|d*| d+ || td,| d- |r|rd.|d.|d/S |rd"| d#d&|d/S |rd*| d+|d/S d0d1| 	d|  d/S )2Nr   r  rz   r|   r}   r8   r   r   r   r   r  r  ry   r  u   📊 歌手歌曲共有 u,    页，当前第1页，将获取剩余页面r_  r   u5   📊 已达到500首上限，停止获取更多页面r  r  r  Zindex_u   📄 获取第 u    页歌曲: rx   u   ⚠️ 第 u    页获取失败，跳过u	   📄 第 u    页获取到 r  u"    页没有下一页，停止获取d   u   🎵 歌手歌曲 · u   首u   🎵 歌手歌曲 r`  r  u#   🎵 歌手歌曲: 总共获取到 u    首，分成 u    页u   🎬 歌手MV · u   部rQ  rR  z$$$)r  r  u   暂无内容r  )r   r   r   r   rk  r   r=   r   r   r  r:  endswithrm  r  rf  r  r   rt   r   r-   rh  r   r   ro  minrn  rT  )r"   r   r1   	play_fromr   r  r  r   r{   r|   rR   r   Zplay_url_mp3base_urlZpagesr   r  r  r  r  r  rx  	page_sizerw  rt  ru  Z
page_songsZpage_numZmvsrz  r%   r%   r&   r  <	  s   








"


zSpider._get_singer_detailc           
   
   C   s   g }|d  D ]H}|dd}|sq|d}|sq|dd}| }|dd}|d}	|| || ||	rF| j|	dd	nd
ddddd q|S )Nz.singer_list liz.pic ar   r|   rz   r   r   Tr  r   rH   r  ry   r  r
  )r   r   r   r   r   r   r   r@   )
r"   r   r   r   Zpic_ar|   Zname_arR   r   r   r%   r%   r&   ri  	  s(   


zSpider._parse_singer_listc           	   	   C   s   g }|d  D ]@}|dd}|d }sqd|v rH| }| |}|dd dd	}| j d
| }|| d| 	d|   q|rRdd
|iS dd| 	d| j  iS )Nr  rz   r   r|   r}   r8   r   r   r   r   r  r  r  r  r  )r   r   r   r   rk  r   r=   r   r   r  rn  )	r"   r   r  r   r{   r|   rR   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  ry   r   r   rK  u   播放$r  )r  rc  )r-   r.   rl  r   r   r  )r"   r   r1   r   r   rI   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-   rh  rm  )r"   rR   r%   r%   r&   rk  	  s   zSpider._clean_song_namec                 C   sr   g }|d   }r|| n |d   }r0|d|  |d   }r0|d|  |r7d|S dS )Nz.singer_info .info prK  u	   歌手：za[href*="/album/"]u	   专辑：r8  u   世纪音乐网)r   r   rn  )r"   r   r1   r  descrI   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-   rh  r/   rm  r"   r   r%   r%   r&   r   
  s   zSpider._cleanc                 C   s   t dD ]o}zG| |}td|  | jj|d| jd | jd dddd	d
dd}d|_|jdkrD|j	rDtd|  t
|j	W   S td|j  W q tys } ztd|d  d| d|  td W Y d }~qd }~ww td|  t
dS )Nr   u   🌐 请求:    r   r8   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   ⚠️ 请求异常 (ry   z/3): r   u   ❌ 请求最终失败: rx   )rt   r   r   r   rg  r   r   r  r  r   r  r   r   r   )r"   r1   r]   full_urlr  r   r%   r%   r&   r   
  s8   
zSpider.getpqc                 C   sJ   |sdS | dr|S | drd| S | dr| j| S | jd | S )Nr   r9   r6   r7   r8   )r<   r   r0   r%   r%   r&   r   .
  s   



zSpider._absc                 C   s   t |ddS Nr
  )r   rG  r  r^  r%   r%   r&   r  9
  s   z
Spider.e64c                 C   s&   zt |ddW S    | Y S rb  )r   rG  r  r^  r%   r%   r&   r  <
  s   z
Spider.d64)r   )FF)r  )Nr  )Nr   )Nr_  )3__name__
__module____qualname__r'   r*   r2   r3   r5   r@   rw   r   r  ro  r  rp  rj  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ  rP  rT  r  ri  r  r[  rk  r  r   r   r   r  r  r%   r%   r%   r&   r
      sp    

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   pyqueryr   r  requestsr   r   Zurllib3.util.retryr	   pathr   base.spiderr
   r%   r%   r%   r&   <module>   s    