U
    gK                     @   s   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 ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ G dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N   )InfoExtractor   )ExtractorErrorOnDemandPagedList
clean_htmlint_or_nonejoin_nonempty
js_to_jsonstr_or_nonestrip_jsonptraverse_objunescapeHTMLurl_or_noneurljoinc                   @   sT   e Zd ZdddZdd Zdd Zedd	 Zed
d Z	dddZ
i fddZdS )QQMusicBaseIENc                 C   s   t | d|d|S )Nzhttps://y.qq.comvalue)getattrZ_get_cookiesget)selfkeydefault r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/qqmusic.py_get_cookie   s    zQQMusicBaseIE._get_cookiec                 C   s2   d}|  ddD ]}||d> t| 7 }q|d@ S )Ni  Zqqmusic_key    )r   ord)r   ncr   r   r   	_get_g_tk   s    zQQMusicBaseIE._get_g_tkc                 C   s   t | dpdS )Nuinr   )r   r   r   r   r   r   _get_uin"   s    zQQMusicBaseIE._get_uinc                 C   s   t |  o| dS )NZ	fqm_pvqid)boolr$   r   r#   r   r   r   is_logged_in%   s    zQQMusicBaseIE.is_logged_inc                  C   s0   t t d d } t tt d |  d S )Ni  r   g    _B)inttimeroundrandom)Zcur_msr   r   r   _m_r_get_ruin+   s    zQQMusicBaseIE._m_r_get_ruinTc                 C   s&   | j |||d}| jd|d|t|dS )Nfatalzwindow\.__INITIAL_DATA__\s*=z	init data)transform_sourcer-   )Z_download_webpageZ_search_jsonr
   )r   urlmidr-   Zwebpager   r   r   _download_init_data0   s       z!QQMusicBaseIE._download_init_datac              	   K   s>   | j d|ftjdddd|  di|dd |d	|S )
Nz%https://u.y.qq.com/cgi-bin/musicu.fcgZcommr      json)Zcvctformatr"   ),:)
separators)dataheaders)_download_jsonr3   dumpsr$   encode)r   Zreq_dictr0   r:   kwargsr   r   r   _make_fcu_req5   s(     	zQQMusicBaseIE._make_fcu_req)N)T)__name__
__module____qualname__r   r!   r$   propertyr&   staticmethodr+   r1   r?   r   r   r   r   r      s   



r   c                   @   s  e Zd ZdZdZdZdddddd	d
dddgdgdddddddddddddddgdgddd
dd d!d"d#d$dd%d&d'd(d)gg d*d+dd,d-d.d/d0dd1d2d3d4dd5d6d7id8d9gZd:d;d:d<d=d>d?d>d@d=dAdBddCdDdEdFdGddHdIdEdJdKdLdMdNdEdOdPdLdMdQdEdRZdSdT ZdUS )V	QQMusicIEZqqmusicu   QQ音乐z:https?://y\.qq\.com/n/ryqq/songDetail/(?P<id>[0-9A-Za-z]+)z1https://y.qq.com/n/ryqq/songDetail/004Ti8rT003TaZZ d7adc5c438d12e2cb648cca81593fd47Z004Ti8rT003TaZmp3u'   永夜のパレード (永夜的游行)u    幻想遊園郷 -Fantastic Park-Z20111230i  u   ケーキ姫ZJUMAPopz$md5:b5261f3d595657ae561e9e6aee7eb7d9iD re:^https?://.*\.jpg(?:$|[#?])zcount:1)idexttitlealbumrelease_datedurationcreatorsgenresdescriptionsize	thumbnail	subtitles)r/   md5	info_dictz1https://y.qq.com/n/ryqq/songDetail/004295Et37taLDZ 5f1e6cea39e182857da7ffc5ef5e6bb8Z004295Et37taLDu   可惜没如果u!   新地球 - 人 (Special Edition)Z20150129i*  	   林俊杰z$md5:f568421ff618d2066e74b65a04149c4e)
rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rS   zpremium member only)r/   rU   rV   skipz)There is no mp3-320 version of this song.z1https://y.qq.com/n/ryqq/songDetail/004MsGEo3DdNxVZ 028aaef1ae13d8a9f4861a92614887f9Z004MsGEo3DdNxVu   如果u&   新传媒电视连续剧金曲系列IIZ20050626   u	   李季美z$md5:fc711212aa623b28534954dc4bd67385ir5 rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   )noter/   rU   rV   zlyrics not in .lrc formatz1https://y.qq.com/n/ryqq/songDetail/001JyApY11tIp6Z001JyApY11tIp6zShadows Over TransylvaniaZ19970225zDark Funeralz$md5:c9b20210587cbcd6836a1c597bab4525)rI   rJ   rK   rM   ZcreatorrQ   rS   Zskip_downloadTzno longer available)r[   r/   rV   paramsrX   ZflacF000<   )nameprefixrJ   
preferenceZapeA0002   Z320mp3M800(   i@  )r_   r`   rJ   ra   abrZ128mp3M500      Z96aacC400Zm4a   `   Z48aacC2000   )r]   rb   rd   rg   rj   rm   c                    s  |  || j|dd}| jddddddid	d
d d d }|d d  | jddt|  gt| j dgt| j t|  dd fdd| j D dddddiddd| 	 d}t
|ddthf}|dkrtd|pd g }t
|ddd fd!d"fD ]}t
|d#thd$d" hf}| j|pFi }	|	d%}
|td&|d' |
|
t
|dd(|
 thf|	d)|	d*|	d+d,d- q|s| js|   t
