From c11970ed72d2df9a58910d867c111c5926b10b84 Mon Sep 17 00:00:00 2001 From: xuehongzhi Date: Fri, 16 Mar 2018 23:00:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- youtube_dl/extractor/qqmusic.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/youtube_dl/extractor/qqmusic.py b/youtube_dl/extractor/qqmusic.py index 084308aeb..bb1e7a535 100644 --- a/youtube_dl/extractor/qqmusic.py +++ b/youtube_dl/extractor/qqmusic.py @@ -109,16 +109,22 @@ class QQMusicIE(InfoExtractor): guid = self.m_r_get_ruin() - vkey = self._download_json( + vkeyinfo = self._download_json( 'http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?json=3&guid=%s' % guid, mid, note='Retrieve vkey', errnote='Unable to get vkey', - transform_source=strip_jsonp)['key'] + transform_source=strip_jsonp) + + try: + vkey = vkeyinfo['key'] + durl = vkeyinfo['sip'][0] + except: + return {} formats = [] for format_id, details in self._FORMATS.items(): formats.append({ - 'url': 'http://cc.stream.qqmusic.qq.com/%s%s.%s?vkey=%s&guid=%s&fromtag=0' - % (details['prefix'], mid, details['ext'], vkey, guid), + 'url': '%s%s%s.%s?vkey=%s&guid=%s' + % (durl, details['prefix'], mid, details['ext'], vkey, guid), 'format': format_id, 'format_id': format_id, 'preference': details['preference'], From ce4c61ed8e9f54d8ac99cd29f0eb7871e69d71e1 Mon Sep 17 00:00:00 2001 From: xuehongzhi Date: Fri, 16 Mar 2018 23:03:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=95=B4=E5=9E=8Bid=E8=BD=AC=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- youtube_dl/YoutubeDL.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 523dd1f7d..ce98ff472 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -2052,7 +2052,7 @@ class YoutubeDL(object): extractor = info_dict.get('ie_key') # key in a playlist if extractor is None: return None # Incomplete video information - return extractor.lower() + ' ' + info_dict['id'] + return extractor.lower() + ' ' + str(info_dict['id']) def in_download_archive(self, info_dict): fn = self.params.get('download_archive') From 5c898cdc0d13dd000540e2d22c9a28c72bc54aae Mon Sep 17 00:00:00 2001 From: xuehongzhi Date: Thu, 9 Aug 2018 23:03:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9qqmusic=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- youtube_dl/extractor/qqmusic.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/youtube_dl/extractor/qqmusic.py b/youtube_dl/extractor/qqmusic.py index bb1e7a535..d3c0b7a67 100644 --- a/youtube_dl/extractor/qqmusic.py +++ b/youtube_dl/extractor/qqmusic.py @@ -63,7 +63,7 @@ class QQMusicIE(InfoExtractor): _FORMATS = { 'mp3-320': {'prefix': 'M800', 'ext': 'mp3', 'preference': 40, 'abr': 320}, 'mp3-128': {'prefix': 'M500', 'ext': 'mp3', 'preference': 30, 'abr': 128}, - 'm4a': {'prefix': 'C200', 'ext': 'm4a', 'preference': 10} + 'm4a': {'prefix': 'C400', 'ext': 'm4a', 'preference': 10} } # Reference: m_r_GetRUin() in top_player.js @@ -73,7 +73,12 @@ class QQMusicIE(InfoExtractor): curMs = int(time.time() * 1000) % 1000 return int(round(random.random() * 2147483647) * curMs % 1E10) + def _is_valid_url(self, url, video_id, item='video', headers={}): + headers = {'Cookie': 'qqmusic_fromtag='} + return super()._is_valid_url(url, video_id, item, headers) + def _real_extract(self, url): + self._set_cookie('.qq.com', 'qqmusic_fromtag', '') mid = self._match_id(url) detail_info_page = self._download_webpage( @@ -109,19 +114,19 @@ class QQMusicIE(InfoExtractor): guid = self.m_r_get_ruin() - vkeyinfo = self._download_json( - 'http://base.music.qq.com/fcgi-bin/fcg_musicexpress.fcg?json=3&guid=%s' % guid, - mid, note='Retrieve vkey', errnote='Unable to get vkey', - transform_source=strip_jsonp) - - try: - vkey = vkeyinfo['key'] - durl = vkeyinfo['sip'][0] - except: - return {} - + durl = 'https://dl.stream.qqmusic.qq.com/' formats = [] for format_id, details in self._FORMATS.items(): + vkurl = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?cid=205361747&uin=0&guid=%s&songmid=%s&filename=%s%s.%s' % (guid, mid, details['prefix'], mid, details['ext']) + vkeyinfo = self._download_json( + vkurl, mid, note='Retrieve vkey', errnote='Unable to get vkey', + transform_source=strip_jsonp) + try: + vkey = vkeyinfo['data']['items'][0]['vkey'] + except: + pass + if not vkey: + continue formats.append({ 'url': '%s%s%s.%s?vkey=%s&guid=%s' % (durl, details['prefix'], mid, details['ext'], vkey, guid), @@ -130,6 +135,7 @@ class QQMusicIE(InfoExtractor): 'preference': details['preference'], 'abr': details.get('abr'), }) + print(formats) self._check_formats(formats, mid) self._sort_formats(formats) @@ -213,6 +219,7 @@ class QQMusicSingerIE(QQPlaylistBaseIE): } def _real_extract(self, url): + print('url=', url) mid = self._match_id(url) entries = self.get_entries_from_page(mid)