o
    i{K                     @   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 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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)getattr_get_cookiesget)selfkeydefault r   L/home/ubuntu/.local/lib/python3.10/site-packages/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  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 )N	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)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_sourcer0   )_download_webpage_search_jsonr
   )r   urlmidr0   webpager   r   r   _download_init_data/   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.fcgcommr      json)cvctformatr#   ),:)
separators)dataheaders)_download_jsonr:   dumpsr%   encode)r   req_dictr5   rB   kwargsr   r   r   _make_fcu_req4   s&   	zQQMusicBaseIE._make_fcu_req)N)T)__name__
__module____qualname__r   r"   r%   propertyr(   staticmethodr.   r7   rH   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	QQMusicIEqqmusicu   QQ音乐z:https?://y\.qq\.com/n/ryqq/songDetail/(?P<id>[0-9A-Za-z]+)z1https://y.qq.com/n/ryqq/songDetail/004Ti8rT003TaZ d7adc5c438d12e2cb648cca81593fd47004Ti8rT003TaZmp3u'   永夜のパレード (永夜的游行)u    幻想遊園郷 -Fantastic Park-20111230i  u   ケーキ姫JUMAPopz$md5:b5261f3d595657ae561e9e6aee7eb7d9iD re:^https?://.*\.jpg(?:$|[#?])zcount:1)idexttitlealbumrelease_datedurationcreatorsgenresdescriptionsize	thumbnail	subtitles)r4   md5	info_dictz1https://y.qq.com/n/ryqq/songDetail/004295Et37taLD 5f1e6cea39e182857da7ffc5ef5e6bb8004295Et37taLDu   可惜没如果u!   新地球 - 人 (Special Edition)20150129i*  	   林俊杰z$md5:f568421ff618d2066e74b65a04149c4e)
rW   rX   rY   rZ   r[   r\   r]   r^   r_   ra   zpremium member only)r4   rc   rd   skipz)There is no mp3-320 version of this song.z1https://y.qq.com/n/ryqq/songDetail/004MsGEo3DdNxV 028aaef1ae13d8a9f4861a92614887f9004MsGEo3DdNxVu   如果u&   新传媒电视连续剧金曲系列II20050626   u	   李季美z$md5:fc711212aa623b28534954dc4bd67385ir5 rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   )noter4   rc   rd   zlyrics not in .lrc formatz1https://y.qq.com/n/ryqq/songDetail/001JyApY11tIp6001JyApY11tIp6zShadows Over Transylvania19970225zDark Funeralz$md5:c9b20210587cbcd6836a1c597bab4525)rW   rX   rY   r[   creatorr_   ra   skip_downloadTzno longer available)ro   r4   rd   paramsri   flacF000<   )nameprefixrX   
preferenceapeA0002   320mp3M800(   i@  )rx   ry   rX   rz   abr128mp3M500      96aacC400m4a   `   48aacC2000   )rv   r|   r   r   r   r   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r~td|pzd g }t
|ddd fd!d"fD ]A}t
|d#thd$d" hf}| j|pi }	|	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tfd6d7d" hfd8d9d%thfd:thtfd;thfd<t
|d=d>thfdd?d@d9dAthfddBd@d9dAthtfdCfddD}|rWdEdF|dGgi|dH< t|dI|dJdK|dI< |S )LNFr/   infozmusic.pf_song_detail_svrget_song_detail_yqqr   )song_mid	song_typemodulemethodparamzDownloading song inforo   rA   
track_infofile	media_midzvkey.GetVkeyServer
CgiGetVkeyr   20c                    s&   g | ]}|d     d|d  qS )ry   .rX   r   ).0f)r   r   r   
<listcomp>   s   & z+QQMusicIE._real_extract.<locals>.<listcomp>)guidsongmidsongtyper#   	loginflagplatformfilenamez!music.musichallSong.PlayLyricInfoGetPlayLyricInfosongMID)req_1req_2zDownloading formats and lyric)ro   rB   r   codez+Failed to download format info, error code unknown
midurlinfoc                    s   |d  ko	|d S )Nr   purlr   _v)r5   r   r   <lambda>   s    z)QQMusicIE._real_extract.<locals>.<lambda>r   c                 S   s   | d d S )N   r   xr   r   r   r      s    rx   z https://dl.stream.qqmusic.qq.comr   size_rz   r   rX   none)r4   r=   	format_idr`   qualityr   rX   vcodec)r   r   z Failed to download lyric, error r   lyricc                 S   s   t | dS )Nzutf-8)base64	b64decodedecoder   r   r   r   r          rW   formatsrY   rZ   time_publicc                 S   s   |  ddpd S )N-r   )replacer   r   r   r   r      r   singer.subtitleinterval)rY   rZ   r[   r]   	alt_titler\   detailpicurlintrocontentr   genre)ra   r_   r^   )get_alloriginlrc)rX   rA   rb   r_   
delim)	_match_idr7   rH   strr.   len_FORMATSr%   valuesgeo_verification_headersr   r)   r   r   appendr   r   r(   raise_login_requiredreport_warningfilterr   allr	   )r   r4   	init_data	info_datarA   r   r   
media_info
format_keyformat_infor   lrc_contentrd   r   )r   r5   r   _real_extract   s   
	








