U
    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                	       sP  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eedd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#dd8d9Z$dd:d;Z%d<d= Z&dd>d?Z'd@dA Z(ddBdCZ)dDdE Z*ddFdGZ+dHdI Z,ddJdKZ-dLdM Z.dNdO Z/ddPdQZ0ee1e1e2e3 dRdSdTZ4dUdV Z5ddWdXZ6ddYdZZ7dd[d\Z8dd]d^Z9dd_d`Z:dadb Z;dcdd Z<ddedfZ=dgdh Z>didj Z?dkdl Z@dmdn ZAdodp ZBe3edqdrdsZCdtdu ZDddwdxZEdydz ZFd{d| ZGd}d~ ZHdd 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                    sR  t    | jj  | jjdddddd d| j_d| j_d	g| _d
ddgdddddgddddgddddgddddgddd d!gd"d#d$d%gd&d'd(d)gd*d+d,d-gd.d/d0d1gd2d3d4d5gd6d7d8gd9d:d;d<gd=d>d?d@gdAdBddgdCdDdEdFgdGdHdIdJgdKdLdMdNgdOdPdQdRgdSdTdUdVgdW| _	dXdYdZd[d\d]d^d_d`dag
| _
dbdcdddedfdgdhdidjdkdldm| _d S )nN*/*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   鲤u   容u   溶u   蓉u   熔u   昊u   皓u   灏u   豪)u   阿u   杜u   周r   u   伦u   陈u   奕u   迅u   邓u   紫u   棋u   薛u   谦u   张r   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sPd| _td dd	iS )
u	   初始化z7/storage/emulated/0/MuseLocalServer/__common/db/muse.dbu!   ⚠️ 数据库文件不存在: error   数据库文件不存在u   ✅ 数据库加载成功: Tu>   🔄 初始化完成，分类数量将在首次访问时缓存Zsuccessu   初始化完成)db_pathospathexistsprint_init_cache_loaded)r/   extendr2   r2   r3   initf   s    zSpider.initc                 C   s4   t   }|| j | jkr0i | _|| _td dS dS )u   检查缓存是否过期u#   🔄 缓存已过期，清理缓存TF)time_cache_timestampCACHE_DURATION_counts_cacher:   )r/   Zcurrent_timer2   r2   r3   _check_cache_expiredw   s    zSpider._check_cache_expiredc                 C   s   |   rdS | j|S )u   从缓存获取数据N)rB   rA   get)r/   keyr2   r2   r3   _get_cached   s    zSpider._get_cachedc                 C   s"   || j |< | jdkrt | _dS )u   设置缓存数据r   N)rA   r?   r>   )r/   rD   valuer2   r2   r3   _set_cached   s    

zSpider._set_cachedc                 C   s   dS )Nu!   和音元视KTV - 完整筛选版r2   r.   r2   r2   r3   getName   s    zSpider.getName)urlreturnc                    sr   |sdS |   dddddddd	d
dddddddddddg}|D ]}| kr@ dS q@t fdddD rnd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   | ]}| kV  qd S )Nr2   ).0keywordZ	url_lowerr2   r3   	<genexpr>   s     z'Spider.isVideoFormat.<locals>.<genexpr>)Zm3u8streamZliveZplaylistdownload)lowerany)r/   rI   Zvideo_formatsfmtr2   rO   r3   isVideoFormat   s<                    zSpider.isVideoFormatc                 C   s   dS )NFr2   r.   r2   r2   r3   manualVideoCheck   s    zSpider.manualVideoCheckc                 C   s   | j r| j   td d S )Nu   🔄 KTV资源已清理)r$   closer:   r.   r2   r2   r3   destroy   s    
zSpider.destroyc              
   C   s  t d|  z|  }|s0t 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 ]t}|d| d}|dkr|d|  | d|dddd q|d|  | d|dddd qg }	tdD ]>}
|d|
 d}|	d|
 |
 d|dddd q6|| ||	 t dt| d || 	 dW S  t
k
r } zt d|  |   W Y S d}~X Y nX dS )u-   首页内容 - 性能优化版（秒加载）u$   🏠 homeContent被调用，filter: u4   ⚠️ 无法获取统计信息，返回简化分类totalr   u   📊 数据库统计：总计,u	   首歌曲allu   📚 全部歌曲(u   首)2Ztype_idZ	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_categoriesrC   appendrS   ranger<   len_get_filters_config	Exception)r/   filter
all_countstotal_count
categoriesall_lettersletterslettercountZnumbersnumer2   r2   r3   homeContent   sB    

,,*

zSpider.homeContentc              
   C   s  d}|  |}|dk	r"td |S td t }ztj| jsJi W S t| j}|	 }i }|
d | d pzd|d< dd	d
ddddg}dddddddd}| D ]@\}	}
z"|
|
 | d pd||	< W q   d||	< Y qX q| |}|| | |}|| |  t }td|| dd | || |W S  tk
r } ztd|  i  W Y S d}~X Y nX dS )u9   快速获取所有分类的数量（性能优化核心）Zall_category_countsNu   ✅ 使用缓存的分类数量u8   🔄 计算分类数量（首次加载或缓存过期）SELECT COUNT(*) FROM songsr   rZ   r_   r`   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 '%韩文%'))r_   r`   r   r   r   r   r   u'   ✅ 分类数量计算完成，耗时: z.2fu   秒u   ❌ 获取分类数量失败: )rE   r:   r>   r7   r8   r9   r6   sqlite3connectcursorexecutefetchoneitems_get_letter_counts_batchr'   _get_number_counts_batchrX   rG   rr   )r/   Z	cache_keycachedZ
start_timeconnr   rt   Zmain_categoriesZcategory_queriescategoryqueryletter_countsnumber_countsZend_timer|   r2   r2   r3   rl      sT    







z$Spider._get_all_category_counts_fastc              
   C   s   z|  }d}|| | }i }|D ]}|\}}|r(||d| < q(d}	|	D ] }d| |krPd|d| < qPtdtdd | D  d |W S  tk
r }
 z$td	|
  d
d dD  W Y S d}
~
X Y nX dS )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]'
            rd   rc   r   u   ✅ 字母统计完成: c                 S   s   g | ]\}}|d kr|qS )r   r2   )rM   kvr2   r2   r3   
<listcomp>F  s      z3Spider._get_letter_counts_batch.<locals>.<listcomp>u   个字母有歌曲u'   ⚠️ 批量获取字母统计失败: c                 S   s   i | ]}d | dqS )rd   r   r2   )rM   ry   r2   r2   r3   
<dictcomp>L  s      z3Spider._get_letter_counts_batch.<locals>.<dictcomp>N)r   r   fetchallr:   rp   r   rr   )r/   r   r   r   rowsr   rowry   rz   rw   r|   r2   r2   r3   r   '  s&    

"zSpider._get_letter_counts_batchc              
   C   s   zZ|  }|d | d p"d}i }tdD ]}td|d |d| < q0td |W S  tk
r } z(td|  dd	 tdD  W Y S d
}~X Y nX d
S )u0   批量获取数字分类数量（单次查询）r~   r   rg   r   rh   u   ✅ 数字统计完成u'   ⚠️ 批量获取数字统计失败: c                 S   s   i | ]}d | dqS )rh   r   r2   )rM   r{   r2   r2   r3   r   b  s      z3Spider._get_number_counts_batch.<locals>.<dictcomp>N)r   r   r   ro   maxr:   rr   )r/   r   r   rZ   r   r{   r|   r2   r2   r3   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 qV||  dS )u<   获取简化分类（无数量显示，用于异常情况）r\   u   📚 全部歌曲r]   r^   r_   u   🔥 热门歌曲ra   rb   rc   rd   rg   rh   ri   )rn   rS   ro   rq   )r/   rv   rw   ry   r{   r2   r2   r3   rm   d  s    


 zSpider._get_simple_categoriesc                 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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gddddddddddddddddddddddddgddddddddddddgdgiS )u   获取筛选器配置r\   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   中岛美雪)rD   r   rF   languageu   语言u   全部语言u   国语   粤语   英语   日语   韩语   其他sortu   排序u	   按时间r>   u	   按歌名ra   u   随机推荐randomr2   r.   r2   r2   r3   rq   z  sb      zSpider._get_filters_configc              
   C   s~   t d z4| jdd}| |}t dt| d d|iW S  tk
rx } zt d|  dg i W Y S d}~X Y nX dS )	u   首页视频内容u   📹 homeVideoContent被调用   limitu   ✅ 首页获取到 u    个推荐视频listu   ❌ 获取首页视频失败: N)r:   get_hot_songsarr2vodrp   rr   )r/   songsvideosr|   r2   r2   r3   homeVideoContent2  s    

zSpider.homeVideoContentc              
   C   s   t d| d| d| d|  z|r0t|nd}d}i }|rft|trfzt|}W n   Y nX |rt|tr|| n8t|tr| rzt|}|| W n   Y nX |dkr| 	||W S |
dr|dd	}	| |	|||W S |
d
r |d
d	}
| |
|||W S |rH||d< | |||}| |}n| |||}| |}| |}t d| d| dt| d|  |dkr|| d | nd}|||||dW S  tk
r } zt d|  dg i W Y S d}~X Y nX dS )u   分类内容u#   📂 categoryContent被调用: tid=, pg=z	, filter=z	, extend=   r   ra   rd   r
   rh   r   u   ✅ 分类 u    第 u    页获取到 u    个视频，总数: r   r   pageZ	pagecountr   rZ   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   rp   rr   )r/   tidpgrs   r<   r   	page_sizeZfilter_dictZext_datary   r{   r   ru   r   total_pagesr|   r2   r2   r3   categoryContentA  sZ     




$zSpider.categoryContentr   r   c              
   C   s  t j| jsg dd|ddS zF|d | }t| j}tj|_| }|	 }|
 }	g }
g }|
d |||	||	||	g |r| |
|| |
rd|
nd}d| }||| | d pd}d| d	}|||g ||| | }|  d
d |D }| |}td| dt| d|  |dkrR|| d | nd}|||||dW S  tk
r } z&td|  g dd|dd W Y S d}~X Y nX dS )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   s   g | ]}t |qS r2   r   rM   r   r2   r2   r3   r     s     z+Spider.get_letter_songs.<locals>.<listcomp>u   ✅ 字母     搜索到     条结果，总数: u   ❌ 获取字母歌曲失败: N)r7   r8   r9   r6   r   r   Rowrow_factoryr   upperrS   rn   r<   apply_additional_filtersjoinr   r   r   rX   r   r:   rp   rr   )r/   ry   r   r   rk   offsetr   r   Zletter_upperZletter_lowerwhere_clausesparamswhere_clausecount_queryru   r   r   r   r   r   r|   r2   r2   r3   r     s\    
   

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 |r|D ]}|d |
| d q|r|	dd	| d
 |r| |	|
| |	rd|	nd}d| }|||
 | d pd}d| d}|
||g |||
 | }|  dd |D }| |}td| dt| d|  |dkr|| d | nd}|||||dW S  tk
r } z&td|  g dd|dd W Y S d}~X Y nX dS )u!   获取指定数字开头的歌曲r   r   r   rh   r
   zname LIKE ?%re    OR rf   r   r   r   r   r   c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r     s     z+Spider.get_number_songs.<locals>.<listcomp>u   ✅ 数字 r   r   u   ❌ 获取数字歌曲失败: N)r7   r8   r9   r6   r   r   r   r   r   r-   rC   rn   r   r   r   r   r<   r   rX   r   r:   rp   rr   )r/   r{   r   r   rk   r   r   r   Zchinese_numsr   r   Znum_conditionscharr   r   ru   r   r   r   r   r   r|   r2   r2   r3   r     sZ    



zSpider.get_number_songsc                 C   sL   | dd}|rH| rH|dkr,|d n|d |d| d 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)rC   r   rn   )r/   r   r   rk   language_filterr2   r2   r3   r     s    
zSpider.apply_additional_filtersc                 C   s  zBd}|d | }| j dd}|sFddddd	dd
gdddddW S ||||  }g }|D ]}| |}	| j|dd}
|
r|
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k
r } ztd|  dg i W Y S d}~X Y nX dS )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_urlrn   rp   rr   r:   )r/   r   rk   r   Z	start_idxr*   Zcurrent_keywordsr   rN   
song_countZsample_songsZsample_songr   Z	all_songsplay_urlru   r   r|   r2   r2   r3   r   &  sp    




	z$Spider.show_search_by_name_interfacec                 C   s*  |sdS g }| d| dt| d|d d   t|dD ]\}}| d|d	  }|d
rt|d|d
  7 }|dr|d }|dkr|d7 }n|dkr|d7 }| | d|d   q>t|dkr tdt|dD ]>}|t|k r||d|d d  d| d|d d   qd|S )u$   构建关键词搜索结果播放URLr
      🔍 搜索关键词：u   （共u   首）$r   r   r   . r   singer - 	hot_scoreP   	    🔥🔥r       🔥$r      ━━━ 第u   批 (   首) ━━━$#)rn   rp   	enumeraterC   ro   insertr   )r/   rN   r   play_url_partsisong	song_namer   r2   r2   r3   r   v  s(    (


0zSpider.build_keyword_play_urlc              
   C   s8  t j| js| jd| S zt| j}| }d}|||d f |	 }g }|D ]X}|d rXt
|d }|dddd}td|}	|	D ]}
t|
d	kr||
 qqX|  dd
lm} ||}dd ||D }|d| W S  tk
r2 } z$td|  | jd|  W Y S d}~X Y nX dS )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 r2   r2   )rM   kwrz   r2   r2   r3   r     s     z7Spider.get_popular_keywords_from_db.<locals>.<listcomp>u$   ⚠️ 获取热门关键词失败: )r7   r8   r9   r6   r*   r   r   r   r   r   r   r   resplitrp   rn   rX   collectionsr  most_commonrr   r:   )r/   r   r   r   r   resultskeywordsr   r   partspartr  Zkeyword_counterr*   r|   r2   r2   r3   r     s2    z#Spider.get_popular_keywords_from_dbc              
   C   s   t j| jsdS zdt| j}| }d}||d| dd| dd| df | }|	  |rr|d ndW S  t
k
r } ztd|  W Y dS d}~X Y nX dS )u$   获取包含关键词的歌曲数量r   z
                SELECT COUNT(*) as song_count 
                FROM songs 
                WHERE name LIKE ? 
                   OR name_full LIKE ? 
                   OR name_trim LIKE ?
            r   u*   ⚠️ 获取关键词歌曲数量失败: Nr7   r8   r9   r6   r   r   r   r   r   rX   rr   r:   )r/   rN   r   r   r   resultr|   r2   r2   r3   r     s    *zSpider.get_keyword_song_countc           	   
   C   s   t j| jsg S z`t| j}tj|_| }d| d}d}|	|||||f |
 }|  dd |D W S  tk
r } ztd|  g  W Y S d}~X Y nX dS )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   s   g | ]}t |qS r2   r   r   r2   r2   r3   r     s     z2Spider.search_songs_by_keyword.<locals>.<listcomp>u   ❌ 关键词搜索失败: Nr7   r8   r9   r6   r   r   r   r   r   r   r   rX   rr   r:   )	r/   rN   r   r   r   search_termr   r   r|   r2   r2   r3   r     s    	zSpider.search_songs_by_keywordc                 C   s4  |g}|D ]<}|| j kr
| j | D ]"}|||}||kr"|| q"q
| jD ]H}||krN||d}||krx|| ||d}||krN|| qNdddddd}	|	 D ].\}
}|
|kr||
|}||kr|| q|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   rn   r,   r   r:   )r/   rN   search_termsr   Z	homophoneZnew_termsepZno_sepZ	space_sepZsimple_to_traditionalZsimpleZtraditionalZ	trad_termr2   r2   r3   process_fuzzy_search  s>    


zSpider.process_fuzzy_searchc              
   C   s6  |si }t j| jsg S td| d|  z|d | }t| j}tj|_|	 }g }g }|
dd}	|	r|	 r| |	}
g }|
dd D ]@}|d |d	| d	d	| d	d	| d	d	| d	g q|r|d
d| d |
dd}|r@| r@|dkr$|d n|d |d	| d	 |
dd}|rj| rj| ||| |rzd|nd}|
dd}| |}d| d| d}|||g ||| | }|  dd |D }tdt| d |W S  tk
r0 } ztd|  g  W Y S d}~X Y nX dS )u   根据筛选条件搜索歌曲u(   🔍 执行筛选搜索，筛选条件: 
   , 页码: r   r   r
   Nr   F(name LIKE ? OR name_full LIKE ? OR name_trim LIKE ? OR singer LIKE ?)r   re   r   rf   r   r   r   r   r   r   r   r   r_   r   z
                ORDER BY z.
                LIMIT ? OFFSET ?
            c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   e  s     z4Spider.search_songs_with_filters.<locals>.<listcomp>   ✅ 搜索到 u
    条结果u   ❌ 搜索歌曲失败: )r7   r8   r9   r6   r:   r   r   r   r   r   rC   r   r  rn   r<   r   apply_category_filterget_order_by_clauser   r   rX   rp   rr   )r/   r   r   rk   r   r   r   r   r   name_filterr  
conditionstermr   category_filterr   sort_filterZorder_byr   r   r  r|   r2   r2   r3   r   "  s`    

4


z Spider.search_songs_with_filtersc                 C   s   |dkr| d nv|dkr(| d nb|dkr<| d nN|dkrP| d n:|d	krd| d
 n&|dkrx| d n|dkr| d dS )u   应用分类筛选r_   z((hot_score > 30 OR local_hot_score > 30)r`   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)rn   )r/   r   r   r%  r2   r2   r3   r   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())r_   r>   ra   r   z$hot_score DESC, local_hot_score DESCrC   )r/   r&  Zorder_by_rulesr2   r2   r3   r!    s    zSpider.get_order_by_clausec              
   C   s  |si }t j| jsdS ztt| j}| }g }g }|dd}|r| r| 	|}g }|dd D ]@}	|
d |d|	 dd|	 dd|	 dd|	 dg ql|r|
dd	| d
 |dd}
|
r|
 r|
dkr|
d n|
d |
d|
 d |dd}|r@| r@| ||| |rPd|nd}d| }||| | }|  |r|d nd}|W S  tk
r } ztd|  W Y dS d}~X Y nX dS )u   获取搜索结果总数r   r   r
   Nr   r  r   re   r   rf   r   r   r   r   r   r   r   r   u   ❌ 获取搜索总数失败: )r7   r8   r9   r6   r   r   r   rC   r   r  rn   r<   r   r   r   r   rX   rr   r:   )r/   rk   r   r   r   r   r"  r  r#  r$  r   r%  r   r   r  rZ   r|   r2   r2   r3   r     sJ    

4

zSpider.get_search_total_count)r   r   r   rJ   c                 C   s   t d| d|  |dkr*| j||dS |dkr@| j||dS |dkrV| j||dS |dkrn| jd||dS |d	kr| jd
||dS |dkr| jd||dS |dkr| jd||dS |dkr| j||dS g S dS )u   获取分类歌曲u   📁 获取分类歌曲: r  r_   )r   r   r`   r   r   r   r   r   r   r   r   r   r\   N)r:   r   get_new_songsget_mandarin_songsget_language_songsget_all_songs)r/   r   r   r   r2   r2   r3   r     s$    zSpider.get_category_songsc              
   C   s  t j| jsdS zt| j}| }|dkr6d}nf|dkrDd}nX|dkrRd}nJ|dkr`d	}n<|d
krnd}n.|dkr|d}n |dkrd}n|dkrd}nd}|| | }|	  |r|d ndW S  t
k
 r } ztd|  W Y dS d}~X Y nX dS )u   获取分类总数r   r_   r   r`   r   r   r   r   r   r   r   r   r   r   r   r\   r~   u   ❌ 获取分类总数失败: Nr  )r/   r   r   r   r   r  r|   r2   r2   r3   r     s:    
zSpider.get_category_total_countc              
   C   s   t j| jsg S zP|d | }t| j}tj|_| }d}|	|||f dd |
 D W S  tk
r } ztd|  g  W Y S d}~X Y nX dS )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   s   g | ]}t |qS r2   r   r   r2   r2   r3   r     s     z-Spider.get_mandarin_songs.<locals>.<listcomp>u   ❌ 获取国语歌曲失败: Nr7   r8   r9   r6   r   r   r   r   r   r   r   rr   r:   )r/   r   r   r   r   r   r   r|   r2   r2   r3   r)    s    zSpider.get_mandarin_songsc           	   
   C   s   |r|}t j| jsg S zP|d | }t| j}tj|_| }d}|	|||f dd |
 D W S  tk
r } ztd|  g  W Y S d}~X Y nX dS )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   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   &  s     z(Spider.get_hot_songs.<locals>.<listcomp>u   ❌ 获取热门歌曲失败: Nr,  	r/   r   r   r   r   r   r   r   r|   r2   r2   r3   r     s    zSpider.get_hot_songsc           	   
   C   s   |r|}t j| jsg S zP|d | }t| j}tj|_| }d}|	|||f dd |
 D W S  tk
r } ztd|  g  W Y S d}~X Y nX dS )u   获取最新歌曲r   z
                SELECT * FROM songs 
                ORDER BY created_at DESC, updated_at DESC 
                LIMIT ? OFFSET ?
            c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   ?  s     z(Spider.get_new_songs.<locals>.<listcomp>u   ❌ 获取新歌曲失败: Nr,  r-  r2   r2   r3   r(  +  s    zSpider.get_new_songsc              
   C   s   |r|}t j| jsg S z|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k
r } z td| d|  g  W Y S d}~X Y nX dS )u   获取指定语言的歌曲r   r   r   u   英文r   u   日文r   u   韩文)r   r   r   r   r[   c                 S   s   g | ]}d qS )?r2   )rM   r   r2   r2   r3   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   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   e  s     u
   ❌ 获取u   歌曲失败: N)r7   r8   r9   r6   r   r   r   r   r   rC   r   r   r   rr   r:   )r/   r   r   r   r   r   r   r   Zlanguage_map	languagesZplaceholdersr   r   r|   r2   r2   r3   r*  D  s2    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k
r }	 ztd|	  g  W Y S d}	~	X Y nX dS )u   获取所有歌曲r   z
                SELECT * FROM songs 
                ORDER BY hot_score DESC, created_at DESC 
                LIMIT ? OFFSET ?
            c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   ~  s     z(Spider.get_all_songs.<locals>.<listcomp>u   ❌ 获取所有歌曲失败: Nr  )
r/   r   r   r   r   r   r   r   r   r|   r2   r2   r3   r+  j  s"    zSpider.get_all_songsc                 C   s~  z8t d|  |r|d s(dg iW S |d }|dr|d}|d dd}| j|dd}|spd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r0d|
ksd|
kr0t d|
  dg iW S i }t|dkrpz |d r\t|d ni }W n   Y nX |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k
rx } zt d'|  dg i W Y S d}~X Y nX dS )(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   Zvod_yearZvod_directorZvod_areaZvod_langZ	vod_actoru"   ✅ 关键词搜索结果详情，
    首歌曲r4   messageu   ❌ 查询歌曲失败: r   recommend_limitr   r   u	   KTV直连u
   音乐,KTVr   u   未知歌手r   u   未知语言r   u    ✅ 详情页构建完成，有     首推荐歌曲u   ❌ 获取详情失败: )r:   r   r  r   r   r   rp   build_keyword_vod_contentrC   
query_songr   r   r   r   RECOMMENDATION_CONFIGget_unlimited_recommendationsbuild_song_remarksbuild_unlimited_vod_contentbuild_unlimited_play_urlrr   )r/   ZidsZ
current_idr  rN   Zkeyword_songsZ
first_songr   Zvideocurrent_tidresr   r4  recommend_songsremarksr|   r2   r2   r3   detailContent  s    






 
 




zSpider.detailContentc                 C   s  g }| d|  | dt| d | d tt}tt}tt}|D ]^}|drr||d   d7  < |dr||d   d7  < |drP||d   d7  < qP|rt| d	d
 dddd }| d |D ] \}	}
| d|	 d|
 d q|rZt| dd
 dddd }| d |D ]"\}}
| d| d|
 d q6t|dd
 dddd }| d t|dD ]F\}}|d }|dr|d|d  7 }| d| d|  q| d | d d|S )u!   构建关键词搜索详情内容r   u   📊 搜索结果：共找到 r2  r
   r   r   r   r1  c                 S   s   | d S Nr   r2   xr2   r2   r3   <lambda>      z2Spider.build_keyword_vod_content.<locals>.<lambda>T)rD   reverseNr	  u   🌐 语言分布：z  - z: r   c                 S   s   | d S rB  r2   rC  r2   r2   r3   rE    rF  u   🎤 歌手分布：c                 S   s   |  ddS )Nr   r   r'  rC  r2   r2   r3   rE    rF  u   🔥 热门歌曲：r   r   z  r   u8   💡 提示：点击选集可以直接播放相关歌曲
)	rn   rp   r	   r   rC   sortedr   r  r   )r/   rN   r   content_partsZlanguage_countZsinger_countZ
year_countr  Ztop_languageslangrz   Ztop_singersr   	hot_songsr  r  r2   r2   r3   r6    sD    








z Spider.build_keyword_vod_contentc              
   C   s  t j| jsg S td| d zt| j}tj|_g }t	|g}|
dr|d }|rt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 ]t}t||kr8 q| }d}	||	d| d|df | }
dd	 |
D }|| |dd	 |D  q t||k r|t| }td| d | }d}	||	||f | }
dd	 |
D }|| t||k rb|t| }td| d | }d}	||	||f | }
dd	 |
D }|| |  t	 }g }|D ],}|d }||krx|| || qxtdt| d |d| W S  tk
r  } ztd|  g  W Y S d}~X Y nX dS )u   获取无限推荐歌曲u(   🎯 开始获取无限推荐，目标: r2  r   u   🌐 获取同语言歌曲: z
                        SELECT * FROM songs 
                        WHERE language LIKE ? AND tid != ?
                        ORDER BY hot_score DESC 
                        LIMIT ?
                    r   r   c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   /  s     z8Spider.get_unlimited_recommendations.<locals>.<listcomp>u   ✅ 找到 u    首同语言歌曲c                 S   s   g | ]}|d  qS r   r2   rM   sr2   r2   r3   r   3  s     u(   🏷️ 查找同标签歌曲，标签: Nr	  z
                        SELECT * FROM songs 
                        WHERE tags_str LIKE ? AND tid != ?
                        ORDER BY hot_score DESC 
                        LIMIT ?
                    r   c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   H  s     c                 S   s   g | ]}|d  qS rM  r2   rN  r2   r2   r3   r   J  s     u"   🔥 补充热门歌曲，需要:     首z
                    SELECT * FROM songs 
                    WHERE tid != ? AND hot_score > 20
                    ORDER BY hot_score DESC 
                    LIMIT ?
                c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   [  s     u   🎲 随机补充，需要: z
                    SELECT * FROM songs 
                    WHERE tid != ? 
                    ORDER BY RANDOM() 
                    LIMIT ?
                c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   m  s     r   u$   🎉 推荐系统完成，共找到 r5  u   ❌ 无限推荐失败: )r7   r8   r9   r6   r:   r   r   r   r   setrC   r   r   minr   rp   r<   r'   extract_song_tagsrX   addrn   rr   )r/   r=  current_songr   r   Zall_recommendationsZseen_idsr   r   r   r   Z
lang_songstagstagZ	tag_songsneededrL  Zrandom_songsseenZunique_recommendationsr  r   r|   r2   r2   r3   r9    s    

 






z$Spider.get_unlimited_recommendationsc              	   C   s   g }d|kr|d rz&t |d }t|tr8|| W nr   d|d krn|dd |d dD  n:d|d kr|dd |d dD  n||d  Y nX |S )u   从歌曲数据中提取标签tags_strr[   c                 S   s   g | ]}|  r|  qS r2   r   rM   tr2   r2   r3   r     s      z,Spider.extract_song_tags.<locals>.<listcomp>r   c                 S   s   g | ]}|  r|  qS r2   r[  r\  r2   r2   r3   r     s      )r   r   r   r   r<   r  rn   )r/   	song_datarV  Zparsed_tagsr2   r2   r3   rS    s    
  zSpider.extract_song_tagsc           	      C   sL  g }d|d  }| dr.|d|d  7 }|| d|d   t|dD ]\}}| d|d  }| dr|d|d  7 }| d	r|d	 }|d
kr|d7 }n|dkr|d7 }|| d|d   qPt|dkr.tdt|dD ]:}|t|k r||d|d d  d| d|d   qt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  )rC   rn   r  rp   ro   r  r:   r   )	r/   rU  r?  r  Zcurrent_song_namer  Zrecr  r   r2   r2   r3   r<    s,    



,zSpider.build_unlimited_play_urlc                 C   sD  g }| dr"|d|d   | drh|d|d   | |d }|dkrh|d| d | dr|d	|d   |d
| d |d | |}|r|dd|dd   | dr|d|d   | dr|d|d   |  }|d|dd |d| d d|S )u   构建无限推荐详情内容r   u   🎵 歌曲名称: r   u   🎤 歌手: r   u   📊 该歌手共有 r2  r   u   🌐 语言: u   ✨ 为您推荐了 u    首相关歌曲uG   📈 推荐系统：同语言 > 同标签 > 热门歌曲 > 随机歌曲u   🏷️ 标签: z, Nr   r   u   🔥 热度: update_timeu   🕐 更新时间: u   💾 数据库歌曲总数: r[   rP  u   📊 本次推荐使用了 rH  )rC   rn   get_singer_song_countrS  r   get_total_song_count)r/   r^  Zrecommend_countrJ  r   rV  Ztotal_songsr2   r2   r3   r;    s.    





z"Spider.build_unlimited_vod_contentc              
   C   s   t j| jsdS zPt| j}| }d}||d| df | }|	  |r^|d ndW S  t
k
r } ztd|  W Y dS d}~X Y nX dS )u   获取歌手的歌曲数量r   z.SELECT COUNT(*) FROM songs WHERE singer LIKE ?r   u'   ⚠️ 获取歌手歌曲数量失败: Nr  )r/   r   r   r   r   r  r|   r2   r2   r3   r`    s    zSpider.get_singer_song_countc              
   C   s   t j| jsdS zDt| j}| }d}|| | }|	  |rR|d ndW S  t
k
r } ztd|  W Y dS d}~X Y nX dS )u!   获取数据库中的歌曲总数r   z#SELECT COUNT(*) as total FROM songsu!   ⚠️ 获取歌曲总数失败: Nr  )r/   r   r   r   r  r|   r2   r2   r3   ra    s    
zSpider.get_total_song_count)r^  rJ   c                 C   s   g }| dr"|d|d   | drlz2t|d }t|tr\|r\||dd  W n   Y nX | dr|d|d   | dr|d d	d
 }|| |rd|S dS )u   构建歌曲备注r      🌐 rZ  Nr
  r      🔥r_  r   r    | 	   KTV歌曲)	rC   rn   r   r   r   r   r<   r  r   )r/   r^  r  rV  Z	date_partr2   r2   r3   r:    s     




zSpider.build_song_remarksc              
   C   s   t j| jsddiS zZt| j}tj|_| }d}|	||f |
 }|r\t|W S dd| diW S W np tjk
r } zddt| i W Y S d}~X Y n8 tk
r } zdd	t| i W Y S d}~X Y nX dS )
u   查询歌曲r4   r5   z!SELECT * FROM songs WHERE tid = ?r3  u   未找到 tid 为 u
    的歌曲u   数据库错误: Nu   查询失败: )r7   r8   r9   r6   r   r   r   r   r   r   r   r   Errorr   rr   )r/   Z
target_tidr   r   r   r   r|   r2   r2   r3   r7    s     
&zSpider.query_song1c              
   C   s  zNt d| d| d|  |r8| r8| |  t|}d}|d | }tj| jspt d dg iW S d| d}t	| j}tj
|_| }	d	}
|||||f}|	|
| |	 }d
}|	||||f |	 }|r|d nd}|  | dd |D }t dt| d| d |dkr<|| d | nd}|||||dW S  tk
r } zt d|  dg i W Y S d}~X Y nX dS )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 ?
            rZ   r   c                 S   s   g | ]}t |qS r2   r   r   r2   r2   r3   r   h  s     z(Spider.searchContent.<locals>.<listcomp>r  u    个结果，总共 u    个r   u   ❌ 搜索失败: N)r:   r   save_search_historyr   r7   r8   r9   r6   r   r   r   r   r   r   r   r   rX   r   rp   rr   )r/   rD   quickr   r   r   r   r  r   r   r   r   r   r   Ztotal_resultrZ   r   r   r|   r2   r2   r3   searchContent7  sF    
	zSpider.searchContentc              
   C   s   zd}g }t j|rBt|ddd}dd | D }W 5 Q R X ||krT|| |d| |dd	 }t|d
dd }|D ]}|| d qW 5 Q R X W n0 tk
r } zt	d|  W 5 d}~X Y nX dS )u   保存搜索历史z4/storage/emulated/0/fenmei/php/db/search_history.txtrutf-8)encodingc                 S   s   g | ]}|  r|  qS r2   r[  )rM   liner2   r2   r3   r     s      z.Spider.save_search_history.<locals>.<listcomp>r   Nr   wrH  u!   ⚠️ 保存搜索历史失败: )
r7   r8   r9   open	readlinesremover  writerr   r:   )r/   rN   Zhistory_filehistoryfitemr|   r2   r2   r3   rh  z  s    
 zSpider.save_search_historyc                 C   sH   zt d| d|  |dr<dd|d| jdddW S | jsh|  | _| jsht d	 ddd
dW S | |}|st 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| krd|d d< nd| krd|d d< |W S  tk
rB } z"t d|  ddd
d W Y S d}~X Y nX dS )u   播放内容u   ▶ 播放请求: flag=z, vid=)zhttp://zhttps://r   zMozilla/5.0r   )r   Refererr   )jxparserI   headeru   ❌ 获取token失败r
   )ry  rx  rI   u   ❌ 获取播放URL失败u   ✅ 获取到播放URL: Nr   r  r   identityr   r   zbytes=0-rg  )	r   rw  ZOriginr   r   r   r   RangeZDNTrK   z	video/mp4rz  zContent-TyperL   zapplication/vnd.apple.mpegurlu   ❌ 播放器异常: )r:   r   hosttokenget_auth_tokenget_play_urlrS   rr   )r/   flagZvidvipFlagsr   r  r|   r2   r2   r3   playerContent  sV    


zSpider.playerContentc              
   C   s   zt tt }| | j| j d| j | j|dddd}| jj| j	 d|dd
 }|d	d
krv|dW S td|  W dS W n6 tk
r } ztd|  W Y dS d}~X Y nX dS )u   获取认证令牌r   z2.0z4.1.3.03281430)appidmacsnr>   vervnZ 024210cba40d4385a93e6c2d3249bfb5z
/auth/initr   r   r)   coder0  r~  u   ❌ 获取token失败: Nu   ❌ 初始化token失败: )r   r   r>   thunder_signapp_idr  r  r$   rC   r}  r   r:   rr   )r/   	timestampr   responser|   r2   r2   r3   r    s0    	


zSpider.get_auth_tokenc                 C   s   zt 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 W n6 tk
r } ztd|  W Y dS d}~X Y nX dS )u   获取播放URLr   0rg  Z720)	r  ZdeviceZish265Zlsmusicno
resolutionr  r>   r~  Z 19042303a8374f67ae3fe1e25c97936fz/music/downurlr   r  r  r0  datar
   u   ❌ 获取播放URL失败: u   ❌ 获取播放URL异常: N)r   r   r>   r  r  r  r  r~  r$   rC   r}  r   r:   rr   )r/   r  r  r   r  r|   r2   r2   r3   r    s6    



zSpider.get_play_urlc                 C   s  g }|D ]}zHd}d|krb|d rbz.t |d }t|trRd|dd }W n   Y nX g }|dr|d|d   |r|| |dr|d	|d   |rd
|nd}g }|dr|d|d   |dr|d|d   |dr$|d|d   |r4d
|nd}	||d |d |d|	d W q tk
r }
 ztd|
  W Y qW 5 d}
~
X Y qX q|S )u   数组转视频列表r
   rZ  r[   N   r   u   🌐r   rc  rd  re  r   u   🎵 rb  r1  u   📅 r   )r   r   r   r   r   u   ⚠️ 转换视频项失败: )	r   r   r   r   r   rC   rn   rr   r:   )r/   Zarrr   rv  rZ  rV  Zremarks_partsr@  rJ  contentr|   r2   r2   r3   r     sL    





zSpider.arr2vodc           	      C   sd   t | }g }|D ]}|| d||   qd|}|| }t|d }||d< |S )u   生成签名=&rl  sign)rI  keysrn   r   hashlibmd5encode	hexdigest)	r/   r   Zsdk_keyZsorted_keysZquery_partsrD   Zbase_stringZsign_materialr  r2   r2   r3   r  5  s    
zSpider.thunder_signc                 C   s   dS )u   本地代理Nr2   )r/   paramr2   r2   r3   
localProxyA  s    zSpider.localProxy)r
   )r   r   N)r   r   N)r   N)r   )r   )r   r   N)N)r   r   )r   r   N)r   r   N)r   r   N)r   r   N)r   )rg  )N__name__
__module____qualname__r}  r6   requestsSessionr$   r~  r  r  r  r8  rA   r?   r@   r;   r#   r=   rB   rE   rG   rH   r   boolrV   rW   rY   r}   rl   r   r   rm   rq   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+  rA  r6  r9  rS  r<  r;  r`  ra  r:  r7  rj  rh  r  r  r  r   r  r  __classcell__r2   r2   r0   r3   r      s   <

7C' 9B
J
N
P
'
.
L

5%



&
]/
q#'
C:/r   )Zbase.spiderr   r7   sysr>   r   r  urllib3r   r  typingr   r   r   r   r   r   r   r  r  r	   disable_warnings
exceptionsInsecureRequestWarningr8   rn   r2   r2   r2   r3   <module>   s   @