[soundcloud] Fix download URL with private tracks
authorTatsuyuki Ishi <ishitatsuyuki@gmail.com>
Fri, 1 Sep 2017 08:08:24 +0000 (17:08 +0900)
committerSergey M․ <dstftw@gmail.com>
Sun, 3 Sep 2017 09:28:34 +0000 (16:28 +0700)
youtube_dl/extractor/soundcloud.py

index 2e52e092b0d1193c0f55a718262b1d308408888b..23dcac803252939dae0b2c56b011c1da6fa9e6a7 100644 (file)
@@ -1,8 +1,8 @@
 # coding: utf-8
 from __future__ import unicode_literals
 
-import re
 import itertools
+import re
 
 from .common import (
     InfoExtractor,
@@ -17,7 +17,7 @@ from ..utils import (
     ExtractorError,
     int_or_none,
     unified_strdate,
-)
+    update_url_query)
 
 
 class SoundcloudIE(InfoExtractor):
@@ -160,11 +160,13 @@ class SoundcloudIE(InfoExtractor):
             'license': info.get('license'),
         }
         formats = []
+        query = {'client_id': self._CLIENT_ID}
+        if secret_token is not None:
+            query['secret_token'] = secret_token
         if info.get('downloadable', False):
             # We can build a direct link to the song
-            format_url = (
-                'https://api.soundcloud.com/tracks/{0}/download?client_id={1}'.format(
-                    track_id, self._CLIENT_ID))
+            format_url = update_url_query(
+                'https://api.soundcloud.com/tracks/{0}/download'.format(track_id), query)
             formats.append({
                 'format_id': 'download',
                 'ext': info.get('original_format', 'mp3'),
@@ -176,10 +178,7 @@ class SoundcloudIE(InfoExtractor):
         # We have to retrieve the url
         format_dict = self._download_json(
             'https://api.soundcloud.com/i1/tracks/%s/streams' % track_id,
-            track_id, 'Downloading track url', query={
-                'client_id': self._CLIENT_ID,
-                'secret_token': secret_token,
-            })
+            track_id, 'Downloading track url', query=query)
 
         for key, stream_url in format_dict.items():
             abr = int_or_none(self._search_regex(
@@ -216,7 +215,7 @@ class SoundcloudIE(InfoExtractor):
             # cannot be always used, sometimes it can give an HTTP 404 error
             formats.append({
                 'format_id': 'fallback',
-                'url': info['stream_url'] + '?client_id=' + self._CLIENT_ID,
+                'url': update_url_query(info['stream_url'], query),
                 'ext': ext,
             })