zQQMusicIE._real_extractN)	rI   rJ   rK   IE_NAMEIE_DESC
_VALID_URL_TESTSr   r   r   r   r   r   rN   A   s    	C	rN   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/001BLpXF2DyJe2001BLpXF2DyJe2rh   z$md5:10624ce73b06fa400bc846f59b0305farV   )rW   rY   r_   ra   d   )r4   rd   playlist_mincountz-https://y.qq.com/n/ryqq/singer/000Q00f213YzNV000Q00f213YzNVu	   桃几OvOu5   小破站小唱见~希望大家喜欢听我唱歌~！   rd   0016cvsy02mmClrR   u   群青u   桃几2021年翻唱集20210913   rU   z$md5:4296005a04edcb5cdbe0889d5055a7aei< rn   )r4   rd   playlist_countplaylistr}   c              	   #   sZ     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_svrget_singer_detail_infor   )sort	singermidsinnumr   zDownloading page r   rA   songlist.c                    s$     d| d  t| d | dS )N#https://y.qq.com/n/ryqq/songDetail/r5   rY   )
url_resultrN   r   r   r$   r   r   r     s    z-QQMusicSingerIE._fetch_page.<locals>.<lambda>)rH   r   )r   r5   	page_sizepage_numrA   r   r$   r   _fetch_page  s   
(	zQQMusicSingerIE._fetch_pagec                 C   sn   |  |}| j||dd}| jtt| j|| j| j|fi t|dddt	hfddt	hfddt
hfd	fS )
NFr/   singerDetail
basic_inforx   ex_infodescpic)rY   r_   ra   )r   r7   playlist_resultr   	functoolspartialr   
_PAGE_SIZEr   r   r   )r   r4   r5   r   r   r   r   r     s   



zQQMusicSingerIE._real_extractN)
rI   rJ   rK   r   r   r   r   r  r   r   r   r   r   r   r      sL    
#r   c                   @   s   e Zd Zdd ZdS )QQPlaylistBaseIEc              	   c   sD    t ||D ]}|d}|sq| d| t||dV  qd S )Nr   r   songname)r   r   r   rN   )r   	info_jsonpathsongr   r   r   r   _extract_entries+  s   
z!QQPlaylistBaseIE._extract_entriesN)rI   rJ   rK   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/000gXCTb2AhRR1000gXCTb2AhRR1u   我们都是这样长大的z$md5:179c5dce203a5931970d306aa9607ea6rW   rY   r_   r   r4   rd   r   z2https://y.qq.com/n/ryqq/albumDetail/002Y5a3b3AlCu3002Y5a3b3AlCu3u   그리고…z$md5:a48823755615508a95080e81b51ba729   c                 C   s`   |  |}| jd|d|dddd }| |d}| j||fi 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 pager:   )albummidr=   )queryrA   )list.rx   r  rY   r_   )r   rC   r  r  r   r   strip)r   r4   r5   
album_jsonentriesr   r   r   r   L  s   

zQQMusicAlbumIE._real_extractNrI   rJ   rK   r   r   r   r   r   r   r   r   r   r  5  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/123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/106106u"   re:韩国Mnet榜 \d{4}-\d{2}-\d{2}z$md5:cb84b325215e1d21708c615cac82a6e7r}   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 pagetoplistr:   )typetopidr=   )ro   r  )r   .rA   )))topinfoListNameupdate_timeNr    )r$  r   )playlist_titleplaylist_description)r   rC   r  r  r	   r   )r   r4   list_idtoplist_jsonr   r   r   r   {  s   

zQQMusicToplistIE._real_extractNr  r   r   r   r   r  \  s6    		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/1374105607
1374105607u   易入人心的华语民谣u   民谣的歌曲易于传唱、、歌词朗朗伤口、旋律简单温馨。属于那种才入耳孔。却上心头的感觉。没有太多的复杂情绪。简单而直接地表达乐者的情绪，就是这样的简单才易入人心。r  r   r  c              
   C   s   |  |}| jd|ddddd|dtd|id}t|dg s2ttd	td
d|d|ddd| |d}| j||fi t	|dddt
hfd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"  r:   utf8onlysongdisstidReferer)r  r1   rB   cdlistzUnable to get playlist infor   subcode)	from_dictmsgz: r   )r2  r   r   .dissnamer  r  )r   rC   r   r   r   r   r	   r  r  r   r   r   )r   r4   r*  	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/002Vsarh3SVU8K002Vsarh3SVU8Kmp4z The Chant (Extended Mix / Audio)r   rV   i٪d20230709i9  zDuke Dumont)
rW   rX   rY   r_   ra   release_timestampr[   r\   r]   
view_count)r4   rd   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     s    z3QQMusicVideoIE._parse_url_formats.<locals>.<lambda>r>  r   fileSizenewFileType)r4   filesizer   )r   r   r   r   )r   url_datar   r   r   _parse_url_formats  s
   

z!QQMusicVideoIE._parse_url_formatsc                 C   s   |  |}| jdd|gg dddddd|gidd	||  d
}t|dd|dfdkr2|   || 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.VideoDataget_video_info_batch)vidr"  sid	cover_picr\   singers	video_payhintr   r5  rx   r  playcntpubdateplay_forbid_reason)vidlistrequiredr   zmusic.stream.MvUrlProxy	GetMvUrlsvids)mvInfomvUrl)rB   rR  rA   rM     rS  r   rx   r  rG  rL  r\   rH  .rK  )rY   r_   ra   r<  r\   r]   r=  )	r   rH   r   r   raise_geo_restrictedrC  r   r   r   )r   r4   video_id
video_infor   r   r   r     s<   

zQQMusicVideoIE._real_extractN)
rI   rJ   rK   r   r   r   r)   r   rC  r   r   r   r   r   r8    s&    r8  )r   r  r:   r,   r*   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   rN   r   r  r  r  r,  r8  r   r   r   r   <module>   s     4* 'C'.%