From e9905f92ec51b96dc1ca7d7b2c525d364216b73d Mon Sep 17 00:00:00 2001 From: c-basalt <117849907+c-basalt@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:19:51 -0400 Subject: [PATCH 1/3] Update neteasemusic.py --- yt_dlp/extractor/neteasemusic.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/yt_dlp/extractor/neteasemusic.py b/yt_dlp/extractor/neteasemusic.py index a759da214..e899e3003 100644 --- a/yt_dlp/extractor/neteasemusic.py +++ b/yt_dlp/extractor/neteasemusic.py @@ -76,19 +76,21 @@ def _download_eapi_json(self, path, video_id, query_body, headers={}, **kwargs): **headers, }, **kwargs) - def _call_player_api(self, song_id, level): + def _call_player_api(self, song_id, level, headers={}): return self._download_eapi_json( '/song/enhance/player/url/v1', song_id, - {'ids': f'[{song_id}]', 'level': level, 'encodeType': 'flac'}, - note=f'Downloading song URL info: level {level}') + {'ids': f'[{song_id}]', 'level': level, 'encodeType': 'flac'}, headers=headers, note=f'Downloading song URL info: level {level}') - def _extract_formats(self, info): + def _extract_formats(self, info, try_geo_bypass=False): formats = [] song_id = info['id'] + headers = {'X-Real-IP': '118.88.88.88'} if try_geo_bypass else {} for level in self._LEVELS: song = traverse_obj( - self._call_player_api(song_id, level), ('data', lambda _, v: url_or_none(v['url']), any)) + self._call_player_api(song_id, level, headers=headers), ('data', lambda _, v: url_or_none(v['url']), any)) if not song: + if not try_geo_bypass: + return self._extract_formats(info, try_geo_bypass=True) break # Media is not available due to removal or geo-restriction actual_level = song.get('level') if actual_level and actual_level != level: From ceac9f669d8c4d1a65d64fda253fcf0ab8e6d25c Mon Sep 17 00:00:00 2001 From: c-basalt <117849907+c-basalt@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:21:43 -0400 Subject: [PATCH 2/3] Update neteasemusic.py --- yt_dlp/extractor/neteasemusic.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/yt_dlp/extractor/neteasemusic.py b/yt_dlp/extractor/neteasemusic.py index e899e3003..4865331ba 100644 --- a/yt_dlp/extractor/neteasemusic.py +++ b/yt_dlp/extractor/neteasemusic.py @@ -79,7 +79,8 @@ def _download_eapi_json(self, path, video_id, query_body, headers={}, **kwargs): def _call_player_api(self, song_id, level, headers={}): return self._download_eapi_json( '/song/enhance/player/url/v1', song_id, - {'ids': f'[{song_id}]', 'level': level, 'encodeType': 'flac'}, headers=headers, note=f'Downloading song URL info: level {level}') + {'ids': f'[{song_id}]', 'level': level, 'encodeType': 'flac'}, + headers=headers, note=f'Downloading song URL info: level {level}') def _extract_formats(self, info, try_geo_bypass=False): formats = [] @@ -88,10 +89,10 @@ def _extract_formats(self, info, try_geo_bypass=False): for level in self._LEVELS: song = traverse_obj( self._call_player_api(song_id, level, headers=headers), ('data', lambda _, v: url_or_none(v['url']), any)) - if not song: + if not song: # Media is not available due to removal or geo-restriction if not try_geo_bypass: return self._extract_formats(info, try_geo_bypass=True) - break # Media is not available due to removal or geo-restriction + break actual_level = song.get('level') if actual_level and actual_level != level: if level in ('lossless', 'jymaster'): From 3da3733d0623581f4da8aebf6d1dba1535f8ffcb Mon Sep 17 00:00:00 2001 From: c-basalt <117849907+c-basalt@users.noreply.github.com> Date: Mon, 30 Sep 2024 02:41:09 -0400 Subject: [PATCH 3/3] use built-in geo handler --- yt_dlp/extractor/neteasemusic.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/yt_dlp/extractor/neteasemusic.py b/yt_dlp/extractor/neteasemusic.py index 4865331ba..c8aaeccb8 100644 --- a/yt_dlp/extractor/neteasemusic.py +++ b/yt_dlp/extractor/neteasemusic.py @@ -34,7 +34,6 @@ class NetEaseMusicBaseIE(InfoExtractor): 'sky', # SVIP tier; 沉浸环绕声 (Surround Audio); flac ) _API_BASE = 'http://music.163.com/api/' - _GEO_BYPASS = False @staticmethod def _kilo_or_none(value): @@ -68,6 +67,8 @@ def _download_eapi_json(self, path, video_id, query_body, headers={}, **kwargs): 'MUSIC_U': ('MUSIC_U', {lambda i: i.value}), }), } + if self._x_forwarded_for_ip: + headers.setdefault('X-Real-IP', self._x_forwarded_for_ip) return self._download_json( urljoin('https://interface3.music.163.com/', f'/eapi{path}'), video_id, data=self._create_eapi_cipher(f'/api{path}', query_body, cookies), headers={ @@ -76,23 +77,20 @@ def _download_eapi_json(self, path, video_id, query_body, headers={}, **kwargs): **headers, }, **kwargs) - def _call_player_api(self, song_id, level, headers={}): + def _call_player_api(self, song_id, level): return self._download_eapi_json( '/song/enhance/player/url/v1', song_id, {'ids': f'[{song_id}]', 'level': level, 'encodeType': 'flac'}, - headers=headers, note=f'Downloading song URL info: level {level}') + note=f'Downloading song URL info: level {level}') - def _extract_formats(self, info, try_geo_bypass=False): + def _extract_formats(self, info): formats = [] song_id = info['id'] - headers = {'X-Real-IP': '118.88.88.88'} if try_geo_bypass else {} for level in self._LEVELS: song = traverse_obj( - self._call_player_api(song_id, level, headers=headers), ('data', lambda _, v: url_or_none(v['url']), any)) - if not song: # Media is not available due to removal or geo-restriction - if not try_geo_bypass: - return self._extract_formats(info, try_geo_bypass=True) - break + self._call_player_api(song_id, level), ('data', lambda _, v: url_or_none(v['url']), any)) + if not song: + break # Media is not available due to removal or geo-restriction actual_level = song.get('level') if actual_level and actual_level != level: if level in ('lossless', 'jymaster'):