o
    uiU                    @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZmZmZmZmZ d dlZd dlmZ d dlZd dlmZ eejj ejd G dd deZdS )	    )SpiderN)DictListOptionalAnyTuple)datetime)defaultdictz..c                	       sZ  e Zd ZdZdZe ZdZdZ	dZ
dZddd	d
dddddZi ZdZdZdZ fddZdddZdd Zdd Zdd Zdd Zded efd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#dd9d:Z$dd;d<Z%d=d> Z&dd?d@Z'dAdB Z(ddCdDZ)dEdF Z*ddGdHZ+dIdJ Z,ddKdLZ-dMdN Z.dOdP Z/ddQdRZ0dSedTe1dUe1d e2e3 fdVdWZ4dXdY Z5ddZd[Z6dd\d]Z7dd^d_Z8dd`daZ9ddbdcZ:ddde Z;dfdg Z<ddhdiZ=djdk Z>dldm Z?dndo Z@dpdq ZAdrds ZBdte3d efdudvZCdwdx ZDddzd{ZEd|d} ZFd~d ZGdd ZHdd ZIdd ZJdd ZKdd ZL  ZMS )r   zhttps://conn.origjoy.com NZ d4eeacc6cec3434fbc8c41608a3056a0Za12d4a7c9n12Z087b6b59bae7i  d   2   g       @g      ?g333333?g      ?g?)Zmax_recommendationsdefault_limitZ
batch_sizeZsimilar_artist_weightZsame_language_weightZsame_tag_weightZhot_score_weightZrecency_weightr   i,  Fc                    s<  t    | jj  | jjdddddd d| j_d| j_d	g| _i d
g ddg ddg ddg ddg ddg ddg ddg ddg ddg ddg dd g d!d"g d#d$g d%dg d&d'g d(d)g d*g d+g d,g d-d.| _	g d/| _
d0d1d2d3d4d5d6d7d8d9d:d;| _d S )<N*/*oMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zh-CN,zh;q=0.9,en;q=0.8zgzip, deflate, br
keep-alive)Accept
User-AgentAccept-LanguageAccept-Encoding
ConnectionF)
      u   渡情u   阿)u   啊u   吖u   腌u   杜)u   肚u   度u   渡u   妒u   镀u   周)u   州u   洲u   粥u   舟   杰)   洁   结u   捷u   桀u   伦)u   轮u   纶u   仑u   沦u   陈)u   尘u   晨u   辰u   臣u   奕)u   亦u   易u   艺u   毅u   迅)u   讯u   训u   逊u   汛u   邓)u   凳u   瞪u   蹬u   镫u   紫)u   子u   梓u   姿u   孜u   棋)u   琪u   琦u   奇u   岐u   薛)u   雪u   学u   血u   谦)u   千u   迁u   签u   铅u   张)u   章u   彰u   璋u   樟)r      傑r   r   u   王)u   汪u   亡u   往u   网u   菲)u   飞u   妃u   扉u   霏)   里u   理u   礼u   鲤)u   容u   溶u   蓉u   熔)u   昊u   皓u   灏u   豪)u   李u   荣u   浩)
_-   · u   —u   ―~u   ～|u   丨u   零〇u   一壹壱弌u   二贰貳弍u   三叁參弎u	   四肆䦉u   五伍u   六陸u   七柒u   八捌u   九玖u	   十拾什)Znum_0Znum_1Znum_2Znum_3Znum_4Znum_5Znum_6Znum_7Znum_8Znum_9Znum_10)super__init__sessionheadersclearupdateverifytimeoutpopular_keywordshomophone_map
separatorsnumber_classificationself	__class__ &   /storage/emulated/0/lz/py/sy/音乐.pyr%   *   s   
	


zSpider.__init__c                 C   sX   d| _ tj| j std| j   ddiS td| j   | js(d| _td dd	iS )
u	   初始化z7/storage/emulated/0/MuseLocalServer/__common/db/muse.dbu!   ⚠️ 数据库文件不存在: error   数据库文件不存在u   ✅ 数据库加载成功: Tu>   🔄 初始化完成，分类数量将在首次访问时缓存successu   初始化完成)db_pathospathexistsprint_init_cache_loaded)r1   extendr4   r4   r5   initf   s   zSpider.initc                 C   s4   t   }|| j | jkri | _|| _td dS dS )u   检查缓存是否过期u#   🔄 缓存已过期，清理缓存TF)time_cache_timestampCACHE_DURATION_counts_cacher=   )r1   current_timer4   r4   r5   _check_cache_expiredw   s   zSpider._check_cache_expiredc                 C   s   |   rdS | j|S )u   从缓存获取数据N)rF   rD   get)r1   keyr4   r4   r5   _get_cached   s   zSpider._get_cachedc                 C   s&   || j |< | jdkrt | _dS dS )u   设置缓存数据r   N)rD   rB   rA   )r1   rH   valuer4   r4   r5   _set_cached   s   

zSpider._set_cachedc                 C      dS )Nu!   和音元视KTV - 完整筛选版r4   r0   r4   r4   r5   getName      zSpider.getNameurlreturnc                    sN   |sdS |   g d}|D ]	}| v r dS qt fdddD r%dS dS )NF).mp4.m3u8z.flvz.aviz.mkvz.movz.wmvz.mpgz.mpegz.tsz.m4vz.webmz.3gpz.mp3z.wavz.flacz.aacz.oggz.wmaz.m4aTc                 3   s    | ]}| v V  qd S Nr4   ).0keywordZ	url_lowerr4   r5   	<genexpr>   s    z'Spider.isVideoFormat.<locals>.<genexpr>)m3u8streamZliveZplaylistdownload)lowerany)r1   rO   video_formatsfmtr4   rV   r5   isVideoFormat   s   zSpider.isVideoFormatc                 C   rL   )NFr4   r0   r4   r4   r5   manualVideoCheck   rN   zSpider.manualVideoCheckc                 C   s   | j r| j   td d S )Nu   🔄 KTV资源已清理)r&   closer=   r0   r4   r4   r5   destroy   s   
zSpider.destroyc              
   C   s  t d|  z|  }|st d |  W S |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dddg}d}g }|D ]:}|d| d}|dkr~|d|  | d|dddd qY|d|  | d|dddd qYg }	tdD ]}
|d|
 d}|	d|
 |
 d|dddd q|| ||	 t dt| d || 	 dW S  t
y } zt d|  |  W  Y d}~S d}~ww )u-   首页内容 - 性能优化版（秒加载）u$   🏠 homeContent被调用，filter: u4   ⚠️ 无法获取统计信息，返回简化分类totalr   u   📊 数据库统计：总计,u	   首歌曲allu   📚 全部歌曲(u   首)2type_id	type_nameZ	type_flaghotu   🔥 热门歌曲(newu   🆕 最新歌曲(search_by_name   🔍 按歌名搜索ABCDEFGHIJKLMNOPQRSTUVWXYZletter_()   num_u   📋 返回分类数据: u	   个分类classfiltersu   ❌ homeContent异常: N)r=   _get_all_category_counts_fast_get_simple_categoriesrG   appendr[   ranger?   len_get_filters_config	Exception)r1   filter
all_countstotal_count
categoriesall_lettersZletterslettercountZnumbersnumer4   r4   r5   homeContent   sF   

,,(

zSpider.homeContentc              
   C   sv  d}|  |}|durtd |S td t }ztj| js$i W S t| j}|	 }i }|
d | d p<d|d< g d}d	d
dddddd}| D ]\}	}
z|
|
 | d pbd||	< W qQ   d||	< Y qQ| |}|| | |}|| |  t }td|| dd | || |W S  ty } ztd|  i W  Y d}~S d}~ww )u9   快速获取所有分类的数量（性能优化核心）Zall_category_countsNu   ✅ 使用缓存的分类数量u8   🔄 计算分类数量（首次加载或缓存过期）SELECT COUNT(*) FROM songsr   rc   )rj   rk   mandarin	cantoneseenglishjapanesekoreanISELECT COUNT(*) FROM songs WHERE (hot_score > 30 OR local_hot_score > 30)SSELECT COUNT(*) FROM songs WHERE (created_at IS NOT NULL OR updated_at IS NOT NULL)   SELECT COUNT(*) FROM songs WHERE (language LIKE '%国语%' OR language LIKE '%华语%' OR language LIKE '%中文%' OR language LIKE '%普通话%')9   SELECT COUNT(*) FROM songs WHERE language LIKE '%粤语%'W   SELECT COUNT(*) FROM songs WHERE (language LIKE '%英语%' OR language LIKE '%英文%')W   SELECT COUNT(*) FROM songs WHERE (language LIKE '%日语%' OR language LIKE '%日文%')W   SELECT COUNT(*) FROM songs WHERE (language LIKE '%韩语%' OR language LIKE '%韩文%')u'   ✅ 分类数量计算完成，耗时: z.2fu   秒u   ❌ 获取分类数量失败: )rI   r=   rA   r:   r;   r<   r9   sqlite3connectcursorexecutefetchoneitems_get_letter_counts_batchr)   _get_number_counts_batchra   rK   r}   )r1   	cache_keycached
start_timeconnr   r   Zmain_categoriesZcategory_queriescategoryqueryletter_countsnumber_countsend_timer   r4   r4   r5   rw      sX   







z$Spider._get_all_category_counts_fastc              
   C   s   zL|  }d}|| | }i }|D ]}|\}}|r#||d| < qd}	|	D ]}d| |vr8d|d| < q(tdtdd | D  d |W S  tyl }
 ztd	|
  d
d dD W  Y d}
~
S d}
~
ww )u0   批量获取字母分类数量（单次查询）al  
                SELECT 
                    UPPER(SUBSTR(COALESCE(NULLIF(name, ''), COALESCE(NULLIF(name_full, ''), name_trim)), 1, 1)) as first_char,
                    COUNT(*) as cnt
                FROM songs
                WHERE name IS NOT NULL AND name != ''
                GROUP BY first_char
                HAVING first_char GLOB '[A-Z]'
            ro   rn   r   u   ✅ 字母统计完成: c                 S   s   g | ]
\}}|d kr|qS )r   r4   )rT   kvr4   r4   r5   
<listcomp>F      z3Spider._get_letter_counts_batch.<locals>.<listcomp>u   个字母有歌曲u'   ⚠️ 批量获取字母统计失败: c                 S      i | ]}d | dqS )ro   r   r4   )rT   r   r4   r4   r5   
<dictcomp>L      z3Spider._get_letter_counts_batch.<locals>.<dictcomp>N)r   r   fetchallr=   r{   r   r}   )r1   r   r   r   rowsr   rowr   r   r   r   r4   r4   r5   r   '  s.   

"zSpider._get_letter_counts_batchc              
   C   s   z-|  }|d | d pd}i }tdD ]}td|d |d| < qtd |W S  tyO } ztd|  dd	 tdD W  Y d
}~S d
}~ww )u0   批量获取数字分类数量（单次查询）r   r   rr   r   rs   u   ✅ 数字统计完成u'   ⚠️ 批量获取数字统计失败: c                 S   r   )rs   r   r4   )rT   r   r4   r4   r5   r   b  r   z3Spider._get_number_counts_batch.<locals>.<dictcomp>N)r   r   r   rz   maxr=   r}   )r1   r   r   rc   r   r   r   r4   r4   r5   r   N  s   
zSpider._get_number_counts_batchc                 C   s   ddddddddddddg}d	}|D ]}| d
|  | dd qtdD ]}| d| | dd q+||  dS )u<   获取简化分类（无数量显示，用于异常情况）re   u   📚 全部歌曲rf   rg   rj   u   🔥 热门歌曲rl   rm   rn   ro   rr   rs   rt   )ry   r[   rz   r|   )r1   r   r   r   r   r4   r4   r5   rx   d  s   


 zSpider._get_simple_categoriesc                 C   sH  dddg 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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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d0d0dd1d1dd2d2dd3d3dd4d4dd5d5dd6d6dd7d7dd8d8dd9d9dd:d:dd;d;dd<d<dd=d=dd>d>dd?d?dd@d@ddAdAddBdBddCdCddDdDddEdEddFdFddGdGddHdHddIdIddJdJddKdKddLdLddMdMddNdNddOdOddPdPddQdQddRdRddSdSddTdTddUdUddVdVddWdWddXdXddYdYddZdZdd[d[dd\d\dd]d]dd^d^dd_d_dd`d`ddadaddbdbddcdcdddddddededdfdfddgdgddhdhddididdjdjddkdkddldlddmdmddndnddododdpdpddqdqddrdrddsdsddtdtddududdvdvddwdwddxdxddydyddzdzdd{d{dd|d|dd}d}dd~d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgddddddddddddgdgiS )u   获取筛选器配置re   nameu   歌手筛选u   全部歌手r
   )nr   u   阿杜u	   阿黛尔ZBeyondZBy2ZBIGBANGu	   布兰妮u   坂井泉水u	   陈奕迅u	   蔡依林u   初音未来u	   蔡健雅u	   陈小春u   草蜢u	   陈慧娴u   崔健u   仓木麻衣u   戴荃u   动力火车u	   邓丽君u   丁当u   刀郎u	   邓紫棋u	   戴佩妮u   飞儿乐队u	   费玉清u   费翔u	   方大同u   房东的猫u	   凤飞飞u   凤凰传奇u	   郭采洁u   光良u   郭静u	   郭富城u	   胡彦斌u   胡夏u   韩红u	   黄品源u	   黄小琥u   花儿乐队u	   黄家强u   后街男孩u   贾斯丁比伯u   金池u	   金志文u	   焦迈奇u   筷子兄弟u   李玟u	   林忆莲u	   李克勤u	   刘宪华u	   李圣杰u	   林宥嘉u	   梁静茹u   李健u	   林俊杰u	   李玉刚u	   林志炫u	   李荣浩u	   李宇春u	   洛天依u	   林子祥u	   李宗盛u   黎明u	   刘德华u	   罗大佑u   林肯公园ZLadyGagau   旅行团乐队u	   莫文蔚u	   毛不易u	   梅艳芳u   迈克尔杰克逊u   南拳妈妈u   朴树u   齐秦u   青鸟飞鱼u	   容祖儿u	   任贤齐u   水木年华u	   孙燕姿u	   苏打绿ZSHEu   孙楠u   陶喆u	   谭咏麟u	   田馥甄u	   谭维维u   逃跑计划u   田震u   谭晶u	   屠洪刚u   泰勒·斯威夫特u	   王力宏u   王杰u	   吴克群u	   王心凌u	   王靖雯u   汪峰u   伍佰u   王菲u	   五月天u	   汪苏泷u	   徐佳莹u   弦子u	   萧亚轩u   许巍u	   薛之谦u   许嵩u	   小虎队u	   萧敬腾u	   谢霆锋u	   徐小凤u	   信乐队u   夜愿乐队u   羽泉u	   郁可唯u	   叶倩文u   杨坤u	   庾澄庆u	   尤长靖u   易烊千玺u	   袁娅维u	   杨丞琳u	   杨千嬅u	   杨宗纬u	   郑秀文u	   周杰伦u	   张学友u	   张信哲u   张宇u	   周华健u	   张韶涵u   周深u	   纵贯线u   赵雷u	   周传雄u	   张国荣u	   周慧敏u	   张惠妹u	   周笔畅u	   郑中基u	   张艺兴u	   张震岳u	   张雨生u	   郑智化u	   卓依婷u   中岛美雪)rH   r   rJ   languageu   语言u   全部语言u   国语   粤语   英语   日语   韩语   其他sortu   排序u	   按时间rA   u	   按歌名rl   u   随机推荐randomr4   r0   r4   r4   r5   r|   z  s  	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 	  
                           zSpider._get_filters_configc              
   C   sx   t d z| jdd}| |}t dt| d d|iW S  ty; } zt d|  dg iW  Y d}~S d}~ww )	u   首页视频内容u   📹 homeVideoContent被调用   limitu   ✅ 首页获取到 u    个推荐视频listu   ❌ 获取首页视频失败: N)r=   get_hot_songsarr2vodr{   r}   )r1   songsvideosr   r4   r4   r5   homeVideoContent2  s   

zSpider.homeVideoContentc              
   C   s  t d| d| d| d|  z|rt|nd}d}i }|r0t|tr0zt|}W n   Y |rWt|tr=|| nt|trW| rWzt|}|| W n   Y |dkrb| 	||W S |
drv|dd	}	| |	|||W S |
d
r|d
d	}
| |
|||W S |r||d< | |||}| |}n| |||}| |}| |}t d| d| dt| d|  |dkr|| d | nd}|||||dW S  ty } zt d|  dg iW  Y d}~S d}~ww )u   分类内容u#   📂 categoryContent被调用: tid=, pg=z	, filter=z	, extend=   r   rl   ro   r
   rs   r   u   ✅ 分类 u    第 u    页获取到 u    个视频，总数: r   r   page	pagecountr   rc   u   ❌ 获取分类内容失败: r   N)r=   int
isinstancestrjsonloadsdictr)   stripshow_search_by_name_interface
startswithreplaceget_letter_songsget_number_songssearch_songs_with_filtersget_search_total_countget_category_songsget_category_total_countr   r{   r}   )r1   tidpgr~   r?   r   	page_sizeZfilter_dictZext_datar   r   r   r   r   total_pagesr   r4   r4   r5   categoryContentA  s^    





$zSpider.categoryContentr   r   c              
   C   s  t j| jsg dd|ddS z|d | }t| j}tj|_| }|	 }|
 }	g }
g }|
d |||	||	||	g |rI| |
|| |
rPd|
nd}d| }||| | d pdd}d| d	}|||g ||| | }|  d
d |D }| |}td| dt| d|  |dkr|| d | nd}|||||dW S  ty } ztd|  g dd|ddW  Y d}~S d}~ww )u!   获取指定字母开头的歌曲r   r   r   a  
                (UPPER(SUBSTR(name, 1, 1)) = ? OR LOWER(SUBSTR(name, 1, 1)) = ?)
                OR (UPPER(SUBSTR(name_full, 1, 1)) = ? OR LOWER(SUBSTR(name_full, 1, 1)) = ?)
                OR (UPPER(SUBSTR(name_trim, 1, 1)) = ? OR LOWER(SUBSTR(name_trim, 1, 1)) = ?)
             AND 1=1*SELECT COUNT(*) as total FROM songs WHERE <
                SELECT * FROM songs 
                WHERE `
                ORDER BY hot_score DESC, name ASC
                LIMIT ? OFFSET ?
            c                 S      g | ]}t |qS r4   r   rT   r   r4   r4   r5   r         z+Spider.get_letter_songs.<locals>.<listcomp>u   ✅ 字母     搜索到     条结果，总数: u   ❌ 获取字母歌曲失败: N)r:   r;   r<   r9   r   r   Rowrow_factoryr   upperr[   ry   r?   apply_additional_filtersjoinr   r   r   ra   r   r=   r{   r}   )r1   r   r   r   rv   offsetr   r   Zletter_upperZletter_lowerwhere_clausesparamswhere_clausecount_queryr   r   r   r   r   r   r   r4   r4   r5   r     sZ   


zSpider.get_letter_songsc              
   C   s  t j| jsg dd|ddS z|d | }t| j}tj|_| }| j	
d| d}g }	g }
g }|d |
| d |rU|D ]}|d |
| d qE|rc|	dd	| d
 |rl| |	|
| |	rsd|	nd}d| }|||
 | d pd}d| d}|
||g |||
 | }|  dd |D }| |}td| dt| d|  |dkr|| d | nd}|||||dW S  ty } ztd|  g dd|ddW  Y d}~S d}~ww )u!   获取指定数字开头的歌曲r   r   r   rs   r
   zname LIKE ?%rp    OR rq   r   r   r   r   r   c                 S   r   r4   r   r   r4   r4   r5   r     r   z+Spider.get_number_songs.<locals>.<listcomp>u   ✅ 数字 r   r   u   ❌ 获取数字歌曲失败: N)r:   r;   r<   r9   r   r   r   r   r   r/   rG   ry   r   r   r   r   r?   r   ra   r   r=   r{   r}   )r1   r   r   r   rv   r   r   r   Zchinese_numsr   r   Znum_conditionscharr   r   r   r   r   r   r   r   r   r4   r4   r5   r     s^   



zSpider.get_number_songsc                 C   sV   | dd}|r'| r)|dkr|d dS |d |d| d dS dS dS )u   应用额外的筛选条件r   r
   r      (language IS NULL OR language = '' OR (language NOT LIKE '%国语%' AND language NOT LIKE '%粤语%' AND language NOT LIKE '%英语%' AND language NOT LIKE '%日语%' AND language NOT LIKE '%韩语%'))language LIKE ?r   N)rG   r   ry   )r1   r   r   rv   language_filterr4   r4   r5   r     s   
zSpider.apply_additional_filtersc                 C   s~  zd}|d | }| j dd}|s"ddddd	dd
gdddddW S ||||  }g }|D ]^}| |}	| j|dd}
|
ru|
d }d| d|d  }| j|dd}| ||}||d| |	 ddd| d|	 ddd|d q.|d| dd| ddd| ddd
 q.t|}|| d | }|||||dW S  ty } ztd|  dg iW  Y d}~S d}~ww )u   显示按歌名搜索界面r   r   r   r   Z
no_keywordu   🔍 请输入搜索关键词u   提示Nu0   在搜索框中输入歌名关键词进行搜索)vod_idvod_namevod_remarksvod_picvod_contentvod_tagr   r   search_keyword:z|id:r   u   🔍    首u   点击查看所有包含'u   '的歌曲（共u   首）u   热门关键词   关键词搜索)r   r   r   r   r   r   vod_play_fromvod_play_urlz|id:no_songu   0首u   关键词：u   ，未找到相关歌曲u   ❌ 显示搜索界面失败: r   )get_popular_keywords_from_dbget_keyword_song_countsearch_songs_by_keywordbuild_keyword_play_urlry   r{   r}   r=   )r1   r   rv   r   	start_idxr,   Zcurrent_keywordsr   rU   
song_countZsample_songsZsample_songr   Z	all_songsplay_urlr   r   r   r4   r4   r5   r   &  st   




	z$Spider.show_search_by_name_interfacec                 C   s(  |sdS g }| d| dt| d|d d   t|dD ]A\}}| d|d	  }|d
r:|d|d
  7 }|drT|d }|dkrL|d7 }n|dkrT|d7 }| | d|d   qt|dkrtdt|dD ]}|t|k r||d|d d  d| d|d d   qod|S )u$   构建关键词搜索结果播放URLr
      🔍 搜索关键词：u   （共u   首）$r   r   r   . r   singer - 	hot_scoreP   	    🔥🔥r       🔥$r      ━━━ 第u   批 (   首) ━━━$#)ry   r{   	enumeraterG   rz   insertr   )r1   rU   r   play_url_partsisong	song_namer  r4   r4   r5   r  v  s*   (


.
zSpider.build_keyword_play_urlc              
   C   s0  t j| js| jd| S zit| j}| }d}|||d f |	 }g }|D ],}|d rXt
|d }|dddd}td|}	|	D ]}
t|
d	krW||
 qJq,|  dd
lm} ||}dd ||D }|d| W S  ty } ztd|  | jd| W  Y d}~S d}~ww )u!   从数据库获取热门关键词Nz
                SELECT name FROM songs 
                WHERE name IS NOT NULL AND name != '' 
                LIMIT ?
               r   z(HD)r
   u   (授权版)u   [()（）\-—\s]   )Counterc                 S   s   g | ]\}}|qS r4   r4   )rT   kwr   r4   r4   r5   r     r   z7Spider.get_popular_keywords_from_db.<locals>.<listcomp>u$   ⚠️ 获取热门关键词失败: )r:   r;   r<   r9   r,   r   r   r   r   r   r   r   resplitr{   ry   ra   collectionsr  most_commonr}   r=   )r1   r   r   r   r   resultskeywordsr   r   partspartr  Zkeyword_counterr,   r   r4   r4   r5   r    s8   
z#Spider.get_popular_keywords_from_dbc              
   C   s   t j| js	dS z3t| j}| }d}||d| dd| dd| df | }|	  |r:|d W S dW S  t
yV } ztd|  W Y d}~dS d}~ww )u$   获取包含关键词的歌曲数量r   z
                SELECT COUNT(*) as song_count 
                FROM songs 
                WHERE name LIKE ? 
                   OR name_full LIKE ? 
                   OR name_trim LIKE ?
            r   u*   ⚠️ 获取关键词歌曲数量失败: Nr:   r;   r<   r9   r   r   r   r   r   ra   r}   r=   )r1   rU   r   r   r   resultr   r4   r4   r5   r    s   *zSpider.get_keyword_song_countc           	   
   C   s   t j| js	g S z0t| j}tj|_| }d| d}d}|	|||||f |
 }|  dd |D W S  tyT } ztd|  g W  Y d}~S d}~ww )u   根据关键词搜索歌曲r   z
                SELECT * FROM songs 
                WHERE name LIKE ? 
                   OR name_full LIKE ? 
                   OR name_trim LIKE ?
                ORDER BY hot_score DESC, created_at DESC 
                LIMIT ?
            c                 S   r   r4   r   r   r4   r4   r5   r     r   z2Spider.search_songs_by_keyword.<locals>.<listcomp>u   ❌ 关键词搜索失败: Nr:   r;   r<   r9   r   r   r   r   r   r   r   ra   r}   r=   )	r1   rU   r   r   r   search_termr   r   r   r4   r4   r5   r    s"   	zSpider.search_songs_by_keywordc                 C   s4  |g}|D ]}|| j v r#| j | D ]}|||}||vr"|| qq| jD ]$}||v rK||d}||vr<|| ||d}||vrK|| q'dddddd}	|	 D ]\}
}|
|v ro||
|}||vro|| qX|d	| d	 || d	 |d	|  td
| d|dd  d |S )u<   处理模糊搜索关键词，返回所有可能的搜索词r
   r!   r   u   臺u   髮u   後u   裡)r   u   台u   发u   后r   r   u"   🔍 模糊搜索关键词处理: z -> Nr   ...)r-   r   ry   r.   r   r=   )r1   rU   search_termsr   Z	homophoneZnew_termsepZno_sepZ	space_sepZsimple_to_traditionalsimpleZtraditionalZ	trad_termr4   r4   r5   process_fuzzy_search  sD   





zSpider.process_fuzzy_searchc              
   C   s"  |si }t j| jsg S td| d|  z|d | }t| j}tj|_|	 }g }g }|
dd}	|	rx|	 rx| |	}
g }|
dd D ] }|d |d	| d	d	| d	d	| d	d	| d	g qI|rx|d
d| d |
dd}|r| r|dkr|d n|d |d	| d	 |
dd}|r| r| ||| |rd|nd}|
dd}| |}d| d| d}|||g ||| | }|  dd |D }tdt| d |W S  ty } ztd|  g W  Y d}~S d}~ww )u   根据筛选条件搜索歌曲u(   🔍 执行筛选搜索，筛选条件: 
   , 页码: r   r   r
   Nr   F(name LIKE ? OR name_full LIKE ? OR name_trim LIKE ? OR singer LIKE ?)r   rp   r   rq   r   r   r   r   r   r   r   r   rj   r   z
                ORDER BY z.
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r   e  r   z4Spider.search_songs_with_filters.<locals>.<listcomp>   ✅ 搜索到 u
    条结果u   ❌ 搜索歌曲失败: )r:   r;   r<   r9   r=   r   r   r   r   r   rG   r   r1  ry   r?   r   apply_category_filterget_order_by_clauser   r   ra   r{   r}   )r1   r   r   rv   r   r   r   r   r   name_filterr.  
conditionstermr   category_filterr   sort_filterZorder_byr   r   r%  r   r4   r4   r5   r   "  sd   

4

z Spider.search_songs_with_filtersc                 C   s   |dkr| d dS |dkr| d dS |dkr!| d dS |dkr,| d dS |d	kr7| d
 dS |dkrB| d dS |dkrM| d dS dS )u   应用分类筛选rj   z((hot_score > 30 OR local_hot_score > 30)rk   z2(created_at IS NOT NULL OR updated_at IS NOT NULL)r   uq   (language LIKE '%国语%' OR language LIKE '%华语%' OR language LIKE '%中文%' OR language LIKE '%普通话%')r   u   language LIKE '%粤语%'r   u6   (language LIKE '%英语%' OR language LIKE '%英文%')r   u6   (language LIKE '%日语%' OR language LIKE '%日文%')r   u6   (language LIKE '%韩语%' OR language LIKE '%韩文%')N)ry   )r1   r   r   r:  r4   r4   r5   r5  n  s   zSpider.apply_category_filterc                 C   s   ddddd}| |dS )u   获取排序子句z3hot_score DESC, local_hot_score DESC, click_at DESCz2created_at DESC, updated_at DESC, update_time DESCzname ASC, name_full ASCzRANDOM())rj   rA   rl   r   z$hot_score DESC, local_hot_score DESCrG   )r1   r;  Zorder_by_rulesr4   r4   r5   r6    s   zSpider.get_order_by_clausec              
   C   s  |si }t j| jsdS zt| j}| }g }g }|dd}|rd| rd| 	|}g }|dd D ] }	|
d |d|	 dd|	 dd|	 dd|	 dg q5|rd|
dd	| d
 |dd}
|
r|
 r|
dkrz|
d n|
d |
d|
 d |dd}|r| r| ||| |rd|nd}d| }||| | }|  |r|d }|W S d}|W S  ty } ztd|  W Y d}~dS d}~ww )u   获取搜索结果总数r   r   r
   Nr   r3  r   rp   r   rq   r   r   r   r   r   r   r   r   u   ❌ 获取搜索总数失败: )r:   r;   r<   r9   r   r   r   rG   r   r1  ry   r?   r   r5  r   r   ra   r}   r=   )r1   rv   r   r   r   r   r7  r.  r8  r9  r   r:  r   r   r*  rc   r   r4   r4   r5   r     sR   

4

zSpider.get_search_total_countr   r   r   c                 C   s   t d| d|  |dkr| j||dS |dkr | j||dS |dkr+| j||dS |dkr7| jd||dS |d	krC| jd
||dS |dkrO| jd||dS |dkr[| jd||dS |dkrf| j||dS g S )u   获取分类歌曲u   📁 获取分类歌曲: r2  rj   )r   r   rk   r   r   r   r   r   r   r   r   r   re   )r=   r   get_new_songsget_mandarin_songsget_language_songsget_all_songs)r1   r   r   r   r4   r4   r5   r     s$   zSpider.get_category_songsc              
   C   s   t j| js	dS z[t| j}| }|dkrd}n3|dkr"d}n,|dkr)d}n%|dkr0d	}n|d
kr7d}n|dkr>d}n|dkrEd}n	|dkrLd}nd}|| | }|	  |rb|d W S dW S  t
y~ } ztd|  W Y d}~dS d}~ww )u   获取分类总数r   rj   r   rk   r   r   r   r   r   r   r   r   r   r   r   re   r   u   ❌ 获取分类总数失败: Nr)  )r1   r   r   r   r   r*  r   r4   r4   r5   r     s>   
zSpider.get_category_total_countc              
   C   s   t j| js	g S z(|d | }t| j}tj|_| }d}|	|||f dd |
 D W S  tyL } ztd|  g W  Y d}~S d}~ww )u   获取国语歌曲r   u  
                SELECT * FROM songs 
                WHERE (language LIKE '%国语%' OR language LIKE '%华语%' OR language LIKE '%中文%' OR language LIKE '%普通话%')
                ORDER BY hot_score DESC, created_at DESC 
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r     r   z-Spider.get_mandarin_songs.<locals>.<listcomp>u   ❌ 获取国语歌曲失败: Nr:   r;   r<   r9   r   r   r   r   r   r   r   r}   r=   )r1   r   r   r   r   r   r   r   r4   r4   r5   r>    s   zSpider.get_mandarin_songsc           	   
   C      |r|}t j| jsg S z(|d | }t| j}tj|_| }d}|	|||f dd |
 D W S  tyP } ztd|  g W  Y d}~S d}~ww )u   获取热门歌曲r   z
                SELECT * FROM songs 
                WHERE (hot_score > 30 OR local_hot_score > 30) 
                ORDER BY hot_score DESC, local_hot_score DESC, click_at DESC
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r   &  r   z(Spider.get_hot_songs.<locals>.<listcomp>u   ❌ 获取热门歌曲失败: NrA  	r1   r   r   r   r   r   r   r   r   r4   r4   r5   r     s"   zSpider.get_hot_songsc           	   
   C   rB  )u   获取最新歌曲r   z
                SELECT * FROM songs 
                ORDER BY created_at DESC, updated_at DESC 
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r   ?  r   z(Spider.get_new_songs.<locals>.<listcomp>u   ❌ 获取新歌曲失败: NrA  rC  r4   r4   r5   r=  +  s"   zSpider.get_new_songsc              
   C   s   |r|}t j| jsg S zO|d | }t| j}tj|_| }dgddgddgddgd	}|	||g}	d

dd |	D }
d|
 d}|	||g }||| dd | D W S  tyz } ztd| d|  g W  Y d}~S d}~ww )u   获取指定语言的歌曲r   r   r   u   英文r   u   日文r   u   韩文)r   r   r   r   rd   c                 S   s   g | ]}d qS )?r4   )rT   r   r4   r4   r5   r   [  s    z-Spider.get_language_songs.<locals>.<listcomp>zI
                SELECT * FROM songs 
                WHERE language IN (zj) 
                ORDER BY hot_score DESC, created_at DESC 
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r   e  r   u
   ❌ 获取u   歌曲失败: N)r:   r;   r<   r9   r   r   r   r   r   rG   r   r   r   r}   r=   )r1   r   r   r   r   r   r   r   Zlanguage_map	languagesZplaceholdersr   r   r   r4   r4   r5   r?  D  s6   zSpider.get_language_songsc           
   
   C   s   |r|}t j| jsg S z.|d | }t| j}tj|_| }d}|	|||f dd |
 D }|  |W S  tyV }	 ztd|	  g W  Y d}	~	S d}	~	ww )u   获取所有歌曲r   z
                SELECT * FROM songs 
                ORDER BY hot_score DESC, created_at DESC 
                LIMIT ? OFFSET ?
            c                 S   r   r4   r   r   r4   r4   r5   r   ~  r   z(Spider.get_all_songs.<locals>.<listcomp>u   ❌ 获取所有歌曲失败: Nr+  )
r1   r   r   r   r   r   r   r   r   r   r4   r4   r5   r@  j  s&   zSpider.get_all_songsc                 C   sh  zt d|  |r|d sdg iW S |d }|dru|d}|d dd}| j|dd}|s8dg iW S |d }| ||}|d	 d
| dt| dd|d| ||d|ddddddd}t dt| d d|giW S |}	| 	|	}
t
|
trd|
v sd|
v rt d|
  dg iW S i }t|dkrz|d rt|d ni }W n   Y |d| jd }| j|	|
|d}| |
}|
d	 |
d |ddd| |
t|d|
dr|
ddnd|
d d!|
d"d#|
d"d#|
d d!d}| |
|}||d$< t d%t| d& d|giW S  ty3 } zt d'|  dg iW  Y d}~S d}~ww )(u   详情内容u!   📄 detailContent被调用: ids=r   r   r   r#   r
      r   r   u   🔍 搜索：u   共r   u   关键词搜索结果Nr  yearu   搜索结果u	   多语言u	   多歌手)r   r   r   r  r  r   r   r   vod_yearvod_directorvod_areaZvod_lang	vod_actoru"   ✅ 关键词搜索结果详情，
    首歌曲r6   messageu   ❌ 查询歌曲失败: r   recommend_limitr   r   u	   KTV直连u
   音乐,KTVr  u   未知歌手r   u   未知语言r  u    ✅ 详情页构建完成，有     首推荐歌曲u   ❌ 获取详情失败: )r=   r   r"  r   r  r  r{   build_keyword_vod_contentrG   
query_songr   r   r   r   RECOMMENDATION_CONFIGget_unlimited_recommendationsbuild_song_remarksbuild_unlimited_vod_contentbuild_unlimited_play_urlr}   )r1   idsZ
current_idr'  rU   Zkeyword_songsZ
first_songr
  videocurrent_tidresr   rN  recommend_songsremarksr   r4   r4   r5   detailContent  s   












zSpider.detailContentc                 C   s  g }| d|  | dt| d | d tt}tt}tt}|D ]/}|dr9||d   d7  < |drH||d   d7  < |drW||d   d7  < q(|rt| d	d
 dddd }| d |D ]\}	}
| d|	 d|
 d qp|rt| dd
 dddd }| d |D ]\}}
| d| d|
 d qt|dd
 dddd }| d t|dD ]!\}}|d }|dr|d|d  7 }| d| d|  q| d | d d|S )u!   构建关键词搜索详情内容r  u   📊 搜索结果：共找到 rL  r
   r   r   r  rG  c                 S      | d S Nr   r4   xr4   r4   r5   <lambda>      z2Spider.build_keyword_vod_content.<locals>.<lambda>T)rH   reverseNr  u   🌐 语言分布：z  - z: r   c                 S   r^  r_  r4   r`  r4   r4   r5   rb    rc  u   🎤 歌手分布：c                 S   s   |  ddS )Nr  r   r<  r`  r4   r4   r5   rb    s    u   🔥 热门歌曲：r   r  z  r  u8   💡 提示：点击选集可以直接播放相关歌曲
)	ry   r{   r	   r   rG   sortedr   r  r   )r1   rU   r   content_partsZlanguage_countZsinger_countZ
year_countr  Ztop_languageslangr   Ztop_singersr  	hot_songsr  r  r4   r4   r5   rP    sF   










z Spider.build_keyword_vod_contentc              
   C   s  t j| js	g S td| d zKt| j}tj|_g }t	|g}|
drp|d }|rptd|  | }d}	||	d| d|t|df | }
dd	 |
D }td
t| d || |dd	 |D  | |}|rt||k rtd|dd   |dd D ]7}t||kr n.| }d}	||	d| d|df | }
dd	 |
D }|| |dd	 |D  qt||k r|t| }td| d | }d}	||	||f | }
dd	 |
D }|| t||k r+|t| }td| d | }d}	||	||f | }
dd	 |
D }|| |  t	 }g }|D ]}|d }||vrK|| || q6tdt| d |d| W S  tyy } ztd|  g W  Y d}~S d}~ww )u   获取无限推荐歌曲u(   🎯 开始获取无限推荐，目标: rL  r   u   🌐 获取同语言歌曲: z
                        SELECT * FROM songs 
                        WHERE language LIKE ? AND tid != ?
                        ORDER BY hot_score DESC 
                        LIMIT ?
                    r   r   c                 S   r   r4   r   r   r4   r4   r5   r   /  r   z8Spider.get_unlimited_recommendations.<locals>.<listcomp>u   ✅ 找到 u    首同语言歌曲c                 S      g | ]}|d  qS r   r4   rT   sr4   r4   r5   r   3  r   u(   🏷️ 查找同标签歌曲，标签: Nr  z
                        SELECT * FROM songs 
                        WHERE tags_str LIKE ? AND tid != ?
                        ORDER BY hot_score DESC 
                        LIMIT ?
                    r   c                 S   r   r4   r   r   r4   r4   r5   r   H  r   c                 S   rj  rk  r4   rl  r4   r4   r5   r   J  r   u"   🔥 补充热门歌曲，需要:     首z
                    SELECT * FROM songs 
                    WHERE tid != ? AND hot_score > 20
                    ORDER BY hot_score DESC 
                    LIMIT ?
                c                 S   r   r4   r   r   r4   r4   r5   r   [  r   u   🎲 随机补充，需要: z
                    SELECT * FROM songs 
                    WHERE tid != ? 
                    ORDER BY RANDOM() 
                    LIMIT ?
                c                 S   r   r4   r   r   r4   r4   r5   r   m  r   r   u$   🎉 推荐系统完成，共找到 rO  u   ❌ 无限推荐失败: )r:   r;   r<   r9   r=   r   r   r   r   setrG   r   r   minr   r{   r?   r)   extract_song_tagsra   addry   r}   )r1   rY  current_songr   r   Zall_recommendationsseen_idsr   r   r   r   Z
lang_songstagstagZ	tag_songsneededri  Zrandom_songsseenZunique_recommendationsr  r   r   r4   r4   r5   rS    s   

 







z$Spider.get_unlimited_recommendationsc              	   C   s   g }d|v r_|d r_zt |d }t|tr|| W |S W |S    d|d v r=|dd |d dD  Y |S d|d v rU|dd |d dD  Y |S ||d  Y |S |S )u   从歌曲数据中提取标签tags_strrd   c                 S      g | ]
}|  r|  qS r4   r   rT   tr4   r4   r5   r     r   z,Spider.extract_song_tags.<locals>.<listcomp>r!   c                 S   rz  r4   r{  r|  r4   r4   r5   r     r   )r   r   r   r   r?   r"  ry   )r1   	song_dataru  Zparsed_tagsr4   r4   r5   rq    s$   
	
  zSpider.extract_song_tagsc           	      C   sJ  g }d|d  }| dr|d|d  7 }|| d|d   t|dD ]A\}}| d|d  }| drC|d|d  7 }| d	r]|d	 }|d
krU|d7 }n|dkr]|d7 }|| d|d   q(t|dkrtdt|dD ]}|t|k r||d|d d  d| d|d   qxtdt| d d|S )u   构建无限推荐播放URLu
   ▶▶▶ r   r  r  r  r   r   r  r  r  r  r   r  r  u   批推荐 (r  u   📊 播放URL包含 u
    个条目r  )rG   ry   r  r{   rz   r  r=   r   )	r1   rs  r[  r  Zcurrent_song_namer  Zrecr  r  r4   r4   r5   rV    s.   



*
zSpider.build_unlimited_play_urlc                 C   sB  g }| dr|d|d   | dr4|d|d   | |d }|dkr4|d| d | drC|d	|d   |d
| d |d | |}|rg|dd|dd   | drv|d|d   | dr|d|d   |  }|d|dd |d| d d|S )u   构建无限推荐详情内容r   u   🎵 歌曲名称: r  u   🎤 歌手: r   u   📊 该歌手共有 rL  r   u   🌐 语言: u   ✨ 为您推荐了 u    首相关歌曲uG   📈 推荐系统：同语言 > 同标签 > 热门歌曲 > 随机歌曲u   🏷️ 标签: z, Nr   r  u   🔥 热度: update_timeu   🕐 更新时间: u   💾 数据库歌曲总数: rd   rn  u   📊 本次推荐使用了 re  )rG   ry   get_singer_song_countrq  r   get_total_song_count)r1   r~  Zrecommend_countrg  r	  ru  Ztotal_songsr4   r4   r5   rU    s.   







z"Spider.build_unlimited_vod_contentc              
   C   s   t j| js	dS z)t| j}| }d}||d| df | }|	  |r0|d W S dW S  t
yL } ztd|  W Y d}~dS d}~ww )u   获取歌手的歌曲数量r   z.SELECT COUNT(*) FROM songs WHERE singer LIKE ?r   u'   ⚠️ 获取歌手歌曲数量失败: Nr)  )r1   r  r   r   r   r*  r   r4   r4   r5   r    s   zSpider.get_singer_song_countc              
   C   s   t j| js	dS z#t| j}| }d}|| | }|	  |r*|d W S dW S  t
yF } ztd|  W Y d}~dS d}~ww )u!   获取数据库中的歌曲总数r   z#SELECT COUNT(*) as total FROM songsu!   ⚠️ 获取歌曲总数失败: Nr)  )r1   r   r   r   r*  r   r4   r4   r5   r    s   
zSpider.get_total_song_countr~  c                 C   s   g }| dr|d|d   | dr4zt|d }t|tr.|r.||dd  W n   Y | drC|d|d   | drV|d d	d
 }|| |r]d|S dS )u   构建歌曲备注r      🌐 ry  Nr  r     🔥r  r!   r    | 	   KTV歌曲)	rG   ry   r   r   r   r   r?   r"  r   )r1   r~  r'  ru  Z	date_partr4   r4   r5   rT    s"   




zSpider.build_song_remarksc              
   C   s   t j| jsddiS z+t| j}tj|_| }d}|	||f |
 }|r.t|W S dd| diW S  tjyR } zddt| iW  Y d}~S d}~w tyl } zdd	t| iW  Y d}~S d}~ww )
u   查询歌曲r6   r7   z!SELECT * FROM songs WHERE tid = ?rM  u   未找到 tid 为 u
    的歌曲u   数据库错误: Nu   查询失败: )r:   r;   r<   r9   r   r   r   r   r   r   r   r   Errorr   r}   )r1   Z
target_tidr   r   r   r   r   r4   r4   r5   rQ    s&   
zSpider.query_song1c              
   C   s  zt d| d| d|  |r| r| |  t|}d}|d | }tj| js7t d dg iW S d| d}t	| j}tj
|_| }	d	}
|||||f}|	|
| |	 }d
}|	||||f |	 }|rs|d nd}|  | dd |D }t dt| d| d |dkr|| d | nd}|||||dW S  ty } zt d|  dg iW  Y d}~S d}~ww )u   搜索内容u   🔍 搜索内容: key=z, quick=r   r   r   u   ❌ 数据库文件不存在r   r   z
                SELECT * FROM songs 
                WHERE name LIKE ? 
                   OR name_full LIKE ?
                   OR name_trim LIKE ?
                ORDER BY hot_score DESC
                LIMIT ? OFFSET ?
            z
                SELECT COUNT(*) as total FROM songs 
                WHERE name LIKE ? 
                   OR name_full LIKE ?
                   OR name_trim LIKE ?
            rc   r   c                 S   r   r4   r   r   r4   r4   r5   r   h  r   z(Spider.searchContent.<locals>.<listcomp>r4  u    个结果，总共 u    个r   u   ❌ 搜索失败: N)r=   r   save_search_historyr   r:   r;   r<   r9   r   r   r   r   r   r   r   r   ra   r   r{   r}   )r1   rH   quickr   r   r   r   r,  r   r   r   r   r   r   Ztotal_resultrc   r   r   r   r4   r4   r5   searchContent7  sJ   
	zSpider.searchContentc              
   C   s  zhd}g }t j|r+t|ddd}dd | D }W d   n1 s&w   Y  ||v r4|| |d| |dd	 }t|d
dd}|D ]
}|| d qJW d   W dS 1 saw   Y  W dS  ty } zt	d|  W Y d}~dS d}~ww )u   保存搜索历史z4/storage/emulated/0/fenmei/php/db/search_history.txtrutf-8)encodingc                 S   rz  r4   r{  )rT   liner4   r4   r5   r     r   z.Spider.save_search_history.<locals>.<listcomp>Nr   r   wre  u!   ⚠️ 保存搜索历史失败: )
r:   r;   r<   open	readlinesremover  writer}   r=   )r1   rU   Zhistory_filehistoryfitemr   r4   r4   r5   r  z  s(   
&zSpider.save_search_historyc                 C   sB  zt d| d|  |drdd|d| jdddW S | js3|  | _| js3t d	 ddd
dW S | |}|sEt d ddd
dW S t d|dd  d dd|d| j| jddddddd	d}d| v rsd|d d< |W S d| v rd|d d< |W S  ty } zt d|  ddd
dW  Y d}~S d}~ww )u   播放内容u   ▶ 播放请求: flag=z, vid=)zhttp://zhttps://r   zMozilla/5.0r   )r   Refererr   )jxparserO   headeru   ❌ 获取token失败r
   )r  r  rO   u   ❌ 获取播放URL失败u   ✅ 获取到播放URL: Nr   r-  r   identityr   r   zbytes=0-r  )	r   r  Originr   r   r   r   RangeDNTrQ   z	video/mp4r  zContent-TyperR   zapplication/vnd.apple.mpegurlu   ❌ 播放器异常: )r=   r   hosttokenget_auth_tokenget_play_urlr[   r}   )r1   flagvidvipFlagsr
  r*  r   r4   r4   r5   playerContent  s\   


zSpider.playerContentc              
   C   s   zDt tt }| | j| j d| j | j|dddd}| jj| j	 d|dd
 }|d	d
kr;|dW S td|  W dS  ty^ } ztd|  W Y d}~dS d}~ww )u   获取认证令牌r   z2.0z4.1.3.03281430)appidmacsnrA   vervnZ 024210cba40d4385a93e6c2d3249bfb5z
/auth/initr   r   r+   coderF  r  u   ❌ 获取token失败: Nu   ❌ 初始化token失败: )r   r   rA   thunder_signapp_idr  r  r&   rG   r  r   r=   r}   )r1   	timestampr   responser   r4   r4   r5   r    s8   	
zSpider.get_auth_tokenc                 C   s   zIt tt }| | j| j d| j dd|d| j|| jd	d}| jj	| j
 d|dd	 }|	d
dkr@|	ddW S td|  W dS  tyc } ztd|  W Y d}~dS d}~ww )u   获取播放URLr   0r  Z720)	r  deviceZish265Zlsmusicno
resolutionr  rA   r  Z 19042303a8374f67ae3fe1e25c97936fz/music/downurlr   r  r  rF  datar
   u   ❌ 获取播放URL失败: u   ❌ 获取播放URL异常: N)r   r   rA   r  r  r  r  r  r&   rG   r  r   r=   r}   )r1   r  r  r   r  r   r4   r4   r5   r    s>   

zSpider.get_play_urlc                 C   s  g }|D ]}zd}d|v r-|d r-zt |d }t|tr'd|dd }W n   Y g }|dr>|d|d   |rE|| |drT|d	|d   |r[d
|nd}g }|drn|d|d   |dr}|d|d   |dr|d|d   |rd
|nd}	||d |d |d|	d W q ty }
 ztd|
  W Y d}
~
qd}
~
ww |S )u   数组转视频列表r
   ry  rd   N   r   u   🌐r  r  r  r  r   u   🎵 r  rG  u   📅 r   )r   r   r   r   r   u   ⚠️ 转换视频项失败: )	r   r   r   r   r   rG   ry   r}   r=   )r1   Zarrr   r  ry  ru  Zremarks_partsr\  rg  contentr   r4   r4   r5   r     sR   






zSpider.arr2vodc           	      C   sd   t | }g }|D ]}|| d||   q
d|}|| }t|d }||d< |S )u   生成签名=&r  sign)rf  keysry   r   hashlibmd5encode	hexdigest)	r1   r   Zsdk_keyZsorted_keysZquery_partsrH   Zbase_stringZsign_materialr  r4   r4   r5   r  5  s   
zSpider.thunder_signc                 C   rL   )u   本地代理Nr4   )r1   paramr4   r4   r5   
localProxyA  s   zSpider.localProxy)r
   )r   r   N)r   N)r   )r   rS   )r   r   )r   )r  )N__name__
__module____qualname__r  r9   requestsSessionr&   r  r  r  r  rR  rD   rB   rC   r>   r%   r@   rF   rI   rK   rM   r   boolr_   r`   rb   r   rw   r   r   rx   r|   r   r   r   r   r   r   r  r  r  r  r1  r   r5  r6  r   r   r   r   r   r   r>  r   r=  r?  r@  r]  rP  rS  rq  rV  rU  r  r  rT  rQ  r  r  r  r  r  r   r  r  __classcell__r4   r4   r2   r5   r      s    
<
7C' 9
B
JN
P
'

.L

5
%



&]
/q#'
C:/r   )base.spiderr   r:   sysrA   r   r  urllib3r   r  typingr   r   r   r   r   r   r   r!  r#  r	   disable_warnings
exceptionsInsecureRequestWarningr;   ry   r4   r4   r4   r5   <module>   s   @