about summary refs log tree commit diff
path: root/youtube_dl/extractor/neteasemusic.py
diff options
context:
space:
mode:
authorping <lipng.ong@gmail.com>2016-01-17 07:48:46 +0800
committerping <lipng.ong@gmail.com>2016-01-17 07:48:46 +0800
commite0ef13ddebfab39d8c59c8cd9c11882cfc604070 (patch)
tree858d609a24d617a1ecaa0c65671d5fbdf0339fd1 /youtube_dl/extractor/neteasemusic.py
parent3a0a78731b5223b232beaabc3cdc771b9cebb078 (diff)
downloadyoutube-dl-e0ef13ddebfab39d8c59c8cd9c11882cfc604070.tar.gz
youtube-dl-e0ef13ddebfab39d8c59c8cd9c11882cfc604070.tar.xz
youtube-dl-e0ef13ddebfab39d8c59c8cd9c11882cfc604070.zip
[neteasemusic] Fallback to alt hosts if m5.music.126.net doesn't work
Diffstat (limited to 'youtube_dl/extractor/neteasemusic.py')
-rw-r--r--youtube_dl/extractor/neteasemusic.py35
1 files changed, 22 insertions, 13 deletions
diff --git a/youtube_dl/extractor/neteasemusic.py b/youtube_dl/extractor/neteasemusic.py
index 848ebdea0..435cd8e2e 100644
--- a/youtube_dl/extractor/neteasemusic.py
+++ b/youtube_dl/extractor/neteasemusic.py
@@ -32,23 +32,32 @@ class NetEaseMusicBaseIE(InfoExtractor):
         result = b64encode(m.digest()).decode('ascii')
         return result.replace('/', '_').replace('+', '-')
 
-    @classmethod
-    def extract_formats(cls, info):
+    def extract_formats(self, info):
         formats = []
-        for song_format in cls._FORMATS:
+        for song_format in self._FORMATS:
             details = info.get(song_format)
             if not details:
                 continue
-            formats.append({
-                'url': 'http://203.130.59.9/m1.music.126.net/%s/%s.%s' %
-                       (cls._encrypt(details['dfsId']), details['dfsId'],
-                        details['extension']),
-                'ext': details.get('extension'),
-                'abr': details.get('bitrate', 0) / 1000,
-                'format_id': song_format,
-                'filesize': details.get('size'),
-                'asr': details.get('sr')
-            })
+            song_file_path = '/%s/%s.%s' % (
+                self._encrypt(details['dfsId']), details['dfsId'], details['extension'])
+
+            # 203.130.59.9, 124.40.233.182, 115.231.74.139, etc is a reverse proxy-like feature
+            # from NetEase's CDN provider that can be used if m5.music.126.net does not
+            # work, especially for users outside of Mainland China
+            # via: https://github.com/JixunMoe/unblock-163/issues/3#issuecomment-163115880
+            for host in ('http://m5.music.126.net', 'http://115.231.74.139/m1.music.126.net',
+                         'http://124.40.233.182/m1.music.126.net', 'http://203.130.59.9/m1.music.126.net'):
+                song_url = host + song_file_path
+                if self._is_valid_url(song_url, info['id'], 'song'):
+                    formats.append({
+                        'url': song_url,
+                        'ext': details.get('extension'),
+                        'abr': details.get('bitrate', 0) / 1000,
+                        'format_id': song_format,
+                        'filesize': details.get('size'),
+                        'asr': details.get('sr')
+                    })
+                    break
         return formats
 
     @classmethod