parent
1e8de9f72a
commit
d902c8e2af
78
scdl/scdl.py
78
scdl/scdl.py
|
@ -35,7 +35,6 @@ Options:
|
||||||
--hide-progress Hide the wget progress bar
|
--hide-progress Hide the wget progress bar
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
@ -77,7 +76,9 @@ url = {
|
||||||
'all': ('https://api-v2.soundcloud.com/profile/soundcloud:users:{0}?'
|
'all': ('https://api-v2.soundcloud.com/profile/soundcloud:users:{0}?'
|
||||||
'limit=200&offset={1}'),
|
'limit=200&offset={1}'),
|
||||||
'playlists': ('https://api.soundcloud.com/users/{0}/playlists?'
|
'playlists': ('https://api.soundcloud.com/users/{0}/playlists?'
|
||||||
'limit=200&offset={1}')
|
'limit=200&offset={1}'),
|
||||||
|
'resolve': ('https://api.soundcloud.com/resolve?url={0}'),
|
||||||
|
'me': ('https://api.soundcloud.com/me?oauth_token={0}')
|
||||||
}
|
}
|
||||||
|
|
||||||
client = soundcloud.Client(client_id=scdl_client_id)
|
client = soundcloud.Client(client_id=scdl_client_id)
|
||||||
|
@ -163,12 +164,16 @@ def get_item(track_url):
|
||||||
Fetches metadata for an track or playlist
|
Fetches metadata for an track or playlist
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
item = client.get('/resolve', url=track_url)
|
item_url = url['resolve'].format(track_url)
|
||||||
|
item_url = '{0}&client_id={1}'.format(item_url, scdl_client_id)
|
||||||
|
r = requests.get(item_url)
|
||||||
|
item = r.json()
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.error('Error resolving url, retrying...')
|
logger.error('Error resolving url, retrying...')
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
try:
|
try:
|
||||||
item = client.get('/resolve', url=track_url)
|
r = requests.get(item_url)
|
||||||
|
item = r.json()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error('Could not resolve url {0}'.format(track_url))
|
logger.error('Could not resolve url {0}'.format(track_url))
|
||||||
logger.exception(e)
|
logger.exception(e)
|
||||||
|
@ -183,20 +188,18 @@ def parse_url(track_url):
|
||||||
"""
|
"""
|
||||||
global arguments
|
global arguments
|
||||||
item = get_item(track_url)
|
item = get_item(track_url)
|
||||||
|
logger.debug(item)
|
||||||
if not item:
|
if not item:
|
||||||
return
|
return
|
||||||
elif isinstance(item, soundcloud.resource.ResourceList):
|
elif isinstance(item, soundcloud.resource.ResourceList):
|
||||||
download_all_of_a_page(item)
|
download_all_of_a_page(item)
|
||||||
elif item.kind == 'track':
|
elif item['kind'] == 'track':
|
||||||
logger.info('Found a track')
|
logger.info('Found a track')
|
||||||
track = json.loads(item.raw_data)
|
download_track(item)
|
||||||
download_track(track)
|
elif item['kind'] == 'playlist':
|
||||||
elif item.kind == 'playlist':
|
|
||||||
logger.info('Found a playlist')
|
logger.info('Found a playlist')
|
||||||
playlist = json.loads(item.raw_data)
|
download_playlist(item)
|
||||||
download_playlist(playlist)
|
elif item['kind'] == 'user':
|
||||||
elif item.kind == 'user':
|
|
||||||
logger.info('Found a user profile')
|
logger.info('Found a user profile')
|
||||||
if arguments['-f']:
|
if arguments['-f']:
|
||||||
download(item, 'favorites', 'likes')
|
download(item, 'favorites', 'likes')
|
||||||
|
@ -216,15 +219,16 @@ def who_am_i():
|
||||||
"""
|
"""
|
||||||
display to who the current token correspond, check if the token is valid
|
display to who the current token correspond, check if the token is valid
|
||||||
"""
|
"""
|
||||||
global client
|
me = url['me'].format(token)
|
||||||
client = soundcloud.Client(access_token=token, client_id=scdl_client_id)
|
me = '{0}&client_id={1}'.format(me, scdl_client_id)
|
||||||
|
r = requests.get(me)
|
||||||
|
current_user = r.json()
|
||||||
|
logger.debug(me)
|
||||||
|
|
||||||
try:
|
if r.status_code == 401:
|
||||||
current_user = client.get('/me')
|
|
||||||
except:
|
|
||||||
logger.error('Invalid token...')
|
logger.error('Invalid token...')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
logger.info('Hello {0.username}!'.format(current_user))
|
logger.info('Hello {0}!'.format(current_user['username']))
|
||||||
logger.newline()
|
logger.newline()
|
||||||
return current_user
|
return current_user
|
||||||
|
|
||||||
|
@ -233,7 +237,6 @@ def download(user, dl_type, name):
|
||||||
"""
|
"""
|
||||||
Download all items of a user
|
Download all items of a user
|
||||||
"""
|
"""
|
||||||
user = json.loads(user.raw_data)
|
|
||||||
username = user['username']
|
username = user['username']
|
||||||
user_id = user['id']
|
user_id = user['id']
|
||||||
logger.info(
|
logger.info(
|
||||||
|
@ -318,45 +321,20 @@ def download_all_of_a_page(tracks):
|
||||||
download_track(track)
|
download_track(track)
|
||||||
|
|
||||||
|
|
||||||
def alternative_download(track):
|
|
||||||
"""
|
|
||||||
OBSOLETE ?
|
|
||||||
Not sure if the url is sill correct...
|
|
||||||
"""
|
|
||||||
logger.debug('alternative_download used')
|
|
||||||
url = ('http://api.soundcloud.com/i1/tracks/{0.id}/streams?'
|
|
||||||
'client_id=a3e059563d7fd3372b49b37f00a00bcf').format(track)
|
|
||||||
r = requests.get(url)
|
|
||||||
json_data = r.json()
|
|
||||||
try:
|
|
||||||
mp3_url = json_data['http_mp3_128_url']
|
|
||||||
except KeyError:
|
|
||||||
logger.error(
|
|
||||||
'http_mp3_128_url not found in json response, report to developer.'
|
|
||||||
)
|
|
||||||
mp3_url = None
|
|
||||||
return mp3_url
|
|
||||||
|
|
||||||
|
|
||||||
def download_track(track, playlist_name=None, playlist_file=None):
|
def download_track(track, playlist_name=None, playlist_file=None):
|
||||||
"""
|
"""
|
||||||
Downloads a track
|
Downloads a track
|
||||||
"""
|
"""
|
||||||
global arguments
|
global arguments
|
||||||
|
|
||||||
|
title = track['title']
|
||||||
|
title = title.encode('utf-8', 'ignore').decode(sys.stdout.encoding)
|
||||||
if track['streamable']:
|
if track['streamable']:
|
||||||
try:
|
url = '{0}?client_id={1}'.format(track['stream_url'], scdl_client_id)
|
||||||
stream_url = client.get(track['stream_url'], allow_redirects=False)
|
|
||||||
url = stream_url.location
|
|
||||||
except requests.exceptions.HTTPError:
|
|
||||||
url = alternative_download(track)
|
|
||||||
else:
|
else:
|
||||||
title = track['title']
|
|
||||||
logger.error('{0} is not streamable...'.format(title))
|
logger.error('{0} is not streamable...'.format(title))
|
||||||
logger.newline()
|
logger.newline()
|
||||||
return
|
return
|
||||||
title = track['title']
|
|
||||||
title = title.encode('utf-8', 'ignore').decode(sys.stdout.encoding)
|
|
||||||
logger.info('Downloading {0}'.format(title))
|
logger.info('Downloading {0}'.format(title))
|
||||||
|
|
||||||
# filename
|
# filename
|
||||||
|
@ -387,6 +365,7 @@ def download_track(track, playlist_name=None, playlist_file=None):
|
||||||
|
|
||||||
# Download
|
# Download
|
||||||
if not os.path.isfile(filename):
|
if not os.path.isfile(filename):
|
||||||
|
logger.debug(url)
|
||||||
r = requests.get(url, stream=True)
|
r = requests.get(url, stream=True)
|
||||||
temp = tempfile.NamedTemporaryFile(delete=False)
|
temp = tempfile.NamedTemporaryFile(delete=False)
|
||||||
with temp as f:
|
with temp as f:
|
||||||
|
@ -459,11 +438,6 @@ def signal_handler(signal, frame):
|
||||||
"""
|
"""
|
||||||
Handle Keyboardinterrupt
|
Handle Keyboardinterrupt
|
||||||
"""
|
"""
|
||||||
time.sleep(1)
|
|
||||||
for path in os.listdir():
|
|
||||||
if not os.path.isdir(path) and '.tmp' in path:
|
|
||||||
os.remove(path)
|
|
||||||
|
|
||||||
logger.newline()
|
logger.newline()
|
||||||
logger.info('Good bye!')
|
logger.info('Good bye!')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
Loading…
Reference in New Issue