[netease] Impove error handling (#31303)
* add warnings for users outside of China * skip empty song urls Co-authored-by: dirkf <fieldhouse@gmx.net>
This commit is contained in:
parent
502cefa41f
commit
d25cf62086
@ -20,6 +20,7 @@ from ..compat import (
|
|||||||
from ..utils import (
|
from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
bytes_to_intlist,
|
bytes_to_intlist,
|
||||||
|
error_to_compat_str,
|
||||||
float_or_none,
|
float_or_none,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
intlist_to_bytes,
|
intlist_to_bytes,
|
||||||
@ -94,17 +95,23 @@ class NetEaseMusicBaseIE(InfoExtractor):
|
|||||||
url = 'https://interface3.music.163.com/eapi/song/enhance/player/url'
|
url = 'https://interface3.music.163.com/eapi/song/enhance/player/url'
|
||||||
data, headers = self.make_player_api_request_data_and_headers(song_id, bitrate)
|
data, headers = self.make_player_api_request_data_and_headers(song_id, bitrate)
|
||||||
try:
|
try:
|
||||||
return self._download_json(
|
msg = 'empty result'
|
||||||
|
result = self._download_json(
|
||||||
url, song_id, data=data.encode('ascii'), headers=headers)
|
url, song_id, data=data.encode('ascii'), headers=headers)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
except ExtractorError as e:
|
except ExtractorError as e:
|
||||||
if type(e.cause) in (ValueError, TypeError):
|
if type(e.cause) in (ValueError, TypeError):
|
||||||
# JSON load failure
|
# JSON load failure
|
||||||
raise
|
raise
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
msg = error_to_compat_str(e)
|
||||||
|
self.report_warning('%s API call (%s) failed: %s' % (
|
||||||
|
song_id, bitrate, msg))
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def extract_formats(self, info):
|
def extract_formats(self, info):
|
||||||
|
err = 0
|
||||||
formats = []
|
formats = []
|
||||||
song_id = info['id']
|
song_id = info['id']
|
||||||
for song_format in self._FORMATS:
|
for song_format in self._FORMATS:
|
||||||
@ -116,6 +123,8 @@ class NetEaseMusicBaseIE(InfoExtractor):
|
|||||||
data = self._call_player_api(song_id, bitrate)
|
data = self._call_player_api(song_id, bitrate)
|
||||||
for song in try_get(data, lambda x: x['data'], list) or []:
|
for song in try_get(data, lambda x: x['data'], list) or []:
|
||||||
song_url = try_get(song, lambda x: x['url'])
|
song_url = try_get(song, lambda x: x['url'])
|
||||||
|
if not song_url:
|
||||||
|
continue
|
||||||
if self._is_valid_url(song_url, info['id'], 'song'):
|
if self._is_valid_url(song_url, info['id'], 'song'):
|
||||||
formats.append({
|
formats.append({
|
||||||
'url': song_url,
|
'url': song_url,
|
||||||
@ -125,6 +134,19 @@ class NetEaseMusicBaseIE(InfoExtractor):
|
|||||||
'filesize': int_or_none(song.get('size')),
|
'filesize': int_or_none(song.get('size')),
|
||||||
'asr': int_or_none(details.get('sr')),
|
'asr': int_or_none(details.get('sr')),
|
||||||
})
|
})
|
||||||
|
elif err == 0:
|
||||||
|
err = try_get(song, lambda x: x['code'], int)
|
||||||
|
|
||||||
|
if not formats:
|
||||||
|
msg = 'No media links found'
|
||||||
|
if err != 0 and (err < 200 or err >= 400):
|
||||||
|
raise ExtractorError(
|
||||||
|
'%s (site code %d)' % (msg, err, ), expected=True)
|
||||||
|
else:
|
||||||
|
self.raise_geo_restricted(
|
||||||
|
msg + ': probably this video is not available from your location due to geo restriction.',
|
||||||
|
countries=['CN'])
|
||||||
|
|
||||||
return formats
|
return formats
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
Loading…
Reference in New Issue
Block a user