|d.r| d/|d0 d  t
|d0dd1d2d" hf}|d3t
|d4thfd5d4thd6d" hfd7d8d" hfd9d:d%thfd;thd<d" hfd=thfd>t
|d?d@thfddAdBd:dCthfddDdBd:dCthtfdEfddF}|rdGdH|dIgi|dJ< t|dK|dLdM|dK< |S )NNFr,   infozmusic.pf_song_detail_svrZget_song_detail_yqqr   )song_midZ	song_typemodulemethodparamzDownloading song infor[   r9   Z
track_infofile	media_midzvkey.GetVkeyServerZ
CgiGetVkeyr   Z20c                    s&   g | ]}|d     d|d  qS )r`   .rJ   r   ).0f)rw   r   r   
<listcomp>   s     z+QQMusicIE._real_extract.<locals>.<listcomp>)ZguidsongmidZsongtyper"   Z	loginflagplatformfilenamez!music.musichallSong.PlayLyricInfoZGetPlayLyricInfoZsongMID)req_1req_2zDownloading formats and lyric)r[   r:   r   codez+Failed to download format info, error code unknownZ
midurlinfoc                    s   |d  ko|d S )Nr|   purlr   _v)r0   r   r   <lambda>       z)QQMusicIE._real_extract.<locals>.<lambda>r~   c                 S   s   | d d S )N   r   xr   r   r   r      r   r_   z https://dl.stream.qqmusic.qq.comr   Zsize_ra   rf   rJ   none)r/   r5   	format_idrR   Zqualityrf   rJ   Zvcodec)r   r   z Failed to download lyric, error r   Zlyricc                 S   s   t | dS )Nzutf-8)base64	b64decodedecoder   r   r   r   r      r   rI   formatsrK   rL   c                 S   s   | pd S Nr   r   r   r   r   r      r   Ztime_publicc                 S   s   |  ddpd S )N-r   )replacer   r   r   r   r      r   Zsinger.Zsubtitlec                 S   s   | pd S r   r   r   r   r   r   r      r   interval)rK   rL   rM   rO   Z	alt_titlerN   ZdetailZpicurlZintrocontentr   Zgenre)rS   rQ   rP   )get_alloriginZlrc)rJ   r9   rT   rQ   
delim)	_match_idr1   r?   strr+   len_FORMATSr$   valuesgeo_verification_headersr   r'   r   r   appendr   r   r&   Zraise_login_requiredZreport_warningr   allr	   )r   r/   	init_dataZ	info_datar9   r   r   Z
media_infoZ
format_keyformat_infor   Zlrc_contentrV   r   )rw   r0   r   _real_extract   s    
 	

     


zQQMusicIE._real_extractN)	r@   rA   rB   IE_NAMEIE_DESC
_VALID_URL_TESTSr   r   r   r   r   r   rE   B   s   	C	rE   c                   @   s|   e Zd ZdZdZdZ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igdgZdZdd Zd d! Z	d"S )#QQMusicSingerIEzqqmusic:singeru   QQ音乐 - 歌手z6https?://y\.qq\.com/n/ryqq/singer/(?P<id>[0-9A-Za-z]+)z-https://y.qq.com/n/ryqq/singer/001BLpXF2DyJe2Z001BLpXF2DyJe2rW   z$md5:10624ce73b06fa400bc846f59b0305farH   )rI   rK   rQ   rS   d   )r/   rV   Zplaylist_mincountz-https://y.qq.com/n/ryqq/singer/000Q00f213YzNVZ000Q00f213YzNVu	   桃几OvOu5   小破站小唱见~希望大家喜欢听我唱歌~！   rV   Z0016cvsy02mmClrF   u   群青u   桃几2021年翻唱集Z20210913   rG   z$md5:4296005a04edcb5cdbe0889d5055a7aei< rZ   )r/   rV   playlist_countZplaylistrc   c              	   #   sX    j dddd||| |ddi|d| d}t|dd	d
d fddhfE d H  d S )Nr   zmusic.web_singer_info_svrZget_singer_detail_infor   )sortZ	singermidsinnumrq   zDownloading page ru   r9   songlist.c                    s$     d| d  t| d | dS )N#https://y.qq.com/n/ryqq/songDetail/r0   rK   )
url_resultrE   r   r   r#   r   r   r     s
      z-QQMusicSingerIE._fetch_page.<locals>.<lambda>)r?   r   )r   r0   Z	page_sizeZpage_numr9   r   r#   r   _fetch_page  s     	zQQMusicSingerIE._fetch_pagec              
   C   sj   |  |}| j||dd}| jtt| j|| j| j|ft|dddt	hfddt	hfddt
hfd	fS )
NFr,   ZsingerDetailZ
basic_infor_   Zex_infodescZpic)rK   rQ   rS   )r   r1   playlist_resultr   	functoolspartialr   
_PAGE_SIZEr   r   r   )r   r/   r0   r   r   r   r   r     s    



zQQMusicSingerIE._real_extractN)
r@   rA   rB   r   r   r   r   r   r   r   r   r   r   r   r      sJ   
#r   c                   @   s   e Zd Zdd ZdS )QQPlaylistBaseIEc              	   c   sB   t ||D ]2}|d}|sq
| d| t||dV  q
d S )Nr|   r   Zsongname)r   r   r   rE   )r   Z	info_jsonpathZsongrp   r   r   r   _extract_entries,  s    
  z!QQPlaylistBaseIE._extract_entriesN)r@   rA   rB   r   r   r   r   r   r   +  s   r   c                   @   sH   e Zd ZdZdZdZdddddd	d
ddddddd
gZdd ZdS )QQMusicAlbumIEzqqmusic:albumu   QQ音乐 - 专辑z;https?://y\.qq\.com/n/ryqq/albumDetail/(?P<id>[0-9A-Za-z]+)z2https://y.qq.com/n/ryqq/albumDetail/000gXCTb2AhRR1Z000gXCTb2AhRR1u   我们都是这样长大的z$md5:179c5dce203a5931970d306aa9607ea6rI   rK   rQ   r   r/   rV   r   z2https://y.qq.com/n/ryqq/albumDetail/002Y5a3b3AlCu3Z002Y5a3b3AlCu3u   그리고…z$md5:a48823755615508a95080e81b51ba729   c                 C   s\   |  |}| jd|d|dddd }| |d}| j||ft|dthfd	tjhfd
S )Nz5http://i.y.qq.com/v8/fcg-bin/fcg_v8_album_info_cp.fcgzDownload album pager3   )Zalbummidr5   )queryr9   )list.r_   r   rK   rQ   )r   r;   r   r   r   r   strip)r   r/   r0   Z
album_jsonentriesr   r   r   r   M  s    
 
zQQMusicAlbumIE._real_extractNr@   rA   rB   r   r   r   r   r   r   r   r   r   r   6  s&   	r   c                   @   sZ   e Zd ZdZdZdZdddddd	d
ddddddd
ddddddd
gZdd ZdS )QQMusicToplistIEzqqmusic:toplistu   QQ音乐 - 排行榜z1https?://y\.qq\.com/n/ryqq/toplist/(?P<id>[0-9]+)z#https://y.qq.com/n/ryqq/toplist/123Z123u*   re:美国热门音乐榜 \d{4}-\d{2}-\d{2}u*   美国热门音乐榜，每周一更新。r   _   r   z!https://y.qq.com/n/ryqq/toplist/33u&   re:巅峰榜·欧美 \d{4}-\d{2}-\d{2}z$md5:4def03b60d3644be4c9a36f21fd33857r   z#https://y.qq.com/n/ryqq/toplist/106Z106u"   re:韩国Mnet榜 \d{4}-\d{2}-\d{2}z$md5:cb84b325215e1d21708c615cac82a6e7rc   c                 C   sT   |  |}| jd|dd|ddd}| j| |d|tt|dd	d
it|ddS )Nz2http://i.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcgzDownload toplist pageZtoplistr3   )typeZtopidr5   )r[   r   )r   .r9   )))topinfoZListNameZupdate_timeNr    )r   ro   )Zplaylist_titleZplaylist_description)r   r;   r   r   r	   r   )r   r/   list_idZtoplist_jsonr   r   r   r   |  s$    
 

  zQQMusicToplistIE._real_extractNr   r   r   r   r   r   ]  s4   		r   c                   @   s6   e Zd ZdZdZdZdddddd	d
gZdd ZdS )QQMusicPlaylistIEzqqmusic:playlistu   QQ音乐 - 歌单z2https?://y\.qq\.com/n/ryqq/playlist/(?P<id>[0-9]+)z+https://y.qq.com/n/ryqq/playlist/1374105607Z
1374105607u   易入人心的华语民谣u   民谣的歌曲易于传唱、、歌词朗朗伤口、旋律简单温馨。属于那种才入耳孔。却上心头的感觉。没有太多的复杂情绪。简单而直接地表达乐者的情绪，就是这样的简单才易入人心。r   rk   r   c              
   C   s   |  |}| jd|ddddd|dtd|id}t|dg sdttd	td
d|d|ddd| |d}| j||ft	|dddt
hfdththfdfS )NzDhttp://i.y.qq.com/qzone-music/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcgzDownload list pager   r   )r   r3   utf8ZonlysongZdisstidZReferer)r   r.   r:   cdlistzUnable to get playlist infor   Zsubcode)	from_dictmsgz: r   )r   r   r   .Zdissnamer   r   )r   r;   r   r   r   r   r	   r   r   r   r   r   r   )r   r/   r   Z	list_jsonr   r   r   r   r     s*    
   zQQMusicPlaylistIE._real_extractNr   r   r   r   r   r     s   
r   c                   @   sL   e Zd ZdZdZdZdddddd	d
dddged
dgZdd Zdd Z	dS )QQMusicVideoIEz
qqmusic:mvu   QQ音乐 - MVz2https?://y\.qq\.com/n/ryqq/mv/(?P<id>[0-9A-Za-z]+)z)https://y.qq.com/n/ryqq/mv/002Vsarh3SVU8KZ002Vsarh3SVU8Kmp4z The Chant (Extended Mix / Audio)r   rH   i٪dZ20230709i9  zDuke Dumont)
rI   rJ   rK   rQ   rS   release_timestamprM   rN   rO   
view_count)r/   rV   c                 C   s0   t |ddd ddthfdthfdthfdfS )	Nr   c                 S   s   |d S )Nfreeflow_urlr   r   r   r   r   r     r   z3QQMusicVideoIE._parse_url_formats.<locals>.<lambda>r   r   ZfileSizeZnewFileType)r/   filesizer   )r   r   r   r   )r   Zurl_datar   r   r   _parse_url_formats  s
    
z!QQMusicVideoIE._parse_url_formatsc                 C   s   |  |}| jdd|gddddddd	d
dddddddgddddd|gidd||  d}t|dd|dfdkr~|   || t|dd|fdt|dd|dthfdthfdthfdthfdthfdddthfdthfdfS ) Nzmusic.video.VideoDataZget_video_info_batchZvidr   ZsidZ	cover_picrN   ZsingersZ	video_payhintr   r   r_   r   ZplaycntZpubdateZplay_forbid_reason)Zvidlistrequiredrq   zmusic.stream.MvUrlProxyZ	GetMvUrlsZvids)mvInfomvUrl)r:   r   r9      r   r   .)rK   rQ   rS   r   rN   rO   r   )	r   r?   r   r   Zraise_geo_restrictedr   r   r   r   )r   r/   Zvideo_idZ
video_infor   r   r   r     s\    
             
zQQMusicVideoIE._real_extractN)
r@   rA   rB   r   r   r   r'   r   r   r   r   r   r   r   r     s$   r   )r   r   r3   r*   r(   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   rE   r   r   r   r   r   r   r   r   r   r   <module>   s   8* 'C'.%