Merge pull request #58 from davidfischer-ch/master

Replace custom logging by Python stdlib logging
master
Ronan Nello 2015-05-16 12:43:49 +02:00
commit 06689930dd
5 changed files with 117 additions and 77 deletions

10
AUTHORS Normal file
View File

@ -0,0 +1,10 @@
Main Developers
===============
* @FlyinGrub
* David Fischer @davidfischer-ch
Contributors
============
* TODO

View File

@ -1,3 +1,5 @@
# -*- encoding: utf-8 -*-
"""Python Soundcloud Music Downloader."""
__version__ = 'v1.3.2'

View File

@ -1,4 +1,6 @@
#!/usr/bin/python3
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
"""scdl allow you to download music from soundcloud
Usage:
@ -29,11 +31,13 @@ Options:
--error Only print debug information (Error/Warning)
--debug Print every information and
"""
from docopt import docopt
from termcolor import colored
import configparser
from scdl import __version__
from __future__ import absolute_import, division, print_function, unicode_literals
from docopt import docopt
import configparser
import logging
import warnings
import os
import signal
@ -48,7 +52,15 @@ from requests.exceptions import HTTPError
import mutagen
log_verbosity = 1 # (0 = Error ; 1 = Error && Info ; 2 = Debug && Error && Info)
from scdl import __version__
from scdl import utils
logging.basicConfig(level=logging.INFO, format='%(asctime)-15s %(name)-5s %(levelname)-8s %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.addFilter(utils.ColorizeFilter())
logger.newline = print
arguments = None
token = ''
path = ''
@ -58,24 +70,12 @@ scdl_client_id = '95a4c0ef214f2a4a0852142807b54b35'
client = soundcloud.Client(client_id=scdl_client_id)
def log(str, strverbosity=1): # strverbosity (0 = Error ; 1 = Info ; 2 = Debug)
global log_verbosity
if log_verbosity >= strverbosity:
if strverbosity == 0:
print(colored(str, 'red'))
elif strverbosity == 1:
print(colored(str, 'white'))
elif strverbosity == 2:
print(colored(str, 'yellow'))
def main():
"""
Main function, call parse_url
"""
signal.signal(signal.SIGINT, signal_handler)
global offset
global log_verbosity
global arguments
# import conf file
@ -85,18 +85,18 @@ def main():
arguments = docopt(__doc__, version=__version__)
if arguments["--debug"]:
log_verbosity = 2
logger.level = logging.DEBUG
elif arguments["--error"]:
log_verbosity = 0
logger.level = logging.ERROR
log("Soundcloud Downloader", strverbosity=1)
log(arguments, strverbosity=2)
logger.info("Soundcloud Downloader")
logger.debug(arguments)
if arguments["-o"] is not None:
try:
offset = int(arguments["-o"])
except:
log('Offset should be an Integer...', strverbosity=0)
logger.error('Offset should be an Integer...')
sys.exit()
if arguments["--hidewarnings"]:
@ -106,11 +106,11 @@ def main():
if os.path.exists(arguments["--path"]):
os.chdir(arguments["--path"])
else:
log('Invalid path in arguments...', strverbosity=0)
logger.error('Invalid path in arguments...')
sys.exit()
log('Downloading to '+os.getcwd()+'...', strverbosity=2)
logger.debug('Downloading to '+os.getcwd()+'...')
log('', strverbosity=1)
logger.newline()
if arguments["-l"]:
parse_url(arguments["-l"])
elif arguments["me"]:
@ -135,12 +135,12 @@ def get_config():
token = config['scdl']['auth_token']
path = config['scdl']['path']
except:
log('Are you sure scdl.cfg is in $HOME/.config/scdl/ ?', strverbosity=0)
logger.error('Are you sure scdl.cfg is in $HOME/.config/scdl/ ?')
sys.exit()
if os.path.exists(path):
os.chdir(path)
else:
log('Invalid path in scdl.cfg...', strverbosity=0)
logger.error('Invalid path in scdl.cfg...')
sys.exit()
@ -152,13 +152,13 @@ def get_item(track_url):
try:
item = client.get('/resolve', url=track_url)
except Exception:
log('Error resolving url, retrying...', strverbosity=0)
logger.error('Error resolving url, retrying...')
time.sleep(5)
try:
item = client.get('/resolve', url=track_url)
except Exception as e:
log("Could not resolve url " + track_url, strverbosity=0)
log(e, strverbosity=0)
logger.error("Could not resolve url " + track_url)
logger.exception(e)
sys.exit(0)
return item
@ -175,13 +175,13 @@ def parse_url(track_url):
elif isinstance(item, soundcloud.resource.ResourceList):
download_all(item)
elif item.kind == 'track':
log("Found a track", strverbosity=1)
logger.info("Found a track")
download_track(item)
elif item.kind == "playlist":
log("Found a playlist", strverbosity=1)
logger.info("Found a playlist")
download_playlist(item)
elif item.kind == 'user':
log("Found an user profile", strverbosity=1)
logger.info("Found an user profile")
if arguments["-f"]:
download_user_favorites(item)
elif arguments["-t"]:
@ -191,9 +191,9 @@ def parse_url(track_url):
elif arguments["-p"]:
download_user_playlists(item)
else:
log('Please provide a download type...', strverbosity=0)
logger.error('Please provide a download type...')
else:
log("Unknown item type", strverbosity=0)
logger.error("Unknown item type")
def who_am_i():
@ -206,10 +206,10 @@ def who_am_i():
try:
current_user = client.get('/me')
except:
log('Invalid token...', strverbosity=0)
logger.error('Invalid token...')
sys.exit(0)
log('Hello ' + current_user.username + '!', strverbosity=1)
log('', strverbosity=1)
logger.info('Hello ' + current_user.username + '!')
logger.newline()
return current_user
@ -231,7 +231,7 @@ def download_all_user_tracks(user):
this_url = json_data[0]['track']['uri']
except:
this_url = json_data[0]['playlist']['uri']
log('Track n°%d' % (offset))
logger.info('Track n°%d' % (offset))
parse_url(this_url)
url = "https://api.sndcdn.com/e1/users/%s/sounds.json?limit=1&offset=%d&client_id=%s" % (user_id, offset, scdl_client_id)
@ -251,12 +251,12 @@ def download_user_tracks(user):
for track in tracks:
for track in tracks:
count += 1
log("", strverbosity=1)
log('Track n°%d' % (count), strverbosity=1)
logger.newline()
logger.info('Track n°%d' % (count))
download_track(track)
offset += 10
tracks = client.get('/users/' + str(user.id) + '/tracks', limit=10, offset=offset)
log('All users track downloaded!', strverbosity=1)
logger.info('All users track downloaded!')
def download_user_playlists(user):
@ -269,12 +269,12 @@ def download_user_playlists(user):
for playlist in playlists:
for playlist in playlists:
count += 1
log("", strverbosity=1)
log('Playlist n°%d' % (count), strverbosity=1)
logger.newline()
logger.info('Playlist n°%d' % (count))
download_playlist(playlist)
offset += 10
playlists = client.get('/users/' + str(user.id) + '/playlists', limit=10, offset=offset)
log('All users playlists downloaded!', strverbosity=1)
logger.info('All users playlists downloaded!')
def download_user_favorites(user):
@ -287,12 +287,12 @@ def download_user_favorites(user):
for track in favorites:
for track in favorites:
count += 1
log("", strverbosity=1)
log('Favorite n°%d' % (count), strverbosity=1)
logger.newline()
logger.info('Favorite n°%d' % (count))
download_track(track)
offset += 10
favorites = client.get('/users/' + str(user.id) + '/favorites', limit=10, offset=offset)
log('All users favorites downloaded!', strverbosity=1)
logger.info('All users favorites downloaded!')
def download_my_stream():
@ -302,7 +302,7 @@ def download_my_stream():
"""
client = soundcloud.Client(access_token=token, client_id=scdl_client_id)
activities = client.get('/me/activities')
log(activities, strverbosity=3)
logger.debug(activities)
def download_playlist(playlist):
@ -322,7 +322,7 @@ def download_playlist(playlist):
for track_raw in playlist.tracks:
count += 1
mp3_url = get_item(track_raw["permalink_url"])
log('Track n°%d' % (count), strverbosity=1)
logger.info('Track n°%d' % (count))
download_track(mp3_url, playlist.title)
os.chdir('..')
@ -333,18 +333,18 @@ def download_all(tracks):
Download all song of a page
Not recommended
"""
log("NOTE: This will only download the songs of the page.(49 max)", strverbosity=0)
log("I recommend you to provide an user link and a download type.", strverbosity=0)
logger.error("NOTE: This will only download the songs of the page.(49 max)")
logger.error("I recommend you to provide an user link and a download type.")
count = 0
for track in tracks:
count += 1
log("", strverbosity=1)
log('Track n°%d' % (count), strverbosity=1)
logger.newline()
logger.info('Track n°%d' % (count))
download_track(track)
def alternative_download(track):
log('alternative_download used', strverbosity=2)
logger.debug('alternative_download used')
track_id = str(track.id)
url = 'http://api.soundcloud.com/i1/tracks/' + track_id + '/streams?client_id=a3e059563d7fd3372b49b37f00a00bcf'
res = urllib.request.urlopen(url)
@ -353,7 +353,7 @@ def alternative_download(track):
try:
mp3_url = json_data['http_mp3_128_url']
except KeyError:
log('http_mp3_128_url not found in json response, report to developer.', strverbosity=0)
logger.error('http_mp3_128_url not found in json response, report to developer.')
mp3_url = None
return mp3_url
@ -371,16 +371,16 @@ def download_track(track, playlist_name=None):
except HTTPError:
url = alternative_download(track)
else:
log('%s is not streamable...' % (track.title), strverbosity=0)
log('', strverbosity=1)
logger.error('%s is not streamable...' % (track.title))
logger.newline()
return
title = track.title
title = title.encode('utf-8', 'ignore').decode(sys.stdout.encoding)
log("Downloading " + title, strverbosity=1)
logger.info("Downloading " + title)
#filename
if track.downloadable and not arguments["--onlymp3"]:
log('Downloading the orginal file.', strverbosity=1)
logger.info('Downloading the orginal file.')
url = track.download_url + '?client_id=' + scdl_client_id
filename = urllib.request.urlopen(url).info()['Content-Disposition'].split('filename=')[1]
@ -396,7 +396,7 @@ def download_track(track, playlist_name=None):
# Download
if not os.path.isfile(filename):
wget.download(url, filename)
log('', strverbosity=1)
logger.newline()
if '.mp3' in filename:
try:
if playlist_name is None:
@ -404,29 +404,29 @@ def download_track(track, playlist_name=None):
else:
settags(track, filename, playlist_name)
except:
log('Error trying to set the tags...', strverbosity=0)
logger.error('Error trying to set the tags...')
else:
log('This type of audio doesn\'t support tagging...', strverbosity=0)
logger.error('This type of audio doesn\'t support tagging...')
else:
if arguments["-c"]:
log(title + " already Downloaded", strverbosity=1)
log('', strverbosity=1)
logger.info(title + " already Downloaded")
logger.newline()
return
else:
log('', strverbosity=1)
log("Music already exists ! (exiting)", strverbosity=0)
logger.newline()
logger.error("Music already exists ! (exiting)")
sys.exit(0)
log('', strverbosity=1)
log(filename + ' Downloaded.', strverbosity=1)
log('', strverbosity=1)
logger.newline()
logger.info(filename + ' Downloaded.')
logger.newline()
def settags(track, filename, album='Soundcloud'):
"""
Set the tags to the mp3
"""
log("Settings tags...", strverbosity=1)
logger.info("Settings tags...")
user = client.get('/users/' + str(track.user_id), allow_redirects=False)
artwork_url = track.artwork_url
@ -443,7 +443,7 @@ def settags(track, filename, album='Soundcloud'):
if artwork_url is not None:
audio["APIC"] = mutagen.id3.APIC(encoding=3, mime='image/jpeg', type=3, desc='Cover', data=open('/tmp/scdl.jpg', 'rb').read())
else:
log("Artwork can not be set.", strverbosity=0)
logger.error("Artwork can not be set.")
audio.save()
@ -457,8 +457,8 @@ def signal_handler(signal, frame):
if not os.path.isdir(f) and ".tmp" in f:
os.remove(f)
log('')
log('Good bye!')
logger.newline()
logger.info('Good bye!')
sys.exit(0)
if __name__ == "__main__":

28
scdl/utils.py Normal file
View File

@ -0,0 +1,28 @@
# -*- encoding: utf-8 -*-
"""
Copied from https://github.com/davidfischer-ch/pytoolbox/blob/master/pytoolbox/logging.py
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
from termcolor import colored
__all__ = ('ColorizeFilter', )
class ColorizeFilter(logging.Filter):
color_by_level = {
logging.DEBUG: 'yellow',
logging.ERROR: 'red',
logging.INFO: 'white'
}
def filter(self, record):
record.raw_msg = record.msg
color = self.color_by_level.get(record.levelno)
if color:
record.msg = colored(record.msg, color)
return True

View File

@ -1,5 +1,5 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from setuptools import setup, find_packages